জ্যাঙ্গো - অনুরোধটি কেন? পোস্ট অবজেক্টটি অপরিবর্তনীয়?


109

শিরোনামটি জিজ্ঞাসা করার সাথে সাথে কেন জ্যাঙ্গো ছেলেরা অনুরোধটি বাস্তবায়নের সিদ্ধান্ত নিয়েছে Pপরিচালিত একটি প্রশ্নের সাথে অবজেক্ট (যা অবশ্যই, পুরো জিনিসটি অপরিবর্তনীয় করে তোলে?)

আমি জানি আপনি পোস্ট ডেটার একটি অনুলিপি তৈরি করে এটিকে বিকৃত করতে পারেন

post = request.POST.copy()

তবে কেন এটি করবেন? অবশ্যই বিষয়টিকে যে কোনও উপায়ে পরিবর্তনযোগ্য হতে দেওয়া সহজ হবে? বা এটি অন্য কোনও কারণেও ব্যবহৃত হচ্ছে যা সমস্যার কারণ হতে পারে?


1
আপনি কেন এটি পরিবর্তনযোগ্য হতে চান? আপনি এটি থেকে ডেটা নিতে পারেন এবং আপনার দৃষ্টিতে এটি ব্যবহার / সংশোধন করতে পারেন। এটিতে ডেটা যুক্ত করে আপনি এমন ছাপ তৈরি করতে পারেন যা request.POSTপ্রকৃতপক্ষে আরও বেশি ডেটা দিয়ে জমা দেওয়া হয়েছে।
সিমন ভিউজার

11
আমি চাই না যে এটি পরিবর্তনযোগ্য হোক। বলার অপেক্ষা রাখে না, আইসক্রিমটি শীতল হতে চাই be আইসক্রিমের ক্ষেত্রে যদিও, এটি ঠান্ডা না হলে এটি গলে যায় এবং তারপরে আপনি একটি বড় অল 'গণ্ডগোল তৈরি করার জন্য নিন্দিত হন। তবে অনুরোধটি দিয়ে.পোস্ট অবজেক্ট ... মানে আমি যদি আমার কোডটি স্ক্রু করতে যাচ্ছি তবে আমি এটিকে স্ক্রু করব। আমি অবগত ছিলাম না যে বিকাশকারীদের POST অবজেক্টগুলিতে ডেটা যুক্ত করা এবং সমস্যাগুলির কারণ রয়েছে, তাই এটি "ফিক্স" টার্গেট করা একটি বিজোড় বিষয় বলে মনে হয়।
ভর্তা

চমৎকার প্রশ্ন; সত্যিই কখনই ভাবিনি।
বুরহান খালিদ

1
এটি আমার জন্য বিক্ষিপ্তভাবে প্রকাশিত হয়েছিল কারণ আমার ক্লায়েন্টটি কখনও কখনও JSON ডেটা (পরিবর্তনযোগ্য) এবং কখনও কখনও URL ফর্ম এনকোডেড (অপরিবর্তনীয়) বার্তা জমা দেয়।
owণফী

2
ইংরেজীবিহীন স্পিকারের জন্য, "মুটিফাই করা" কোনও শব্দ নয় - সঠিক বাক্যাংশটি "আপনি এটিকে পরিবর্তন করতে পারেন" বা "আপনি এটি পরিবর্তন করতে পারেন"। বিকাশকারীদের লিঙ্গ দেওয়ারও দরকার নেই - আপনি "ছেলেরা" না হয়ে "জ্যাঙ্গো দল" বা "কোর ডেভস" ব্যবহার করতে পারেন।
অ্যালেক্সমুলার

উত্তর:


131

