แอปพลิเคชันหลามขวดอัตโนมัติโหลดใหม่เมื่อมีการเปลี่ยนแปลงรหัส


205

ฉันกำลังตรวจสอบวิธีการพัฒนาแอปพลิเคชันเว็บที่เหมาะสมกับ Python เพราะผมไม่ต้องการบางโครงสร้างสูงเพื่อที่จะได้รับในทางของฉันตัวเลือกของฉันลดลงเมื่อมีน้ำหนักเบากรอบขวด เวลาจะบอกได้ว่านี่เป็นตัวเลือกที่ถูกต้องหรือไม่

ดังนั้นตอนนี้ฉันได้ตั้งค่าเซิร์ฟเวอร์ Apache ด้วย mod_wsgi และเว็บไซต์ทดสอบของฉันทำงานได้ดี อย่างไรก็ตามฉันต้องการเร่งขั้นตอนการพัฒนาโดยทำให้ไซต์โหลดซ้ำอัตโนมัติเมื่อมีการเปลี่ยนแปลงในไฟล์ py หรือไฟล์เทมเพลตที่ฉันทำ ฉันเห็นว่าการเปลี่ยนแปลงใด ๆ ในไฟล์. wsgi ของไซต์ทำให้เกิดการโหลดซ้ำ (แม้ว่าจะไม่มี WSGIScriptReloading On ในไฟล์ apache config) แต่ฉันก็ยังต้องแยงมันเอง (เช่นแทรก linebreak พิเศษ, บันทึก) มีวิธีใดบ้างที่จะทำให้เกิดการรีโหลดเมื่อฉันแก้ไขไฟล์ py บางส่วนของแอพ หรือฉันคาดว่าจะใช้ IDE ที่รีเฟรชไฟล์. wsgi สำหรับฉัน

คำตอบ:


233

วิธีที่แนะนำในปัจจุบันคือการใช้flaskยูทิลิตีบรรทัดคำสั่ง

https://flask.palletsprojects.com/en/1.1.x/quickstart/#debug-mode

ตัวอย่าง:

$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run

หรือในคำสั่งเดียว:

$ FLASK_APP=main.py FLASK_ENV=development flask run

หากคุณต้องการพอร์ตที่แตกต่างจากตัวเลือก5000เพิ่ม( ) เริ่มต้น--port

ตัวอย่าง:

$ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080

ตัวเลือกเพิ่มเติมสามารถใช้ได้กับ:

$ flask run --help

3
หรือ pyvenv ใน python3.5 flask runก็ใช้งานได้เช่นกันเนื่องจากเมื่อคุณpip install flaskไฟล์ปฏิบัติการขวดจะติดตั้งในvenv/bin/โฟลเดอร์เช่นกัน
TonyTony

นี่เป็นโซลูชันง่ายๆที่สามารถแปลเป็น Docker เพื่อวัตถุประสงค์ในการพัฒนา หนึ่งสามารถดูวิธีการแก้ปัญหาแบบเดียวกันนี้ที่นี่

1
ทำงานได้ดีตามปกติ แต่ดูเหมือนว่าจะใช้งานไม่ได้กับ Ubuntu ที่มีรหัสในพาร์ติชัน NTFS ไม่ใช่ปัญหาของรหัส แต่กระติกน้ำดูเหมือนจะไม่รู้จักการเปลี่ยนแปลงในการตั้งค่า
citynorman

211

หากคุณกำลังพูดถึงสภาพแวดล้อมการทดสอบ / dev แล้วเพียงใช้ตัวเลือกการแก้ปัญหา มันจะรีโหลดแอปขวดอัตโนมัติโดยอัตโนมัติเมื่อมีการเปลี่ยนรหัสเกิดขึ้น

app.run(debug=True)

หรือจากเปลือก:

$ export FLASK_DEBUG=1
$ flask run

http://flask.pocoo.org/docs/quickstart/#debug-mode


6
สิ่งนี้จะทำงานได้ก็ต่อเมื่อคุณเรียกใช้ไซต์ผ่านเซิร์ฟเวอร์การพัฒนาในตัว แต่ไม่ใช่เมื่อเรียกใช้ผ่าน wsgi บน Apache และฉันก็ไม่ได้ยืนยันว่าฉันต้องใช้มันกับ Apache จริงๆดังนั้นบางทีสิ่งที่คุณแนะนำคือวิธีที่ถูกต้องที่จะทำ
ศุกร์ที่

4
แก้ไข. ในสภาพแวดล้อมแบบ dev เซิร์ฟเวอร์ในตัวใช้งานได้ดีจริง ๆ และคุณไม่จำเป็นต้องบูรณาการล้อสำหรับการโหลดแอปใหม่ ฉันขอแนะนำอย่างยิ่งให้คุณใช้เซิร์ฟเวอร์ในตัวสำหรับการพัฒนา วัตถุประสงค์ ในการผลิตต่อไปคุณไม่ต้องการโหลดแอปใหม่อัตโนมัติทุกครั้งที่มีการเปลี่ยนรหัส
codegeek

