এই থ্রেডের তথ্যের সংযোজন হিসাবে: আমিও এর আচরণে কিছুটা বিভ্রান্ত হয়ে পড়েছি flask.g
, তবে কিছু দ্রুত পরীক্ষা আমাকে এটি পরিষ্কার করতে সহায়তা করেছে। আমি যা চেষ্টা করেছিলাম তা এখানে:
from flask import Flask, g
app = Flask(__name__)
with app.app_context():
print('in app context, before first request context')
print('setting g.foo to abc')
g.foo = 'abc'
print('g.foo should be abc, is: {0}'.format(g.foo))
with app.test_request_context():
print('in first request context')
print('g.foo should be abc, is: {0}'.format(g.foo))
print('setting g.foo to xyz')
g.foo = 'xyz'
print('g.foo should be xyz, is: {0}'.format(g.foo))
print('in app context, after first request context')
print('g.foo should be abc, is: {0}'.format(g.foo))
with app.test_request_context():
print('in second request context')
print('g.foo should be abc, is: {0}'.format(g.foo))
print('setting g.foo to pqr')
g.foo = 'pqr'
print('g.foo should be pqr, is: {0}'.format(g.foo))
print('in app context, after second request context')
print('g.foo should be abc, is: {0}'.format(g.foo))
এবং এটি যে আউটপুট দেয় তা এখানে:
in app context, before first request context
setting g.foo to abc
g.foo should be abc, is: abc
in first request context
g.foo should be abc, is: abc
setting g.foo to xyz
g.foo should be xyz, is: xyz
in app context, after first request context
g.foo should be abc, is: xyz
in second request context
g.foo should be abc, is: xyz
setting g.foo to pqr
g.foo should be pqr, is: pqr
in app context, after second request context
g.foo should be abc, is: pqr
যেমনYYKKman উপরে বলেছে, "প্রতিটি অনুরোধ একটি নতুন অ্যাপ্লিকেশন প্রসঙ্গকে ধাক্কা দেয়"। এবং যেমন ফ্লাস্ক ডকস বলেছেন , অ্যাপ্লিকেশন প্রসঙ্গটি "অনুরোধগুলির মধ্যে ভাগ করা হবে না"। এখন, যা স্পষ্টভাবে বলা হয়নি (যদিও আমি অনুমান করি যে এটি এই বিবৃতিগুলি থেকে বোঝানো হয়েছে), এবং আমার পরীক্ষার মাধ্যমে যা স্পষ্টভাবে বোঝা যায় তা হ'ল আপনি কখনই স্পষ্টভাবে একটি অ্যাপ্লিকেশন প্রসঙ্গে অভ্যন্তরীণ একাধিক অনুরোধ প্রসঙ্গ তৈরি করতে পারবেন না , কারণ flask.g
(এবং সহ) তা করেন না ' টিতে কোনও যাদু নেই যার মাধ্যমে এটি প্রসঙ্গের দুটি পৃথক "স্তরের" সাথে কাজ করে, বিভিন্ন রাজ্য প্রয়োগ এবং অনুরোধের স্তরে স্বতন্ত্রভাবে বিদ্যমান।
কারণ বাস্তবতা হল যে "অ্যাপ্লিকেশন প্রসঙ্গ" সম্ভাব্য বেশ বিভ্রান্তিকর নাম হয় app.app_context()
হয় একটি প্রতি-অনুরোধ প্রসঙ্গ , যেমন ঠিক একই "অনুরোধ প্রসঙ্গ" । এটিকে একটি "অনুরোধ প্রসঙ্গের হালকা" হিসাবে মনে করুন, কেবলমাত্র যখন আপনার কিছু ভেরিয়েবলের প্রয়োজন হয় যেখানে সাধারণত অনুরোধের প্রসঙ্গের প্রয়োজন হয় তবে আপনার কোনও অনুরোধের অবজেক্টে অ্যাক্সেসের প্রয়োজন নেই (উদাহরণস্বরূপ যখন কোনও ব্যাচ ডিবি অপারেশন চলমান থাকে) শেল স্ক্রিপ্ট)। যদি আপনি একাধিক অনুরোধের প্রসঙ্গটি অন্তর্ভুক্ত করার জন্য অ্যাপ্লিকেশন প্রসঙ্গটি চেষ্টা করে এবং প্রসারিত করেন তবে আপনি সমস্যার জন্য বলছেন। সুতরাং উপরের আমার পরীক্ষার পরিবর্তে আপনার পরিবর্তে ফ্লাস্কের প্রসঙ্গে এই জাতীয় কোড লেখা উচিত:
from flask import Flask, g
app = Flask(__name__)
with app.app_context():
print('in app context, before first request context')
print('setting g.foo to abc')
g.foo = 'abc'
print('g.foo should be abc, is: {0}'.format(g.foo))
with app.test_request_context():
print('in first request context')
print('g.foo should be None, is: {0}'.format(g.get('foo')))
print('setting g.foo to xyz')
g.foo = 'xyz'
print('g.foo should be xyz, is: {0}'.format(g.foo))
with app.test_request_context():
print('in second request context')
print('g.foo should be None, is: {0}'.format(g.get('foo')))
print('setting g.foo to pqr')
g.foo = 'pqr'
print('g.foo should be pqr, is: {0}'.format(g.foo))
যা প্রত্যাশিত ফলাফল দেবে:
in app context, before first request context
setting g.foo to abc
g.foo should be abc, is: abc
in first request context
g.foo should be None, is: None
setting g.foo to xyz
g.foo should be xyz, is: xyz
in second request context
g.foo should be None, is: None
setting g.foo to pqr
g.foo should be pqr, is: pqr
g
০.১০ এ প্রতিস্থাপনের জন্য কিছু প্রকারের অনুরোধ প্রসঙ্গ অবজেক্টটি প্রয়োগ করে , অন্যথায় মনে হচ্ছে প্রচুর কোড কিছু বুদ্ধিমান বাগগুলি বিকাশ করতে শুরু করবে।