मुझे पोर्ट 80 पर चलाने के लिए फ्लास्क कैसे मिलेगा?


212

मेरे पास एक फ्लास्क सर्वर है जो पोर्ट 5000 के माध्यम से चल रहा है, और यह ठीक है। मैं इसे http://example.com/000 पर एक्सेस कर सकता हूं

लेकिन क्या इसे केवल http://example.com पर एक्सेस करना संभव है ? मैं यह मान रहा हूं कि मुझे 5000 से 80 तक पोर्ट बदलना होगा। लेकिन जब मैं कोशिश करता हूं कि फ्लास्क पर, मुझे यह त्रुटि संदेश मिलता है जब मैं इसे चलाता हूं।

Traceback (most recent call last):
  File "xxxxxx.py", line 31, in <module>
app.run(host="0.0.0.0", port=int("80"), debug=True)
   File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 772, in run
run_simple(host, port, self, **options)
  File "/usr/local/lib/python2.6/dist-packages/werkzeug/serving.py", line 706, in run_simple
    test_socket.bind((hostname, port))
  File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use

रनिंग lsof -i :80रिटर्न

COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
apache2   467     root    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2  4413 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14346 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14570 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14571 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14573 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)

क्या मुझे पहले इन प्रक्रियाओं को मारने की आवश्यकता है? क्या वह सुरक्षित है? या फिर फ्लास्क को पोर्ट 5000 पर चालू रखने का एक और तरीका है लेकिन मुख्य वेबसाइट डोमेन को किसी तरह पुनर्निर्देशित करना है?


आप इसे अपाचे के साथ फ्लास्क का उपयोग कर सकते हैं ।
सैयद हबीब एम

3
प्रश्न का शीर्षक प्रश्न के अनुकूल नहीं है। शायद उसे यह पढ़ना चाहिए कि 'पोर्ट 80 पर चलने के लिए अन्य चीजें कैसे प्राप्त करें'। मैं उत्सुक हूं कि पोर्ट फ्लास्क को कैसे बदला जाए, जिस पर यह सवाल है, जो चल रहा है, लेकिन इसका उल्लेख यहां कभी नहीं किया गया
इलियट वुड्स

जवाबों:


76

इसलिए यह उस त्रुटि संदेश को फेंक रहा है क्योंकि आपके पास apache2पोर्ट 80 पर चल रहा है।

यदि यह विकास के लिए है, तो मैं इसे छोड़ दूंगा क्योंकि यह पोर्ट 5000 पर है।

यदि यह उत्पादन के लिए भी है:

सिफारिश नहीं की गई

  • apache2पहले बंद करो ;

अनुशंसित नहीं है क्योंकि यह प्रलेखन में बताता है:

आप विकास के दौरान अंतर्निहित सर्वर का उपयोग कर सकते हैं, लेकिन आपको उत्पादन अनुप्रयोगों के लिए पूर्ण परिनियोजन विकल्प का उपयोग करना चाहिए। (निर्माण में निर्मित विकास सर्वर का उपयोग न करें।)

सिफारिश की

  • फ्लास्क के HTTPमाध्यम apache2से प्रॉक्सी ट्रैफ़िक ।

इस तरह, apache2आपकी सभी स्थिर फ़ाइलों को संभाल सकता है (जो कि यह बहुत अच्छा है - फ्लास्क में निर्मित डिबग सर्वर की तुलना में बहुत बेहतर) और अपने डायनेमिक कंटेंट के लिए रिवर्स प्रॉक्सी के रूप में कार्य करें, फ्लास्क के लिए उन अनुरोधों को पारित करना।

यहाँ Apache + mod_wsgi के साथ फ्लास्क स्थापित करने के बारे में आधिकारिक दस्तावेज का लिंक दिया गया है।

1 संपादित करें - @Djack के लिए स्पष्टीकरण

Apache2 के माध्यम से फ्लास्क पर प्रॉक्सी HTTP ट्रैफ़िक

जब पोर्ट 80 ( HTTP) या पोर्ट 443 ( HTTPS) पर एक अनुरोध सर्वर पर आता है , तो Apache या Nginx जैसा वेब सर्वर अनुरोध के कनेक्शन को संभालता है और यह बताता है कि इसके साथ क्या करना है। हमारे मामले में प्राप्त एक अनुरोध को WSGI प्रोटोकॉल पर फ्लास्क के माध्यम से पारित करने के लिए कॉन्फ़िगर किया जाना चाहिए और पायथन कोड द्वारा संभाला जाना चाहिए। यह "गतिशील" भाग है।

गतिशील सामग्री के लिए रिवर्स प्रॉक्सी