এটি কিছুটা রহস্য, তাই না? বেশ কয়েকটি পৃষ্ঠপোষকভাবে প্রশংসনীয় তত্ত্ব তদন্তে ভুল বলে প্রমাণিত হয়েছে:

  1. যাতে POSTঅবজেক্টটি মিউটেশন পদ্ধতিগুলি প্রয়োগ করতে না পারে? নং: POSTঅবজেক্ট জন্যে django.http.QueryDictবর্গ যা কার্যকরী সহ পরিব্যক্তি পদ্ধতির একটি পূর্ণ সেট, __setitem__, __delitem__, popএবং clear। আপনি কোনও রূপান্তর পদ্ধতিতে কল করার সময় এটি একটি পতাকা পরীক্ষা করে অপরিবর্তনীয়তা প্রয়োগ করে। এবং আপনি যখন copyপদ্ধতিটি কল করবেন তখন আপনি QueryDictপরিবর্তনীয় পতাকাটি চালু করে অন্য একটি উদাহরণ পাবেন ।

  2. কর্মক্ষমতা উন্নতির জন্য? না: QueryDictপরিবর্তনীয় পতাকাটি বন্ধ করা হলে শ্রেণি কোনও কার্যকারিতা সুবিধা লাভ করে না।

  3. যাতে POSTশব্দটি অভিধান কী হিসাবে ব্যবহার করা যেতে পারে? না: QueryDictঅবজেক্টগুলি হ্যাশযোগ্য নয়।

  4. যাতে এখানে দাবি করা হয়েছেPOST , যাতে অলসভাবে ডেটা তৈরি করা যায় (পুরো প্রতিক্রিয়াটি পড়ার প্রতিশ্রুতি না দিয়ে) ? আমি কোডে এই কোন প্রমাণ দেখুন: যতদূর আমি বলতে পারেন, প্রতিক্রিয়া গোটা সবসময় পড়া হয় পারেন সরাসরি , বা মাধ্যমে জন্য প্রতিক্রিয়া নেই।MultiPartParsermultipart

  5. প্রোগ্রামিং ত্রুটি থেকে রক্ষা করতে? আমি এই দাবী করে দেখেছি, তবে এই ত্রুটিগুলি কী, এবং অপরিবর্তনীয়তা কীভাবে আপনাকে তাদের বিরুদ্ধে সুরক্ষা দেয় তার কোনও ভাল ব্যাখ্যা আমি কখনও দেখিনি।

যে কোনও ক্ষেত্রে, সর্বদাPOST পরিবর্তনযোগ্য নয় : যখন প্রতিক্রিয়া হয় multipartতখন POSTপরিবর্তনযোগ্য। এটি আপনার মনে হতে পারে এমন বেশিরভাগ তত্ত্বগুলিতে কিবোশকে রাখবে বলে মনে হয়। (যদি না এই আচরণটি তদারকি না করা হয়))

সংক্ষেপে, অ- অনুরোধগুলির জন্য অবজেক্টটি অপরিবর্তনীয় হওয়ার জন্য আমি জ্যাঙ্গোতে কোনও স্পষ্ট যুক্তি দেখতে পাচ্ছি নাPOSTmultipart


জাজানোতে আমি এরকম প্রচুর রুক্ষ প্রান্ত লক্ষ্য করেছি। যদিও কারও কারও কাছে বোধগম্য হওয়া উচিত।
ড্যান পাসারো

2
আমি এটি একটি অন্য স্ট্যাক উত্তরে খুঁজে পেয়েছি: "এবং এটি অবশ্যই অপরিবর্তনীয় হতে হবে যাতে এটি অলসভাবে তৈরি করা যায় The অনুলিপি সমস্ত পোস্টের ডেটা পেতে বাধ্য করে। সার্ভারটি যুক্তিসঙ্গতভাবে ভালভাবে কাজ করতে পারে, যদি এটি পরিবর্তনযোগ্য না হয় তবে এটি সহায়ক ""
সিউক্স

12
আপনি যখন মন্তব্য সম্পর্কে মন্তব্য করার ইচ্ছা করছেন তখন সিয়োকস আপনার কোনও উত্তর অলসভাবে পড়া উচিত নয়। ;-)
ক্রিস ওয়েসলিং

3
@ ক্রিসওয়েসেলিং আমি দেখছি আপনি সেখানে কী করেছেন
সিউক্স

2
আরও ভাল, আমি যখন জাঙ্গো পরীক্ষার ক্লায়েন্টকে মামলা করার জন্য অনুরোধটি প্রেরণ করি তখন ক্যোয়ারডিক্টটি পরিবর্তনযোগ্য।
ব্যবহারকারী 1158559

82

