ফ্লাস্ক। কখন ব্যবহার করা উচিত?


173

আমি দেখেছি যে gঅনুরোধের প্রসঙ্গটি ফ্ল্যাশক ০.১০ এর অ্যাপ্লিকেশন প্রসঙ্গে চলে যাবে, যা আমাকে এর উদ্দেশ্যযুক্ত ব্যবহার সম্পর্কে বিভ্রান্ত করেছিল g

আমার বোঝাপড়া (ফ্লাস্ক 0.9 এর জন্য) এটি:

  • g অনুরোধ প্রসঙ্গে থাকে, যেমন, অনুরোধগুলি শুরু হয়ে গেলে নতুন করে তৈরি করা হয় এবং এটি শেষ না হওয়া অবধি উপলব্ধ
  • g"অনুরোধ ব্ল্যাকবোর্ড" হিসাবে ব্যবহার করার উদ্দেশ্যে, যেখানে আমি অনুরোধের সময়কালের জন্য প্রাসঙ্গিক জিনিসটি রাখতে পারি (অর্থাত, অনুরোধের শুরুতে একটি পতাকা সেট করে এবং শেষে before_request/ সম্ভবত এটি / after_requestজোড়া) দিয়ে পরিচালনা করতে পারি)
  • অনুরোধ-স্তরের-রাজ্য ধরে রাখার পাশাপাশি, gউত্স ব্যবস্থাপনার জন্য ব্যবহার করা যেতে পারে এবং ব্যবহার করা উচিত, অর্থাত্ ডাটাবেস সংযোগ রাখা ইত্যাদি

এই কোনটি বাক্যটি এখন ফ্লাস্ক ০.০১ এ সত্য নয়? কেউ কি আমাকে পরিবর্তনের কারণগুলি সম্পর্কে আলোচনা করে কোনও উত্সকে নির্দেশ করতে পারেন ? ফ্ল্যাস্ক ০.০০-এ "অনুরোধ ব্ল্যাকবোর্ড" হিসাবে আমার কী ব্যবহার করা উচিত - আমি কি আমার নিজস্ব অ্যাপ্লিকেশন / এক্সটেনশন নির্দিষ্ট থ্রেড-লোকাল প্রক্সি তৈরি করে প্রসঙ্গের স্ট্যাকের দিকে ঠেলাব before_request? অ্যাপ্লিকেশন প্রসঙ্গে রিসোর্স ম্যানেজমেন্টের বিন্দুটি কী, যদি আমার অ্যাপ্লিকেশন দীর্ঘকাল বেঁচে থাকে (অনুরোধের মতো না) এবং এভাবে সংস্থানগুলি কখনই মুক্ত হয় না?


আমি সম্মতি জানাই, এটি একটি দুর্দান্ত বিজোড় পরিবর্তন। আশা করি মিতসুহিকো g০.১০ এ প্রতিস্থাপনের জন্য কিছু প্রকারের অনুরোধ প্রসঙ্গ অবজেক্টটি প্রয়োগ করে , অন্যথায় মনে হচ্ছে প্রচুর কোড কিছু বুদ্ধিমান বাগগুলি বিকাশ করতে শুরু করবে।
আনরোভ

11
এফডাব্লুআইডাব্লু, আরমিন রোনাচার (ফ্লাস্কের লেখক) "অ্যাডভান্সড ফ্লাস্ক প্যাটার্নস" এর সিক্যুয়াল প্রকাশ করেছে যা কীভাবে নতুনটি ব্যবহার করতে হবে তার কয়েকটি উদাহরণ কোড দেখায় flask.gস্পিকারডেক.com
মার্কাস আনটারওয়াদিজিটর

1
এছাড়াও একটি নতুন অনুরোধ প্রসঙ্গে একটি নতুন অ্যাপ্লিকেশন প্রসঙ্গে বোঝায়, সুতরাং এটি কেবল স্বাভাবিক ব্যবহারে ভাল কাজ করা উচিত
রনি

উত্তর:


119

