টেমপ্লেট ফাইল পরিবর্তন হলে ফ্লাস্ক অ্যাপ পুনরায় লোড করুন


96

ডিফল্টরূপে, বিল্ট-ইন সার্ভার ( Flask.run) ব্যবহার করে ফ্লাস্ক অ্যাপ্লিকেশন চালানোর সময় , এটি তার পাইথন ফাইলগুলি পর্যবেক্ষণ করে এবং কোডটি পরিবর্তিত হলে অ্যাপ্লিকেশনটি স্বয়ংক্রিয়ভাবে পুনরায় লোড করে:

* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader

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

সুতরাং, টেমপ্লেট ডিরেক্টরিতে ফ্লাস্ক মনিটরের ফাইলগুলি রাখার কোনও উপায় আছে , বা ফ্রেমওয়ার্কের উত্সটিতে ডাইভিংয়ের প্রয়োজন আছে কি?

সম্পাদনা : আমি উবুন্টু 10.10 ব্যবহার করছি। অন্য কোন প্ল্যাটফর্মে সত্যিই চেষ্টা করে দেখেনি।


আরও তদন্ত পর, আমি টেমপ্লেট প্রকৃতপক্ষে যে পরিবর্তন আবিষ্কৃত হয়েছে করছে রিয়েল টাইমে আপডেট, অ্যাপ্লিকেশন নিজেই পুনরায় লোড ছাড়াই। যাইহোক, এই সেই টেমপ্লেট যে প্রেরণ করা হয় প্রযোজ্য বলে মনে হয় flask.render_template

তবে এটি ঘটে যায় যে আমার অ্যাপ্লিকেশনটিতে, আমি জিনজা টেম্পলেটগুলিতে ব্যবহার করি এমন অনেকগুলি পুনরায় ব্যবহারযোগ্য, প্যারাম্যাট্রাইজড উপাদান রয়েছে। সেগুলি {% macro %}গুলি হিসাবে বাস্তবায়িত হয় , নিবেদিত "মডিউলগুলি" এ থাকে এবং {% import %}প্রকৃত পৃষ্ঠায় রূপান্তরিত হয়। সমস্ত দুর্দান্ত এবং DRY ... এই আমদানি করা টেম্পলেটগুলি দৃশ্যত কখনও কখনও সংশোধনগুলির জন্য যাচাই করা হয় না, কারণ এগুলি একেবারেই পাস হয় না render_template

(কৌতূহলজনকভাবে, টেমপ্লেটগুলির মাধ্যমে এটি ঘটেছিল না for {% extends %}তবে {% include %}সত্যিই আমি সেগুলি ব্যবহার করি না বলে আমার কোনও ধারণা নেই))

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


4
অ্যাপটি DEBUG = এর সাথে কনফিগার করা আছে তা নিশ্চিত করুন = সত্য, দস্তাবেজগুলি দেখুন
অ্যালেক্স মোরেগা

উত্তর:


67

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

টেমপ্লেটগুলি (বা অন্য কোনও ফাইল) পরিবর্তিত হয়ে গেলে আপনার অ্যাপ্লিকেশনটি পুনরায় লোড করতে আপনি extra_filesযুক্তিটি পাস করতে পারেনFlask().run() , আপনি দেখার জন্য ফাইলনামের সংকলনটিতে : এই ফাইলগুলিতে যে কোনও পরিবর্তন পুনরায় লোডারকে ট্রিগার করবে।

উদাহরণ:

from os import path, walk

extra_dirs = ['directory/to/watch',]
extra_files = extra_dirs[:]
for extra_dir in extra_dirs:
    for dirname, dirs, files in walk(extra_dir):
        for filename in files:
            filename = path.join(dirname, filename)
            if path.isfile(filename):
                extra_files.append(filename)
app.run(extra_files=extra_files)

এখানে দেখুন: http://werkzeug.pocoo.org/docs/0.10/serving/?hightlight=run_simple#werkzeug.serving.run_simple


ভাল জিনিস! আমি স্বীকার করি যে ডকুমেন্টেশনের লিঙ্কটি মিস করেছি Flask.runযার ফলে ওয়ার্কজেগ ডক্স হয়। তবে এই নির্দিষ্ট বিকল্পটি কমপক্ষে ফ্লাস্ক ডক্সে উল্লেখ করার জন্য যথেষ্ট দরকারী বলে মনে হচ্ছে।
Xion

