اذهب إلى المحتوى

السؤال

نشر

قمت بعمل جملة طباعة بسيطة قبل سطر تشغيل التطبيق، ولكن وجدت أن هذه الجملة يتم طباعتها مرتين وليس مرة واحدة:

from flask import Flask
app = Flask(__name__)

@app.route('/', methods=['POST', 'GET'])
def index():
    return "home page"

if __name__ == '__main__':
    print('# Starting #')	# يتم طباعة هذه الجملة مرتين
    app.run(debug=True)

حيث وجدت أن نتيجة تشغيل التطبيق كالتالي:

# Starting #
 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Restarting with stat
# Starting #
 * Debugger is active!
 * Debugger PIN: 395-899-610
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

لماذا يتم تشغيل التطبيق مرتين وليس مرة واحدة؟ ألن يؤثر هذا الأمر على أداء المشروع؟

Recommended Posts

  • 1
نشر

هذا الأمر يحدث بسبب المحمل Werkzeug والذي يقوم بإنشاء عملية process جديدة للمشروع، لكي يقوم بإغلاق هذه العملية وإعادة تشغيلها عندما يتم تغير أي أكواد خاصة بالمشروع، وبالتالي يتم إعادة تحميل الخادم بسرعة دون الحاجة إلى إعادةى تشغيله يدويًا في كل مرة، وبالتأكيد هذا الأمر يحدث فقط في بيئة التطوير Development Environment ولا يتم إستخدامه في بيئة الإنتاج Production Environment، ويمكنك التأكد من هذا الأمر من خلال قراءة الكود الخاص بالدالة restart_with_reloader في الملف werkzeug/_reloader.py حيث ستجد أنه يتم إستعمال التابع ()subprocess.call للقيام بإنشاء عملية جديدة والتحكم فيها في كل مرة يتم تعديل كود المشروع.

تستطيع إيقاف هذا السلوك من خلال تمرير المعامل use_reloader بقيمة Flase إلى التابع app.run كالتالي:

if __name__ == '__main__':
    print('# Starting #')
    app.run(debug=True, use_reloader=False)

و من خلال الأمر flask على النحو التالي:

FLASK_DEBUG=1 flask run --no-reload

يمكنك أيضًا أن توقف هذا السلوك من خلال تشغيل التطبيق في وضع الإنتاج Production Mode عن طريق إزالة المعامل debug :

if __name__ == '__main__':
    print('# Starting #')
    app.run()

في كل الحالات السابقة لن يعمل التطبيق إلا مرة واحدة، ولكن ستخسر ميزة إعادة تشغيل الخادم بشكل تلقائي وعليك حينها أن تقوم بإعادة تشغيله بشكل يدوي.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...