44

ในสภาพแวดล้อมการทดสอบ / การพัฒนา

ดีบักเกอร์ werkzeug มีฟังก์ชั่น 'โหลดอัตโนมัติ' ที่สามารถเปิดใช้งานได้โดยทำอย่างใดอย่างหนึ่งต่อไปนี้:

app.run(debug=True)

หรือ

app.debug = True

คุณยังสามารถใช้ไฟล์กำหนดค่าแยกต่างหากเพื่อจัดการการตั้งค่าทั้งหมดของคุณหากคุณต้องการ ตัวอย่างเช่นฉันใช้ 'settings.py' พร้อมตัวเลือก 'DEBUG = True' การนำเข้าไฟล์นี้ก็ง่ายเช่นกัน

app.config.from_object('application.settings')

อย่างไรก็ตามนี่ไม่เหมาะสำหรับสภาพแวดล้อมการผลิต

สภาพแวดล้อมการผลิต

ส่วนตัวฉันเลือก Nginx + uWSGI ผ่าน Apache + mod_wsgi ด้วยเหตุผลด้านประสิทธิภาพเพียงเล็กน้อย แต่ก็มีตัวเลือกการกำหนดค่าด้วย สัมผัสโหลดตัวเลือกที่ช่วยให้คุณสามารถระบุไฟล์ / โฟลเดอร์ที่จะทำให้แอปพลิเค uWSGI ที่จะโหลดแอพพลิเคขวดของคุณนำไปใช้ใหม่

ตัวอย่างเช่นสคริปต์อัปเดตของคุณจะดึงการเปลี่ยนแปลงล่าสุดของคุณลงและแตะที่ไฟล์ 'reload_me.txt' สคริปต์ uWSGI ini ของคุณ (ซึ่งกำกับโดย Supervisord - อย่างชัดเจน) มีบรรทัดนี้อยู่ที่ใดที่หนึ่ง:

touch-reload = '/opt/virtual_environments/application/reload_me.txt'

ฉันหวังว่านี่จะช่วยได้!


1
ขอบคุณสำหรับเคล็ดลับที่ดี ฉันทำให้มันง่ายขึ้นเล็กน้อย สร้างสคริปต์ทุบตีที่สัมผัสกับตัวเองเมื่อดำเนินการ ดังนั้นคุณจะต้องเปิดมันเมื่อคุณต้องการโหลดซ้ำ วิธีแก้ปัญหาของฉัน: # touch_me_and_reload.sh แตะ $ 0
Jabba

@Ewan บรรทัด touch-reload ควรอยู่ที่ไหน ส่วน [โปรแกรม: uwsig] หรือส่วน [supervisord] หรือไม่
user805981

@ user805981- ใช่.iniไฟล์คอนฟิกูเรชัน uwsgi แยกต่างหาก หากคุณอ่านเอกสารเกี่ยวกับ "touch-reload" เอกสารนั้นอยู่ใน uWSGI ไม่ใช่หัวหน้างานการกำหนดค่า
Ewan

ขอบคุณสำหรับสิ่งนี้. app.run(debug=True)ล้มเหลว แต่การตั้งค่าตัวแปรสภาพแวดล้อมทำงานได้
Ari

23

หากคุณกำลังใช้งานโดยใช้ uwsgi ดูที่ตัวเลือกการโหลดอัตโนมัติ python:

uwsgi --py-autoreload 1

ตัวอย่าง uwsgi-dev-example.ini:

[uwsgi]
socket = 127.0.0.1:5000
master = true
virtualenv = /Users/xxxx/.virtualenvs/sites_env
chdir = /Users/xxx/site_root
module = site_module:register_debug_server()
callable = app
uid = myuser
chmod-socket = 660
log-date = true
workers = 1
py-autoreload = 1

site_root / __ init__.py

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

    app = Flask(__name__)
    app.debug = True
    app = DebuggedApplication(app, evalex=True)
    return app

จากนั้นเรียกใช้:

uwsgi --ini uwsgi-dev-example.ini

หมายเหตุ: ตัวอย่างนี้เปิดใช้งานดีบักเกอร์ด้วย

ฉันไปเส้นทางนี้เพื่อเลียนแบบการผลิตให้ใกล้เคียงที่สุดกับการตั้งค่า nginx ของฉัน เพียงแค่เรียกใช้แอพพลิเคชั่นขวดด้วยมันสร้างขึ้นในเว็บเซิร์ฟเวอร์หลัง nginx มันจะส่งผลให้เกิดข้อผิดพลาดของเกตเวย์ที่ไม่ดี


16

