it-swarm.asia

قم بتكوين خادم dev Flask ليكون مرئيًا عبر الشبكة

لست متأكدًا مما إذا كان ذلك خاصًا بـ Flask ، لكن عندما أقوم بتشغيل تطبيق في وضع dev (http://localhost:5000) ، لا يمكنني الوصول إليه من أجهزة أخرى على الشبكة (مع http://[dev-Host-ip]:5000). مع Rails في وضع dev ، على سبيل المثال ، يعمل بشكل جيد. لم أتمكن من العثور على أي مستندات تتعلق بتكوين خادم Flask dev. أي فكرة عما يجب تكوينه لتمكين هذا؟

317
sa125

بينما يكون ذلك ممكنًا ، يجب ألا تستخدم خادم تطوير Flask في الإنتاج. خادم Flask dev ليس مصممًا بشكل آمن أو مستقر أو فعال بشكل خاص. راجع المستندات على النشر للحلول الصحيحة.


أضف معلمة إلى app.run() الخاص بك. بشكل افتراضي ، يتم تشغيله على المضيف المحلي ، قم بتغييره إلى app.run(Host= '0.0.0.0') ليتم تشغيله على عنوان IP الخاص بجهازك.

تم توثيقه على موقع Flask ضمن "خادم مرئي خارجيًا" على صفحة التشغيل السريع :

خادم خارجي مرئي

إذا قمت بتشغيل الخادم ، فستلاحظ أن الخادم متاح فقط من جهاز الكمبيوتر الخاص بك ، وليس من أي جهاز آخر في الشبكة. هذا هو الإعداد الافتراضي لأنه في وضع تصحيح الأخطاء ، يمكن لمستخدم التطبيق تنفيذ رمز Python التعسفي على جهاز الكمبيوتر الخاص بك. إذا قمت بتعطيل التصحيح أو تثق في المستخدمين على شبكتك ، يمكنك إتاحة الخادم للجمهور.

ما عليك سوى تغيير استدعاء الأسلوب run() لتبدو هكذا:

app.run(Host='0.0.0.0')

هذا يخبر نظام التشغيل الخاص بك للاستماع على IP العام.

552
Shawn Swaner

إذا كنت تستخدم قارورة قابلة للتنفيذ لبدء الخادم الخاص بك ، يمكنك استخدام flask run --Host=0.0.0.0 لتغيير الافتراضي من 127.0.0.1 وفتحه للأعلى لغير الاتصالات المحلية. ربما تكون أساليب التهيئة والتطبيق التي تصفها الإجابات الأخرى هي ممارسة أفضل ، لكن يمكن أن يكون هذا مفيدًا أيضًا.

الخادم المرئي خارجيًا - إذا قمت بتشغيل الخادم ، فستلاحظ أن الخادم لا يمكن الوصول إليه إلا من جهاز الكمبيوتر الخاص بك ، وليس من أي خادم آخر في الشبكة. هذا هو الإعداد الافتراضي لأنه في وضع تصحيح الأخطاء ، يمكن لمستخدم التطبيق تنفيذ رمز Python التعسفي على جهاز الكمبيوتر الخاص بك.

إذا قمت بتعطيل المصحح أو تثق في المستخدمين على شبكتك ، يمكنك إتاحة الخادم للجمهور ببساطة عن طريق إضافة - Host = 0.0.0.0 إلى سطر الأوامر:

قارورة تشغيل - المضيف = 0.0.0.0 هذا يخبر نظام التشغيل الخاص بك للاستماع على جميع عناوين IP العامة.

المرجع: http://flask.pocoo.org/docs/0.11/quickstart/

79
Aria

إذا كان تطبيقك cool قد تم تحميل التكوين الخاص به من ملف خارجي ، كما في المثال التالي ، فلا تنسَ تحديث ملف التكوين المقابل مع Host = "0.0.0.0"

cool.app.run(
    Host=cool.app.config.get("Host", "localhost"),
    port=cool.app.config.get("PORT", 9000)
)            
17
mircealungu

أضف الأسطر أدناه لمشروعك

if __== '__main__':
    app.debug = True
    app.run(Host = '0.0.0.0',port=5005)
12
Jeevan Chaitanya

تحقق ما إذا كان منفذ معين مفتوح على الخادم لخدمة العميل أم لا؟

في أوبونتو أو توزيعة لينكس

Sudo ufw enable
Sudo ufw allow 5000/tcp //allow the server to handle the request on port 5000

تكوين التطبيق للتعامل مع الطلبات عن بعد

app.run(Host='0.0.0.0' , port=5000)


python3 app.py & #run application in background
5
IMRA

واجهت نفس المشكلة ، وأنا أستخدم PyCharm كمحرر وعندما أنشأت المشروع ، أنشأت PyCharm خادم Flask. ما فعلته هو إنشاء خادم مع Python بالطريقة التالية ؛

 Config Python Server PyCharm في الأساس ما فعلته هو إنشاء خادم جديد ولكن قارورة إن لم يكن الثعبان

انا آمل ان تساعدك

2
Juan E. Londoño T.

لا ترتبط هذه الإجابة فقط بالقارورة ، ولكن يجب أن تكون قابلة للتطبيق على الكل لا يمكن توصيل الخدمة من مضيف آخر مشكلة.

  1. استخدم netstat -ano | grep <port> لمعرفة ما إذا كان العنوان 0.0.0.0 أو ::. إذا كان 127.0.0.1 فهو فقط للطلبات المحلية.
  2. استخدم tcpdump لمعرفة ما إذا كانت هناك حزمة مفقودة. إذا أظهر عدم توازن واضح ، فتحقق من قواعد التوجيه عن طريق iptables.

اليوم أشغل تطبيق قارورة كالمعتاد ، لكنني لاحظت أنه لا يمكن الاتصال من خادم آخر. ثم أقوم بتشغيل netstat -ano | grep <port> ، والعنوان المحلي هو :: أو 0.0.0.0 (جربت كليهما ، وأعرف أن 127.0.0.1 يسمح فقط بالاتصال من المضيف المحلي). ثم استخدمت telnet Host port ، والنتيجة هي connect to .... هذا غريب جدا. ثم ظننت أنني أفضل التحقق من ذلك مع tcpdump -i any port <port> -w w.pcap. ولقد لاحظت أن كل شيء مثل هذا:

 tcpdump result shows it there is only SYN packets from remote Host

ثم عن طريق التحقق من قسم iptables --list OUTPUT ، يمكن أن أرى عدة قواعد:

 iptables list result

هذه القواعد تمنع إخراج الحزم tcp الحيوية في المصافحة. بحذفهم ، انتهت المشكلة.

1
Tiina

جرب هذا إذا لم تنجح طريقة 0.0.0.0

مملة السخافات

أنا شخصياً اشتبكت كثيرًا للوصول إلى تطبيقي على الأجهزة الأخرى (أجهزة الكمبيوتر المحمولة والهواتف المحمولة) من خلال خادم محلي. حاولت طريقة 0.0.0.0 ، ولكن لا حظ. ثم حاولت تغيير المنفذ ، لكنه لم ينجح. لذلك ، بعد تجربة مجموعة من المجموعات المختلفة ، وصلت إلى هذه المجموعة ، وحلت مشكلتي المتمثلة في نشر تطبيقي على خادم محلي.

خطوات

  1. احصل على عنوان IPv4 المحلي لجهاز الكمبيوتر الخاص بك. يمكن القيام بذلك عن طريق كتابة ipconfig على نظام التشغيل Windows و ifconfig على نظام التشغيل Linux و Mac.

 IPv4 (Windows) 

يرجى ملاحظة: الخطوة المذكورة أعلاه هي أن يتم تنفيذها على الجهاز الذي تقوم بتشغيل التطبيق عليه ، وليس على الجهاز الذي تقوم بالوصول إليه. لاحظ أيضًا أن عنوان IPv4 قد يتغير إذا قمت بقطع الاتصال وإعادة الاتصال بالشبكة.

  1. الآن ، ما عليك سوى تشغيل تطبيق قارورة باستخدام عنوان IPv4 المكتسب.

    flask run -h 192.168.X.X

    مثلا في حالتي (انظر الصورة) ، قمت بتشغيلها كـ:

    flask run -h 192.168.1.100

 running the flask app 

على جهازي المحمول

 screenshot from my mobile phone 

عناصر اختيارية

إذا كنت تنفذ هذا الإجراء على Windows ، وتستخدم Power Shell كـ CLI ، وما زلت غير قادر على الوصول إلى موقع الويب ، فجرب أمر CTRL + C في Shell الذي يقوم بتشغيل التطبيق. تتجمد Power Shell أحيانًا وتحتاج إلى قرصة لتنشيطها. قد يؤدي القيام بذلك إلى إنهاء الخادم ، ولكنه يؤدي في بعض الأحيان الخدعة.

هذا هو. التخلي عن الابهام إذا وجدت هذا مفيداً. ؟؟؟؟

بعض الأشياء الاختيارية

لقد قمت بإنشاء برنامج Powershell قصير سيحصل على عنوان IP الخاص بك كلما احتجت إلى ذلك:

$env:getIp = ipconfig
if ($env:getIp -match '(IPv4[\sa-zA-Z.]+:\s[0-9.]+)') {
    if ($matches[1] -match '([^a-z\s][\d]+[.\d]+)'){
        $ipv4 = $matches[1]
    }
}
echo $ipv4

احفظه في ملف بامتداد .ps1 (لـ PowerShell) ، وقم بتشغيله قبل بدء تشغيل التطبيق. يمكنك حفظه في مجلد المشروع وتشغيله كـ:

.\getIP.ps1; flask run -h $ipv4

ملاحظة: قمت بحفظ كود Shell أعلاه في getIP.ps1.

رائع.؟؟؟؟

1
nwillo