उपरोक्त जैसे आपके वेब सर्वर को कॉन्फ़िगर करने के लिए कुछ फायदे हैं;

  • एसएसएल समाप्ति - वेब सर्वर केवल थोड़े विन्यास के साथ HTTPS अनुरोधों को संभालने के लिए अनुकूलित किया जाएगा। अजगर में "अपना खुद का रोल न करें" जो संभवतः तुलना में बहुत असुरक्षित है।
  • सुरक्षा - इंटरनेट के लिए एक पोर्ट खोलने के लिए सुरक्षा पर सावधानीपूर्वक विचार करना होता है। फ्लास्क के विकास सर्वर को इसके लिए डिज़ाइन नहीं किया गया है और इस उद्देश्य के लिए डिज़ाइन किए गए वेब सर्वर की तुलना में खुले बग या सुरक्षा मुद्दे हो सकते हैं। ध्यान दें कि एक बुरी तरह से कॉन्फ़िगर किया गया वेब सर्वर असुरक्षित भी हो सकता है!
  • स्टेटिक फाइल हैंडलिंग - यह स्थिर फ़ाइलों को संभालने के लिए बिलिन फ्लास्क वेब सर्वर के लिए संभव है, हालाँकि यह अनुशंसित नहीं है; Nginx / Apache इमेजेस, CSS, Javascript फाइलों जैसे स्टैटिक फाइल्स को हैंडल करने में बहुत अधिक कुशल हैं और केवल "डायनामिक" रिक्वेस्ट (जिन्हें कंटेंट को अक्सर डेटाबेस से पढ़ा जाता है या कंटेंट चेंज होते हैं) पायथन कोड द्वारा हैंडल किया जाएगा।
  • +अधिक। यह इस प्रश्न के लिए बहुत अधिक है। यदि आप अधिक जानकारी चाहते हैं तो इस क्षेत्र में कुछ शोध करें।

यह वास्तव में एक महान जवाब है! क्या आप सादे अंग्रेजी में उच्च तकनीकी शब्दजाल को ध्वस्त कर सकते हैं जिसका आपने " Proxy HTTP traffic to Flask through apache2" और " reverse proxy for dynamic content" उपयोग किया है ?
जॉन स्ट्रोड

2
@Djack - अपडेटेड उत्तर हालांकि यह सवाल के दायरे में है, इसलिए कृपया अधिक जानकारी के लिए ऑनलाइन खोज करें।
इवान

1
कीवर्ड प्रदान करने के लिए धन्यवाद। मैं निश्चित रूप से एक ऑनलाइन खोज करूँगा।
जॉन स्ट्रोड

419

1- अन्य अनुप्रयोगों को बंद करें जो पोर्ट 80 का उपयोग कर रहे हैं। 2- पोर्ट 80 के साथ एप्लिकेशन चलाएं:

if __name__ == '__main__':
      app.run(host='0.0.0.0', port=80)

1
ठीक काम करता है, केवल विंडोज़ के वातावरण में।, जब अपाचे अनुपस्थित है .. :)
jOSe

1
यह मेरे लिए काम नहीं कर रहा है। यह होना चाहिए: फ्लास्क रन --होस्ट = 0.0.0.0
हारुन-उर-राशिद

1
@jOSe मैंने Ubuntu पर PyCharm का उपयोग करने की कोशिश की, ठीक काम करता है।
बग्स बग

@jOSe Apache को चलाने के लिए linux की जरूरत नहीं है, आप इसे अनइंस्टॉल कर सकते हैं, या इसे बदल सकते हैं।

145

बाहरी रूप से दिखाई देने वाले सर्वर के लिए, जहां आप अपाचे या अन्य वेब सर्वर का उपयोग नहीं करते हैं, जो आप टाइप करते हैं

flask run --host=0.0.0.0 --port=80

क्या यह कमांड env vars का उपयोग करने में सक्षम है? मैं CMD flask run --host=0.0.0.0 --port=$PORTअपने Dockerfile के भीतर (heroku कारणों के लिए) कोशिश करता रहता हूं और मुझे अपने पोर्ट के लिए एक पूर्णांक की आवश्यकता के बारे में त्रुटियां मिलती रहती हैं
Smokin Joe

यह मेरे स्थानीय (लैपटॉप) पर ठीक काम करता था लेकिन जब मैंने इसे अपने एडब्ल्यूएस ईसी 2 उदाहरण पर इस्तेमाल किया, तो यह "अनुमति अस्वीकृत" कहता है। अगर मैं शुरुआत में "sudo" जोड़ता हूं, तो यह कहता है कि "फ्लास्क" कमांड मान्यता प्राप्त नहीं है ...
user3768495

1
@ user3768495 हो सकता है कि फ्लास्क रूट (sudo) उपयोगकर्ता में स्थापित न हो
हारुन-उर-राशिद

2
हाय @ हारुन-उर-रशीद, शायद यही मामला है - मैंने इसे एक आभासी वातावरण में स्थापित किया है। मैं इसे ठीक करने के तरीके की जाँच करूँगा। आपके जवाब के लिए धन्यवाद।
user3768495

22

यदि आप पोर्ट या होस्ट को बदलने के लिए निम्नलिखित का उपयोग करते हैं:

if __name__ == '__main__':
  app.run(host='0.0.0.0', port=80)