যদি কারও মধ্যে কোনও ত্রুটির মুখোমুখি হয় যা বলে No such file or directory, আপেক্ষিক পথটি এখানে ব্যবহারের চেষ্টা করুন:extra_dirs = ['./directory/to/watch',]
কেভিন

4
আপনিও যদি কোনটি সম্পর্কে বিভ্রান্ত হন তবে pathতা os.path। ভেবেছিলাম এটি উল্লেখযোগ্য
বিজেসাস

জন্য পরিবর্তন স্ট্যাটিক ফাইল দেখতে পর স্বয়ংক্রিয় পুনরায় লোড এই
সিমানাচি

4
flask runকমান্ড লাইন থেকে চলাকালীন অতিরিক্ত ফাইলগুলি কীভাবে নির্দিষ্ট করবেন ?
মাইকেল শ্যাপার 19 '

147

তুমি ব্যবহার করতে পার

TEMPLATES_AUTO_RELOAD = True

Http://flask.pocoo.org/docs/1.0/config/ থেকে

টেমপ্লেট উত্সের পরিবর্তনগুলির জন্য যাচাই করে তা স্বয়ংক্রিয়ভাবে পুনরায় লোড করা যায় কিনা। ডিফল্টরূপে মানটি কোনওটি নয় যার অর্থ ফ্লাস্ক মূল ফাইলটি কেবল ডিবাগ মোডে পরীক্ষা করে।


11
এই সমাধানটি প্রচলিত, ডকুমেন্টেশন দ্বারা সমর্থিত, বোঝা সহজ এবং বাস্তবায়নের পক্ষে সহজ। এটা গ্রহণ করা উচিত!
ক্যারলিন কনওয়ে

আমি এই উত্তরটি চেষ্টা করেছিলাম তবে কেবল একবার কাজ করি, অন্য রিফ্রেশের পরে এটি কাজ করবে না
medev21

4
অন্যের জন্য কেবল একটি নোট: আমি করেছি app.config['TEMPLATES_AUTO_RELOAD'] = Trueএবং কোনও কারণে টেমপ্লেট পরিবর্তিত হলে সার্ভারটি স্বয়ংক্রিয়-পুনঃসূচনা দেখার আশা করা হয়েছিল, যেমন এটি ডিবাগ মোডে হয়। এটি পুনরায় আরম্ভ হয় না, তবে এটি যে টেম্পলেটটি সরবরাহ করে তা আপডেট করে।
cs01

4
এটি 0.12 এর জন্য কাজ করবে না এমন কোনও কারণ? বা অন্য কোনও সেটিং যা এটি সঠিকভাবে সেট করা থেকে বাধা দিতে পারে?
ব্যবহারকারী 805981

4
@ ফেডারার এটি আগের মতো কাজ করছে বলে মনে হচ্ছে না ... এর আগে এটি টেমপ্লেট ডিরেক্টরি এবং উপ ডিরেক্টরিগুলির পরিবর্তনগুলি সনাক্ত করে এটি সার্ভারটি পুনরায় লোড করত .... এটি কি 0.12-এ নতুন কিছু that বদলে গেল?
ব্যবহারকারী 805981

55

আপনি যখন jinjaটেমপ্লেটগুলি নিয়ে কাজ করছেন তখন আপনাকে কিছু পরামিতি সেট করতে হবে। পাইথন 3 এর ক্ষেত্রে আমি নিম্নলিখিত কোড দিয়ে সমাধান করেছি:

if __name__ == '__main__':
    app.jinja_env.auto_reload = True
    app.config['TEMPLATES_AUTO_RELOAD'] = True
    app.run(debug=True, host='0.0.0.0')

4
আপনি আমার বিচক্ষণতা বাঁচিয়েছেন। ধন্যবাদ.
নস্টালজ.ইও

আমারও সেই সমস্যাটি নিয়ে খুব কষ্ট হচ্ছিল। আমি সাহায্য করতে পেরে আনন্দিত;)
সিলগন

