ফ্লাস্ক.আরুনের চেয়ে ফ্লাস্ক সিএলআইয়ের সুপারিশ করা হয় কেন?


13

ফ্লাস্ক 0.11 এ একটি flaskসি এল এল চালু করা হয়েছিল। ডক্স এবং চেঞ্জলগ উভয়ই এটির প্রস্তাবিত।

বিকাশ সার্ভার ডক্স :

ফ্লাস্ক 0.11 দিয়ে শুরু করে একাধিক বিল্ট-ইন উপায় রয়েছে বিকাশ সার্ভার চালানোর জন্য। সেরাটি হ'ল ফ্লাস্ক কমান্ড লাইন ইউটিলিটি তবে আপনি Flask.run()পদ্ধতিটি ব্যবহার চালিয়ে যেতে পারেন ।

কমান্ড লাইন

বোতল কমান্ড লাইন স্ক্রিপ্ট (কমান্ড লাইন ইন্টারফেস) দৃঢ়ভাবে কিভাবে এটা আবেদন লোড কারণে উন্নয়নের জন্য সুপারিশ করা কারণ এটি একটি উচ্চতর রিলোড অভিজ্ঞতা প্রদান করে করা হয়। প্রাথমিক ব্যবহারটি হ'ল:

$ export FLASK_APP=my_application
$ export FLASK_DEBUG=1
$ flask run

চেঞ্জলগ :

  • ক্লিক করা হয়েছে flaskএবং flask.cliমডিউলটি ক্লিকের সিএলআই সিস্টেমের মাধ্যমে স্থানীয় ডিবাগ সার্ভার শুরু করতে। এটি পুরানো flask.run()পদ্ধতিতে সুপারিশ করা হয়েছে কারণ এটি একটি ভিন্ন ডিজাইনের কারণে দ্রুত এবং আরও নির্ভরযোগ্যভাবে কাজ করে এবং এটি প্রতিস্থাপন করে Flask-Script

এখনও পর্যন্ত আমি এই "উচ্চতর পুনরায় লোডের অভিজ্ঞতা" লক্ষ্য করিনি। আমি কাস্টম স্ক্রিপ্টের উপরে CLI ব্যবহারের বিন্দুটি দেখতে ব্যর্থ হয়েছি।

যদি ব্যবহার করা হয় Flask.run, আমি কেবল একটি অজগর ফাইলটি লিখতে চাই:

#!/usr/bin/env python3
from my_app import app


if __name__ == '__main__':
    app.run(debug=True)

যদি সিএলআই ব্যবহার করে থাকে তবে একটিতে পরিবেশের ভেরিয়েবলগুলি নির্দিষ্ট করতে হবে। সিএলআই ডক্সে বলা হয়েছে যে এটি activateভার্চুয়ালেনভ্রাপার স্ক্রিপ্টে সংহত করা যেতে পারে । ব্যক্তিগতভাবে আমি এটিকে আবেদনের অংশ হিসাবে বিবেচনা করি এবং মনে করি এটি সংস্করণ নিয়ন্ত্রণে থাকা উচিত। হায়রে, একটি শেল স্ক্রিপ্ট দরকার:

#!/usr/bin/env bash
export FLASK_APP=my_app:app
export FLASK_DEBUG=1

flask run

অবশ্যই কোনও উইন্ডোজ ব্যবহারকারীরা সহযোগিতা শুরু করার সাথে সাথে এটি একটি অতিরিক্ত ব্যাটের স্ক্রিপ্টের সাথে উপস্থিত হবে colla

এছাড়াও প্রথম বিকল্পটি বাস্তব অ্যাপ্লিকেশন শুরু করার আগে পাইথনে লিখিত সেটআপের অনুমতি দেয়।

এটি উদাহরণস্বরূপ অনুমতি দেয়

  • পাইথনে কমান্ড লাইন যুক্তি পার্স করতে
  • অ্যাপ্লিকেশন চালানোর আগে লগিং সেটআপ করতে

তারা প্রচার করে বলে মনে হচ্ছে কাস্টম কমান্ড যুক্ত করা সম্ভব। সরল পাইথন স্ক্রিপ্টগুলি লেখার চেয়ে এন্ট্রি পয়েন্টগুলির মাধ্যমে অপ্রত্যাশিতভাবে প্রকাশ করার চেয়ে কেন এটি ভাল তা আমি দেখতে ব্যর্থ।

পাইথন রান স্ক্রিপ্ট ব্যবহার করে একটি কনফিগার করা লগার ব্যবহার করার সময় লগিং আউটপুট উদাহরণ:

$ ./run.py 
   DEBUG 21:51:22 main.py:95) Configured logging
    INFO 21:51:22 _internal.py:87)  * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
    INFO 21:51:22 _internal.py:87)  * Restarting with inotify reloader
   DEBUG 21:51:22 main.py:95) Configured logging
 WARNING 21:51:22 _internal.py:87)  * Debugger is active!
    INFO 21:51:22 _internal.py:87)  * Debugger pin code: 263-225-431
   DEBUG 21:51:25 inotify_buffer.py:61) in-event <InotifyEvent: src_path=b'my_app/main.py', wd=272, mask=IN_MODIFY, cookie=0, name=b'main.py'>
   DEBUG 21:51:25 inotify_buffer.py:61) in-event <InotifyEvent: src_path=b'my_app/main.py', wd=272, mask=IN_MODIFY, cookie=0, name=b'main.py'>
    INFO 21:51:25 _internal.py:87)  * Detected change in 'my_app/main.py', reloading
    INFO 21:51:26 _internal.py:87)  * Restarting with inotify reloader
   DEBUG 21:51:26 main.py:95) Configured logging
 WARNING 21:51:26 _internal.py:87)  * Debugger is active!
    INFO 21:51:26 _internal.py:87)  * Debugger pin code: 263-225-431

CLI: ব্যবহার করে একটি কনফিগার করা লগার ব্যবহার করার সময় লগিং আউটপুট উদাহরণ: লক্ষ্য করুন যে রুট লগার প্রক্রিয়াটিতে প্রারম্ভিক পর্যায়ে সেটআপ করা যায়নি।

$ ./run.sh 
 * Serving Flask app "appsemble.api.main:app"
 * Forcing debug mode on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with inotify reloader
   DEBUG 21:51:33 main.py:95) Configured logging
 * Debugger is active!
 * Debugger pin code: 187-758-498
   DEBUG 21:51:34 main.py:95) Configured logging
   DEBUG 21:51:37 inotify_buffer.py:61) in-event <InotifyEvent: src_path=b'my_app/main.py', wd=272, mask=IN_MODIFY, cookie=0, name=b'main.py'>
   DEBUG 21:51:37 inotify_buffer.py:61) in-event <InotifyEvent: src_path=b'my_app/main.py', wd=272, mask=IN_MODIFY, cookie=0, name=b'main.py'>
 * Detected change in 'my_app/main.py', reloading
    INFO 21:51:37 _internal.py:87)  * Detected change in 'my_app/main.py', reloading
 * Restarting with inotify reloader
    INFO 21:51:38 _internal.py:87)  * Restarting with inotify reloader
 * Debugger is active!
 * Debugger pin code: 187-758-498
   DEBUG 21:51:38 main.py:95) Configured logging

আমার আসল প্রশ্নটি কেবল:

ফ্লাস্ক সিএলআই কেন সুপারিশ করা হয় Flask.run?

উত্তর:


11

বিকাশ সার্ভার ডক্সে, তারা কল করে রান () এবং স্বয়ংক্রিয়ভাবে কোডটি পুনরায় লোড করার ক্ষেত্রে সমস্যা রয়েছে:

এটি সাধারণ ক্ষেত্রে ভাল কাজ করে তবে এটি উন্নয়নের পক্ষে ভাল কাজ করে না এজন্য ফ্লাস্ক 0.11 থেকে ফ্লাস্ক পদ্ধতিটি সুপারিশ করা হয়। এর কারণ হ'ল পুনরায় লোড প্রক্রিয়াটি কীভাবে কাজ করে সেখানে কিছু উদ্ভট পার্শ্ব-প্রতিক্রিয়া রয়েছে (যেমন নির্দিষ্ট কোডটি দু'বার কার্যকর করা, কখনও কখনও বার্তা ছাড়াই ক্র্যাশ করা বা সিনট্যাক্স বা আমদানির ত্রুটি ঘটলে মারা যায়)।

তাদের দাবি সিএলআই এই সমস্যায় ভুগছে না।

এই প্রতিশ্রুতিটি স্পর্শ করার মতো প্রথম প্রতিশ্রুতিটি হ'ল: https://github.com/pallet/flask/commit/3bdb90f06b9d3167320180d4a5055dcd949bf72f

এবং সেখানে আর্মিন রোনাচার লিখেছেন:

এটি খারাপভাবে সমর্থিত হওয়ায় স্বয়ংক্রিয় পুনরায় লোডিং সহ এই ফাংশনটি উন্নয়নের জন্য ব্যবহার করার পরামর্শ দেওয়া হয় না। পরিবর্তে আপনি flaskকমান্ড লাইন স্ক্রিপ্ট runserverসমর্থন ব্যবহার করা উচিত ।