যদি অনুরোধটি জ্যাঙ্গো formজমা দেওয়ার ফলাফল ছিল , তবে পোস্টের immutableপক্ষে ফর্ম জমা দেওয়ার এবং ফর্মের বৈধতার মধ্যে ডেটার অখণ্ডতা নিশ্চিত করা যুক্তিসঙ্গত । তবে, যদি জ্যাঙ্গো জমা দেওয়ার মাধ্যমে অনুরোধটি না পাঠানো হয় তবে কোনও ফর্মের বৈধতা নেই বলেই পোস্টটি রয়েছে isformmutable

আপনি সর্বদা এর মতো কিছু করতে পারেন: ( @ লিও-দ্য ম্যানিকের মন্তব্য অনুসারে )

#  .....
mutable = request.POST._mutable
request.POST._mutable = True
request.POST['some_data'] = 'test data'
request.POST._mutable = mutable
# ......

3
@ জোশক: আমি অনুমান করি যে মন্তব্যকারী পোস্টারটিকে পরিবর্তনীয় করে তুলতে চেয়েছিল এবং এই উত্তরে কোড স্নিপেট সাহায্য করেছিল।
শ্রীভাত্সআর

আপনি নতুন কী, মান যুক্ত করতে পারেন তবে আপনি বিদ্যমান ডেটা পরিবর্তন করতে পারবেন না।
বংশীধর মুগুল্লা

খুশী হলাম। এবং আমি নিশ্চিত যে এই কোডটি যে কেউ ব্যবহার করবে সে জানে যে সে কী করছে।
জন প্যাং

পছন্দ করেছেন এমনকি মোছার অনুমতি রয়েছে।
অ্যান্টনি হ্যাচকিন্স

5

আপডেট :

গ্যারেথ রিস ঠিক ছিল যে 1 এবং 3 পয়েন্ট এ ক্ষেত্রে বৈধ ছিল না। যদিও আমি মনে করি 2 এবং 4 পয়েন্টটি এখনও বৈধ, সুতরাং আমি এইগুলি এখানে রেখে দেব।

(আমি লক্ষ্য করেছি যে request.POSTপিরামিড (পাইলন) এবং জ্যাঙ্গো উভয়েরই কোনও একরকম রূপ MultiDict। তাই সম্ভবত এটি request.POSTঅপরিবর্তনীয় তৈরির চেয়ে আরও সাধারণ অভ্যাস ))


আমি জ্যাঙ্গো ছেলেদের পক্ষে কথা বলতে পারি না, যদিও আমার কাছে মনে হয় যে এটি এর কয়েকটি কারণে হতে পারে:

  1. পারফরমেন্স । অপরিবর্তনীয় বস্তুগুলি পরিবর্তনযোগ্যগুলির চেয়ে "দ্রুত" যাতে তারা যথেষ্ট পরিমাণে অনুকূলিতকরণের অনুমতি দেয়। একটি অবজেক্টের অপরিবর্তনীয় মানে হল যে আমরা এটি তৈরির সময়ে স্থান বরাদ্দ করতে পারি , এবং স্থানের প্রয়োজনীয়তা পরিবর্তন হচ্ছে না। এটিতে অনুলিপি দক্ষতা এবং তুলনা দক্ষতার মতো জিনিস রয়েছে। সম্পাদনা করুন :QueryDictগ্যারেথ রিস যেমন উল্লেখ করেছেনতেমন এটি নয়।
  2. এর ক্ষেত্রে request.POST, মনে হচ্ছে সার্ভারের কোনও ক্রিয়াকলাপের অনুরোধের ডেটা পরিবর্তন করার দরকার নেই । এবং তাই অপরিবর্তনীয় বস্তুগুলি আরও উপযুক্ত, তাদের উল্লেখযোগ্য পারফরমেন্স সুবিধা রয়েছে তা উল্লেখ না করে।
  3. অপরিবর্তনীয় বস্তুগুলি dictকী হিসাবে ব্যবহার করা যেতে পারে , যা আমি মনে করি জাজানোতে কোথাও খুব কার্যকর হতে পারে .. সম্পাদনা : আমার ভুল, অপরিবর্তনীয় সরাসরি হ্যাশেবলকে বোঝায় না ; হ্যাশযোগ্য বস্তুগুলি তবে সাধারণত অপরিবর্তনীয়
  4. যখন আপনি কাছাকাছি চলে যান request.POST(বিশেষত তৃতীয় পক্ষের প্লাগইনগুলিতে এবং বাইরে), আপনি আশা করতে পারেন যে ব্যবহারকারীর কাছ থেকে এই অনুরোধটি অপরিবর্তিত থাকবে।