सर्वर शुरू करने के लिए निम्न कोड का उपयोग करें (फ्लास्क के लिए मेरा मुख्य प्रवेश द्वार app.py है):

python app.py

के बजाय का उपयोग करने का:

flask run

10

यदि आप एक ही पोर्ट यानी पोर्ट = 5000 पर अपना आवेदन चाहते हैं तो बस अपने टर्मिनल में इस कमांड को चलाएं:

fuser -k 5000/tcp

और फिर चलाएं:

python app.py

यदि आप एक निर्दिष्ट पोर्ट पर चलना चाहते हैं, उदाहरण के लिए, यदि आप पोर्ट = 80 पर चलना चाहते हैं, तो अपनी मुख्य फाइल में बस इसका उल्लेख करें:

if __name__ == '__main__':  
    app.run(host='0.0.0.0', port=80)

8

पैकेज का उपयोग करने का एक आश्वस्त तरीका है python-dotenv: यह एक .flaskenvफ़ाइल को पढ़ता है जहां आप फ्लास्क के लिए पर्यावरण चर स्टोर कर सकते हैं।

  • pip install python-dotenv
  • .flaskenvअपने ऐप की रूट डायरेक्टरी में एक फाइल बनाएं

आपके द्वारा निर्दिष्ट फ़ाइल के अंदर:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

उसके बाद आपको बस अपना ऐप चलाना होगा flask runऔर उस पोर्ट पर अपने ऐप को एक्सेस कर सकते हैं।

कृपया ध्यान दें कि FLASK_RUN_HOSTडिफॉल्ट्स 127.0.0.1और FLASK_RUN_PORTडिफॉल्ट्स टू 5000


8

यह एकमात्र समाधान है जिसने मेरे लिए उबंटू -18 पर काम किया।

फ़ाइल के अंदर app.py, उपयोग करें:

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

जब तक sudoइसे चलाने के लिए उपयोग नहीं किया जाता है तब तक उपरोक्त कोड वही अनुमति त्रुटि देगा:

sudo python3 app.py

6

आपका मुद्दा यह है, कि आपके पास एक अपाचे वेबसर्वर पहले से चल रहा है जो पहले से ही पोर्ट 80 का उपयोग कर रहा है। तो, आप या तो कर सकते हैं:

  1. अपाचे को मारें: आपको संभवतः इसे /etc/init.d/apache2 stopकेवल मारने के बजाय, इसके माध्यम से करना चाहिए ।

  2. अपाचे प्रक्रिया में अपने फ्लास्क ऐप को तैनात करें, जैसा कि अपाचे में फ्लास्क वर्णन करता है।


5

मुझे FLASK_RUN_PORTअपने वातावरण में निर्दिष्ट पोर्ट नंबर पर सेट करना था । अगली बार जब आप अपना ऐप शुरू करेंगे, तो फ्लास्क उस पर्यावरण चर को आपके द्वारा चुने गए पोर्ट नंबर के साथ लोड करेगा।


3

आपको अपने एप्लिकेशन के लिए पोर्ट नंबर बदलने की आवश्यकता नहीं है, बस पोर्ट को फ्लास्क करने के लिए प्रॉक्सी प्रश्नों के लिए अपने www सर्वर (nginx या Apache) को कॉन्फ़िगर करें। पर अटेंड करें uWSGI


3

app.run(port=80,debug=True) जब आप देव पर हों तब अपने साथ पोर्ट सेट करें ताकि डिबग सही लगे


2

सबसे आसान और सबसे अच्छा समाधान

अपनी .py फ़ाइल को किसी फ़ोल्डर में सहेजें। इस स्थिति में मेरे फ़ोल्डर का नाम परीक्षण है। कमांड प्रॉम्प्ट में निम्न चलाएँ

c:\test> set FLASK_APP=application.py
c:\test> set FLASK_RUN_PORT=8000
c:\test> flask run

----------------- बाद में लौटाया जाएगा ----------------

 * Serving Flask app "application.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
127.0.0.1 - - [23/Aug/2019 09:40:04] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [23/Aug/2019 09:40:04] "[33mGET /favicon.ico HTTP/1.1[0m" 404 -

अब अपने ब्राउज़र के प्रकार: http://127.0.0.1:8000 पर । धन्यवाद


उसे इसे 80 पर चलाने की जरूरत है जो एक विशेष बंदरगाह है। उसे पहले अन्य सामान को रोकने की जरूरत है।
अहमद 1

1

मेरे परिदृश्य में निम्नलिखित चरणों ने एक आकर्षण की तरह काम किया:

  • पैकेज स्थापित करना:

    pip install --upgrade pip
    pip install python-dotenv
  • मेरी एप्लिकेशन निर्देशिका "फ्लास्क / .flaskenv" में एक छिपी हुई फ़ाइल बनाना

  • निम्नलिखित सामग्री जोड़ना:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
  • अंत में, फ्लास्क कमांड को एक बार चलाएं:

    flask run
  • जिस संस्करण पर मैं काम कर रहा हूं वह है:

    pip freeze |grep -i flask
    Flask==1.1.1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.