อัพเดตเล็กน้อยสำหรับ Flask 1.0 ขึ้นไป

วิธีการพื้นฐานในการโหลดซ้ำแบบร้อนคือ:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • คุณควรใช้FLASK_ENV=development(ไม่FLASK_DEBUG=1)
  • เพื่อเป็นการตรวจสอบความปลอดภัยคุณสามารถเรียกใช้flask run --debuggerเพื่อให้แน่ใจว่าเปิดอยู่
  • Flask CLI จะอ่านสิ่งที่ชอบโดยอัตโนมัติFLASK_APPและFLASK_ENVถ้าคุณมี.envไฟล์ในรูทโปรเจ็กต์และติดตั้ง python-dotenv

export FLASK_ENV=developmentทำงานให้ฉัน app.run(debug=True)ไม่ทำงาน
alex

3

ฉันมีความคิดที่แตกต่าง:

ครั้งแรก:

pip install python-dotenv

ติดตั้งpython-dotenvโมดูลซึ่งจะอ่านการตั้งค่าท้องถิ่นสำหรับสภาพแวดล้อมโครงการของคุณ

ประการที่สอง:

เพิ่ม.flaskenvไฟล์ในไดเรกทอรีโครงการของคุณ เพิ่มรหัสต่อไปนี้:

FLASK_ENV=development

มันจบแล้ว!

ด้วยการกำหนดค่านี้สำหรับโครงการขวดของคุณเมื่อคุณเรียกใช้flask runและคุณจะเห็นผลลัพธ์นี้ใน terminal ของคุณ:

ป้อนคำอธิบายรูปภาพที่นี่

และเมื่อคุณแก้ไขไฟล์ของคุณเพียงบันทึกการเปลี่ยนแปลง คุณจะเห็นการรีโหลดอัตโนมัติอยู่ที่นั่นสำหรับคุณ:

ป้อนคำอธิบายรูปภาพที่นี่

ด้วยคำอธิบายเพิ่มเติม:

แน่นอนคุณสามารถกดด้วยตนเองexport FLASK_ENV=developmentทุกครั้งที่คุณต้องการ แต่การใช้ไฟล์การตั้งค่าที่แตกต่างกันเพื่อจัดการกับสภาพแวดล้อมการทำงานจริงดูเหมือนจะเป็นทางออกที่ดีกว่าดังนั้นฉันขอแนะนำวิธีการที่ฉันใช้


ที่สมบูรณ์แบบ! อย่าลืมใส่FLASK_APPตัวแปรเข้าไปใน.flaskenvไฟล์ด้วย
Cequiel

2

แอปพลิเคชั่นขวดสามารถเลือกดำเนินการในโหมดดีบัก ในโหมดนี้สองโมดูลที่สะดวกมากของเซิร์ฟเวอร์การพัฒนาที่เรียกว่าreloaderและดีบักเกอร์จะถูกเปิดใช้งานตามค่าเริ่มต้น เมื่อรีโหลดเดอร์เปิดใช้งาน Flask จะเฝ้าดูไฟล์ซอร์สโค้ดทั้งหมดของโครงการของคุณและรีสตาร์ทเซิร์ฟเวอร์โดยอัตโนมัติเมื่อมีการแก้ไขไฟล์ใด ๆ

โดยค่าเริ่มต้นโหมดดีบักถูกปิดใช้งาน หากต้องการเปิดใช้งานให้ตั้งค่าFLASK_DEBUG=1ตัวแปรสภาพแวดล้อมก่อนที่จะเรียกใช้ขวดrun:

(venv) $ export FLASK_APP=hello.py for Windows use > set FLASK_APP=hello.py

(venv) $ export FLASK_DEBUG=1 for Windows use > set FLASK_DEBUG=1

(venv) $ flask run

* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528

การมีเซิร์ฟเวอร์ที่ทำงานด้วยการเปิดใช้งานreloaderนั้นมีประโยชน์อย่างมากในระหว่างการพัฒนาเนื่องจากทุกครั้งที่คุณแก้ไขและบันทึกไฟล์ต้นฉบับเซิร์ฟเวอร์จะรีสตาร์ทโดยอัตโนมัติและรับการเปลี่ยนแปลง



0

$ env: Flask_ENV = "MyAPP.py"

$ env: Flask_ENV = "การพัฒนา"

วิ่งขวด

มันควรจะทำงาน


บางทีมันอาจจะมีประโยชน์ในการเพิ่มบริบทให้กับแนวคิดนี้ตัวอย่างเช่นชุดเครื่องมือระบบปฏิบัติการโฮสต์และอื่น ๆ
Manfred

0

จากเทอร์มินัลคุณสามารถพูดได้

expoort FLASK_APP=app_name.py
export FLASK_ENV=development
flask run

หรือในไฟล์ ur

if __name__ == "__main__":
    app.run(debug=True)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.