অ্যারন হল দ্বারা উল্লিখিত হিসাবে, দেখে মনে হচ্ছে যে রান () ব্যবহারটি সমস্যাযুক্ত হতে পারে কারণ মডিউলগুলিতে সংজ্ঞায়িত শ্রেণীর উদাহরণ রয়েছে এমন সমস্ত বস্তু পুনরায় স্থাপন করা হবে না এবং যখনই কোনও মডিউল পুনরায় লোড করা হবে, মডিউলগুলি এটি আমদানি করে পাশাপাশি পুনরায় লোড করা হয় না।

এটি সম্পর্কে বিশদটি পাইথন 3-তে পাওয়া যেতে পারে: https://docs.python.org/3/library/importlib.html?hightlight=importlib#module-importlib

এতে বলা হয়েছে:

পাইথনের অন্যান্য সমস্ত অবজেক্টের মতো পুরানো অবজেক্টগুলি কেবল তাদের রেফারেন্স গণনা শূন্যে নেমে যাওয়ার পরে পুনরুদ্ধার করা হয়।

পুরানো অবজেক্টের অন্যান্য রেফারেন্স (যেমন মডিউলটির বাহ্যিক নাম) নতুন বিষয়গুলির উল্লেখ করতে প্রত্যাবর্তনযোগ্য নয় এবং প্রতিটি নাম-স্থানে আপডেট করতে হবে যেখানে এটি পছন্দসই হলে তা ঘটে।

যখন কোনও মডিউল পুনরায় লোড করা হয়, এর অভিধানটি (মডিউলটির গ্লোবাল ভেরিয়েবলগুলি ধারণ করে) ধরে রাখা হয়। নামের পুনরায় সংজ্ঞাগুলি পুরানো সংজ্ঞাগুলিকে ওভাররাইড করবে, সুতরাং এটি সাধারণত কোনও সমস্যা নয়। যদি কোনও মডিউলটির নতুন সংস্করণ কোনও নামটিকে পুরানো সংস্করণ দ্বারা সংজ্ঞায়িত না করে তবে এটি পুরানো সংজ্ঞাটি থেকে যায়।

সুতরাং, একটি নতুন প্রক্রিয়া তৈরি করে এবং পুরানোটিকে হত্যা করে আপনি স্বাভাবিকভাবে সমস্ত অপ্রচলিত রেফারেন্সগুলি মুছে ফেলেন।

এছাড়াও, ফ্লাস্কের সিএলআই 'ক্লিক' মডিউলটি ব্যবহার করে কাস্টম কমান্ড যুক্ত করা খুব সহজ করে তোলে, তবে সবচেয়ে গুরুত্বপূর্ণ, পুনরায় লোডিং বাগ সংশোধন করার পাশাপাশি, সিএলআই অ্যাপ্লিকেশনগুলি চালানোর এবং কাস্টম কমান্ড যুক্ত করার জন্য একটি প্রমিত পদ্ধতি দেয়। এটি খুব ভাল জিনিস বলে মনে হচ্ছে, কারণ এটি একই কাজ করার একাধিক উপায় না করে বিভিন্ন দল এবং অ্যাপ্লিকেশনগুলির মধ্যে ফ্লাস্কের সাথে আরও স্থানান্তরযোগ্য makes

পাইথনের জেন অনুসারে ফ্লাস্ককে আরও তৈরি করার একটি আসল উপায় বলে মনে হচ্ছে:

এটির জন্য একটি - এবং অগ্রাধিকার কেবল একটিই - প্রকাশ্য উপায় থাকতে হবে।


2
এখানে আমি মনে করি আর্মিন "খারাপভাবে সমর্থিত" বলতে যা বোঝায়: পাইথনে, কোনও মডিউল পুনরায় লোড করা মডিউলগুলি যে মডিউলগুলি আমদানি করে তা পুনরায় লোড করে না বা নতুন মডিউল থেকে নতুন মডিউল থেকে পুরানো অবজেক্টের দিকে ইঙ্গিত করা থেকে অন্য মডিউলগুলিতে নাম পুনঃস্থাপন করে না - সুতরাং একই প্রক্রিয়াতে একটি নতুন মডিউল অদলবদল সমস্যাযুক্ত। আপনি যখন কোনও কোড পরিবর্তন করতে চান তখন নতুন প্রক্রিয়া শুরু করার চেয়ে আপনি আরও ভাল।
অ্যারন হল

এখন যেহেতু আপনি এটি উল্লেখ করেছেন, আমি আপনার বর্ণিত আচরণটি স্মরণ করছি, স্পষ্টতার জন্য আপনাকে ধন্যবাদ! আমি সেই অনুযায়ী উত্তরটি সম্পাদনা করব।
মার্টিন জাংব্লুট শ্রেনার

ঠিক আছে, আমাকে উদ্ধৃত করার জন্য আরও 1 :)
অ্যারন হল

অ্যারন হল থেকে সংযোজনটি আমার জন্য এটি স্পষ্ট করে। ধন্যবাদ। :)
রিমকো হাসিং

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