অ্যাডভান্সড ফ্লাস্ক প্যাটার্নস , যেমন মার্কাসের লিঙ্কযুক্ত , g0.10 তে কিছু পরিবর্তন ব্যাখ্যা করেছেন :

  • g এখন অ্যাপ্লিকেশন প্রসঙ্গে বাস।
  • প্রতিটি অনুরোধ পুরানোটি মুছে নতুন অ্যাপ্লিকেশন প্রসঙ্গে ঠেলে দেয় , তাই gএখনও কোডটিতে পরিবর্তন না করে প্রতি অনুরোধের পতাকা সেট করতে ব্যবহার করা যেতে পারে।
  • অ্যাপ্লিকেশন প্রসঙ্গটি কল করার পরে পপ করাteardown_request হয়। (আরমিন এর উপস্থাপনা ব্যাখ্যা এই কারণ ডিবি সংযোগ তৈরি ভালো জিনিস কর্ম যা হয় সেটআপ অনুরোধের জন্য পরিবেশ এবং ভিতরে ঘাঁটা করা উচিত নয় before_requestএবং after_request)

আপনি যে সোর্স কোডের সাথে লিঙ্ক করেছেন, কখন app_ctx is None or app_ctx.app != self.appমিথ্যা হয়, পুরানো অ্যাপ্লিকেশন প্রসঙ্গটি পুনরায় ব্যবহার হয়েছে বলে মনে হয়? এটি ঠিক বলে মনে হচ্ছে না, যেহেতু আবেদনের প্রসঙ্গটি "অনুরোধগুলির মধ্যে ভাগ করা হবে না" ...
নলজোক

2
আপনি কি ধাক্কাapp.app_context() উল্লেখ করছেন ? যদি তা হয় তবে প্রতিটি লক্ষ্যে এটি app_context()নতুন অ্যাপ্লিকেশন প্রসঙ্গে ইনস্ট্যান্ট করে তোলে তা লক্ষ করা উচিত - এটি কোনও প্রসঙ্গে পুনরায় ব্যবহার করে না।
TheY4Kman

1
হ্যাঁ এটি সত্য, কিন্তু যখন app_ctx is not None and app_ctx.app == self.app, app_ctx = self.app.app_context()লাইনটি কার্যকর হয় না ; শুধুমাত্র self._implicit_app_ctx_stack.append(None)এই ক্ষেত্রে কার্যকর করা হয়।
নলজোক

1
ওহ, দুঃখিত, আমি ভুল পড়া! উত্পাদনের সেটিংয়ে থ্রেড (বা গ্রিনলেট) প্রতি কেবল একটি অনুরোধ দেওয়া হয়। কেবল একটিকে RequestContextধাক্কা দেওয়া হয়, সুতরাং কেবল AppContextএকজনকেই ধাক্কা দেওয়া হয়। তবে যদি ডিবাগ মোড চালু থাকে এবং একটি অনুরোধ ব্যর্থ হয় তবে ফ্লাস্ক প্রসঙ্গ সংরক্ষণ করে , তাই এটি ডিবাগারের সাথে ব্যবহার করা যেতে পারেNoneএ সংযুক্ত করা হয় _app_ctx_stack, সুতরাং যখন অনুরোধটি ছিন্ন করা হচ্ছে তখন এটি AppContextঠিক পপ করতে জানে না । একই জিনিস পরীক্ষা ক্লায়েন্টের সাথে ঘটে, যা প্রসঙ্গটি ধরে রাখে, তাই এটি পরিদর্শন করা যায়।
theY4Kman

সুতরাং g এর সুযোগটি প্রতি অনুরোধ (থ্রেড) এবং এটি পরবর্তী অনুরোধে মান ধরে রাখে না।
পরিবর্তনশীল

83

এই থ্রেডের তথ্যের সংযোজন হিসাবে: আমিও এর আচরণে কিছুটা বিভ্রান্ত হয়ে পড়েছি 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

7
শেষ অনুচ্ছেদের কারণে উত্সাহিত, ফ্লাস্কের প্রসঙ্গগুলি প্রথমে বোঝার জন্য যথেষ্ট বিভ্রান্তিকর। নাম থেকে, আপনি অনুভূতিটি পান যে অনুরোধের প্রসঙ্গটি অনুরোধ অনুসারে এবং অ্যাপ্লিকেশন প্রসঙ্গটি কোনও অনুরোধের পরেও উপস্থিত থাকে বা এর আজীবন প্রভাবিত হয় না।
সিমানাচি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.