এটি আমার জন্য ফ্লাস্ক 1.0.2 এ কাজ করছে, তবে আমার কাছে হোস্ট যুক্তি নেই।
এনরিকো বোরবা

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

@ সিলগন হ্যাঁ আমি বুঝতে পারি। আমি মূলত ফ্লাস্ক সংস্করণ 1.0.2 এর একটি নতুন ইনস্টলটিতে কী কাজ করেছে সে সম্পর্কে পরিষ্কার হতে মন্তব্য করতে যোগ করছি
এনরিকো বোর্বা


10

আসলে আমার জন্য TEMPLATES_AUTO_RELOAD = Trueকাজ করে না (0.12 সংস্করণ)। আমি জিনজা 2 এবং আমি যা করেছি তা ব্যবহার করি:

  1. ফাংশন তৈরি করুন before_request

    def before_request():
        app.jinja_env.cache = {}
    
  2. এটি প্রয়োগ করুন

    app.before_request(before_request)
    
  3. এটাই.


4
গ্যারেট, আমি এই বিকল্পগুলি ছাড়া পরীক্ষা করিনি।
dikkini

৩ য় পদক্ষেপটি আসলেই প্রয়োজনীয় নয়, এটি আমার পক্ষে খুব ভালভাবে কাজ করেছে।
রিকার্ডো রিবেইরো

4

আমার জন্য যা কাজ করেছে তা কেবল এটি যুক্ত করছে:

@app.before_request
def before_request():
    # When you import jinja2 macros, they get cached which is annoying for local
    # development, so wipe the cache every request.
    if 'localhost' in request.host_url or '0.0.0.0' in request.host_url:
        app.jinja_env.cache = {}

( @ ডিকিনীর উত্তর থেকে নেওয়া )


2

উইন্ডোজে ফ্লাস্কের সর্বশেষতম সংস্করণ ব্যবহার করে রান কমান্ড এবং ডিবাগ সেটটি সত্য হিসাবে ব্যবহার করে; টেমপ্লেটগুলির পরিবর্তনগুলি কার্যকর করার জন্য ফ্লাস্ককে পুনরায় সেট করার দরকার নেই। এটি কোনও ক্যাশে হচ্ছে না তা নিশ্চিত করতে শিফ্ট + এফ 5 (বা শিফট প্লাস পুনরায় লোড বোতাম) ব্যবহার করে দেখুন।


2

জুন 2019 হিসাবে আপডেট হয়েছে:

বোতল CLI একটি dev সার্ভারটি চালানোর জন্য app.run () উপর বাঞ্ছনীয়, আমরা CLI তারপর গৃহীত সমাধান ব্যবহার করা যাবে না ব্যবহার করতে চান তাই যদি।

এই লেখার মতো ফ্লাস্কের (1.1) বিকাশের সংস্করণ ব্যবহার করা আমাদের একটি পরিবেশের পরিবর্তনশীল FLASK_RUN_EXTRA_FILES সেট করতে দেয় যা কার্যকরভাবে গৃহীত উত্তরের মতো একই কাজ করে।

দেখুন এই GitHub ইস্যু

ব্যবহারের উদাহরণ:

export FLASK_RUN_EXTRA_FILES="app/templates/index.html"
flask run

লিনাক্সে। একাধিক অতিরিক্ত ফাইল নির্দিষ্ট করতে, কলোন দিয়ে পৃথক ফাইল পাথ। , যেমন

export FLASK_RUN_EXTRA_FILES="app/templates/index.html:app/templates/other.html"

সিএলআই --extra-filesফ্লাস্ক ১.১ হিসাবে একটি যুক্তি সমর্থন করে ।


গৌণ আপডেট। 'ফ্লাস্ক সিএলআই'র লিঙ্কটির বর্তমান সংস্করণে আপডেট দরকার। flask.palletpro پروژې.com/en/1.1.x/cli অন্যথায় ধন্যবাদ :)
কোডিং ম্যাটার


1

টেমপ্লেটগুলি স্বয়ংক্রিয়ভাবে পুনরায় লোড হয়, ctrl+f5ওয়েবপৃষ্ঠাটি রিফ্রেশ করার জন্য কেন করা হয় না , কারণ ওয়েব ব্রাউজারগুলি সাধারণত ক্যাশে সংরক্ষণ করে।

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