কোনওভাবে এই কারণগুলি কি "পরিবর্তনীয় বনাম পরিবর্তনীয়?" এর জেনেরিক উত্তর? প্রশ্ন। আমি নিশ্চিত যে জ্যাঙ্গো ক্ষেত্রে উপরের তুলনায় অনেক বেশি নকশা বিবেচনা রয়েছে।


1
শেষ কেসটি সত্যই গুরুত্বপূর্ণ। এটি সত্যিকারের সুরক্ষা সম্পর্কে। এজন্য জাঙ্গো sessionsরাজ্যগুলির মধ্যে ডেটা পাওয়ার এবং সংশোধন করার স্বল্প লাইভ উপায় provides
সিপ্পলিয়নার

2
আপনার পয়েন্ট (1) এক্ষেত্রে উত্তর হতে পারে না, কারণ POSTএটি একটি QueryDictবস্তু এবং এই বিষয়গুলি অপরিবর্তনীয় হয়ে কোনও পারফরম্যান্স সুবিধা পায় না। এবং আপনার পয়েন্ট (3) এর উত্তর হতে পারে না, কারণ QueryDictঅবজেক্টগুলি হ্যাশযোগ্য নয়, এবং তাই অভিধান কী হিসাবে ব্যবহার করতে পারে না।
গ্যারেথ রিস

@ গ্যারেথরিজ এগুলি দেখানোর জন্য ধন্যবাদ। সত্যিই আমি ভুল ছিল। এগুলি সংশোধন করার জন্য আমি আমার উত্তর আপডেট করেছি। আমি QueryDictজবাব দেওয়ার আগে আমার আরও মনোযোগ দেওয়া উচিত ছিল ।
কেজেড

7
@ সিপ্পলিয়ারার সুরক্ষা পয়েন্টটি মোটা মনে হচ্ছে, যেমনrequests.POST._mutable = True; requests.POST['foo'] = 'bar'; request.POST._mutable = False
ড্যান পাসারো

4

আমি এটি ডিফল্টরূপে অপরিবর্তনীয় হতে পছন্দ করি। যেমনটি উল্লেখ করা হয়েছে আপনি প্রয়োজনে এটিকে পরিবর্তন করতে পারবেন তবে আপনাকে অবশ্যই এটি সম্পর্কে স্পষ্ট থাকতে হবে। এটি 'আমি জানি যে আমি আমার ফর্মটি ডিবাগ করতে একটি দুঃস্বপ্ন করতে পারি তবে আমি জানি এখন আমি কী করছি' '


2

আমি এটি স্ট্যাক উত্তর https://stackoverflow.com/a/2339963 এ একটি মন্তব্যে পেয়েছি

এবং এটি অবশ্যই অপরিবর্তনীয় হতে হবে যাতে এটি অলসভাবে তৈরি করা যায়। অনুলিপি সমস্ত পোস্টের ডেটা পাওয়ার জন্য জোর করে। অনুলিপি না হওয়া পর্যন্ত, এটি সমস্তই আনা যাবে না। তদ্ব্যতীত, বহু-থ্রেডযুক্ত ডাব্লুএসজিআই সার্ভারের পক্ষে যুক্তিসঙ্গতভাবে ভালভাবে কাজ করার জন্য, এটি যদি পরিবর্তনীয় না হয় তবে এটি সহায়ক helpful


1

দয়া করে নোট করুন: multipartঅনুরোধটি জ্যাঙ্গো 1.11 https://github.com/django/django/blob/stable/1.11.x/django/http/multpartparser.py#L292 সাল থেকে অপরিবর্তনীয়

তারা পূর্ববর্তী সংস্করণে পরিবর্তনযোগ্য ছিল।


এছাড়াও জ্যাঙ্গো 1.11 উল্লেখ রিলিজ নোট
ডিজেভিজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.