لست متأكدًا مما إذا كان ذلك خاصًا بـ Flask ، لكن عندما أقوم بتشغيل تطبيق في وضع dev (http://localhost:5000
) ، لا يمكنني الوصول إليه من أجهزة أخرى على الشبكة (مع http://[dev-Host-ip]:5000
). مع Rails في وضع dev ، على سبيل المثال ، يعمل بشكل جيد. لم أتمكن من العثور على أي مستندات تتعلق بتكوين خادم Flask dev. أي فكرة عما يجب تكوينه لتمكين هذا؟
بينما يكون ذلك ممكنًا ، يجب ألا تستخدم خادم تطوير Flask في الإنتاج. خادم Flask dev ليس مصممًا بشكل آمن أو مستقر أو فعال بشكل خاص. راجع المستندات على النشر للحلول الصحيحة.
أضف معلمة إلى app.run()
الخاص بك. بشكل افتراضي ، يتم تشغيله على المضيف المحلي ، قم بتغييره إلى app.run(Host= '0.0.0.0')
ليتم تشغيله على عنوان IP الخاص بجهازك.
تم توثيقه على موقع Flask ضمن "خادم مرئي خارجيًا" على صفحة التشغيل السريع :
خادم خارجي مرئي
إذا قمت بتشغيل الخادم ، فستلاحظ أن الخادم متاح فقط من جهاز الكمبيوتر الخاص بك ، وليس من أي جهاز آخر في الشبكة. هذا هو الإعداد الافتراضي لأنه في وضع تصحيح الأخطاء ، يمكن لمستخدم التطبيق تنفيذ رمز Python التعسفي على جهاز الكمبيوتر الخاص بك. إذا قمت بتعطيل التصحيح أو تثق في المستخدمين على شبكتك ، يمكنك إتاحة الخادم للجمهور.
ما عليك سوى تغيير استدعاء الأسلوب
run()
لتبدو هكذا:
app.run(Host='0.0.0.0')
هذا يخبر نظام التشغيل الخاص بك للاستماع على IP العام.
إذا كنت تستخدم قارورة قابلة للتنفيذ لبدء الخادم الخاص بك ، يمكنك استخدام flask run --Host=0.0.0.0
لتغيير الافتراضي من 127.0.0.1 وفتحه للأعلى لغير الاتصالات المحلية. ربما تكون أساليب التهيئة والتطبيق التي تصفها الإجابات الأخرى هي ممارسة أفضل ، لكن يمكن أن يكون هذا مفيدًا أيضًا.
الخادم المرئي خارجيًا - إذا قمت بتشغيل الخادم ، فستلاحظ أن الخادم لا يمكن الوصول إليه إلا من جهاز الكمبيوتر الخاص بك ، وليس من أي خادم آخر في الشبكة. هذا هو الإعداد الافتراضي لأنه في وضع تصحيح الأخطاء ، يمكن لمستخدم التطبيق تنفيذ رمز Python التعسفي على جهاز الكمبيوتر الخاص بك.
إذا قمت بتعطيل المصحح أو تثق في المستخدمين على شبكتك ، يمكنك إتاحة الخادم للجمهور ببساطة عن طريق إضافة - Host = 0.0.0.0 إلى سطر الأوامر:
قارورة تشغيل - المضيف = 0.0.0.0 هذا يخبر نظام التشغيل الخاص بك للاستماع على جميع عناوين IP العامة.
إذا كان تطبيقك cool
قد تم تحميل التكوين الخاص به من ملف خارجي ، كما في المثال التالي ، فلا تنسَ تحديث ملف التكوين المقابل مع Host = "0.0.0.0"
cool.app.run(
Host=cool.app.config.get("Host", "localhost"),
port=cool.app.config.get("PORT", 9000)
)
أضف الأسطر أدناه لمشروعك
if __== '__main__':
app.debug = True
app.run(Host = '0.0.0.0',port=5005)
تحقق ما إذا كان منفذ معين مفتوح على الخادم لخدمة العميل أم لا؟
في أوبونتو أو توزيعة لينكس
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
لا ترتبط هذه الإجابة فقط بالقارورة ، ولكن يجب أن تكون قابلة للتطبيق على الكل لا يمكن توصيل الخدمة من مضيف آخر مشكلة.
netstat -ano | grep <port>
لمعرفة ما إذا كان العنوان 0.0.0.0 أو ::. إذا كان 127.0.0.1 فهو فقط للطلبات المحلية.اليوم أشغل تطبيق قارورة كالمعتاد ، لكنني لاحظت أنه لا يمكن الاتصال من خادم آخر. ثم أقوم بتشغيل 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
. ولقد لاحظت أن كل شيء مثل هذا:
ثم عن طريق التحقق من قسم iptables --list
OUTPUT ، يمكن أن أرى عدة قواعد:
هذه القواعد تمنع إخراج الحزم tcp الحيوية في المصافحة. بحذفهم ، انتهت المشكلة.
جرب هذا إذا لم تنجح طريقة 0.0.0.0
مملة السخافات
أنا شخصياً اشتبكت كثيرًا للوصول إلى تطبيقي على الأجهزة الأخرى (أجهزة الكمبيوتر المحمولة والهواتف المحمولة) من خلال خادم محلي. حاولت طريقة 0.0.0.0 ، ولكن لا حظ. ثم حاولت تغيير المنفذ ، لكنه لم ينجح. لذلك ، بعد تجربة مجموعة من المجموعات المختلفة ، وصلت إلى هذه المجموعة ، وحلت مشكلتي المتمثلة في نشر تطبيقي على خادم محلي.
خطوات
ipconfig
على نظام التشغيل Windows و ifconfig
على نظام التشغيل Linux و Mac.يرجى ملاحظة: الخطوة المذكورة أعلاه هي أن يتم تنفيذها على الجهاز الذي تقوم بتشغيل التطبيق عليه ، وليس على الجهاز الذي تقوم بالوصول إليه. لاحظ أيضًا أن عنوان IPv4 قد يتغير إذا قمت بقطع الاتصال وإعادة الاتصال بالشبكة.
الآن ، ما عليك سوى تشغيل تطبيق قارورة باستخدام عنوان IPv4 المكتسب.
flask run -h 192.168.X.X
مثلا في حالتي (انظر الصورة) ، قمت بتشغيلها كـ:
flask run -h 192.168.1.100
على جهازي المحمول
عناصر اختيارية
إذا كنت تنفذ هذا الإجراء على 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.
رائع.؟؟؟؟