Налаштуйте сервер Flask Dev, щоб він був видимим у всій мережі


443

Я не впевнений, що це специфічно для колби, але коли я запускаю програму в режимі dev ( http://localhost:5000), я не можу отримати доступ до неї з інших машин у мережі (з http://[dev-host-ip]:5000). Наприклад, з рейками в режимі розробки, це прекрасно працює. Не вдалося знайти жодних документів щодо конфігурації сервера Flask dev. Будь-яка ідея, що слід налаштувати для цього?

Відповіді:


713

Хоча це можливо, не слід використовувати сервер Flask Dev у виробництві. Сервер Flask Dev не розроблений таким чином, щоб бути особливо безпечним, стабільним або ефективним. Правильні рішення див. У документах щодо розгортання .


Додайте параметр до свого app.run(). За замовчуванням він працює на localhost, змініть його app.run(host= '0.0.0.0')на запуск IP-адреси ваших машин.

Документовано на сайті Flask у розділі "Зовнішньо видимий сервер" на сторінці Quickstart :

Зовнішньо видимий сервер

Якщо ви запустите сервер, ви помітите, що сервер доступний лише з вашого власного комп'ютера, а не з будь-якого іншого в мережі. Це за замовчуванням, оскільки в режимі налагодження користувач програми може виконувати довільний код Python на вашому комп'ютері. Якщо ви налагоджено налагодження або довіряєте користувачам у вашій мережі, ви можете зробити сервер загальнодоступним.

Просто змініть виклик run()методу, щоб виглядати так:

app.run(host='0.0.0.0')

Це повідомляє вашій операційній системі слухати під відкритим IP-адресою.


44
Щоб встановити конкретний ip app.run (host = "192.168.1.7", порт = 5010), зручно, якщо у вашого ПК є кілька ip's
lxx

2
як отримати доступ до скрипту flask в усьому світі, хостинг на моєму власному сервері
pyd

Це рішення також працює для контейнерів Docker. У цій публікації описано рішення цих випадків.

для mac: я не зміг отримати доступ до своєї програми для колб на рівні 0,0.0.0 (навіть якщо вона була подана там), за винятком націлювання на домен, зазначений у System Preferences> Sharing . Домен повинен бути чимось подібним mymacname.local.
Ніко Чернек

14
Якимось чином на своєму Mac я мушу явно використовувати flask run --host 0.0.0.0його для роботи.
Minh Nghĩa

122

Якщо для запуску сервера використовується виконувана колба, ви можете flask run --host=0.0.0.0змінити типовий параметр на 127.0.0.1 і відкрити його до не локальних з'єднань. Методи config та app.run, які описуються в інших відповідях, ймовірно, є кращою практикою, але це також може бути зручно.

Зовнішньо видимий сервер Якщо ви запускаєте сервер, ви помітите, що сервер доступний лише з вашого власного комп'ютера, а не з будь-якого іншого в мережі. Це за замовчуванням, оскільки в режимі налагодження користувач програми може виконувати довільний код Python на вашому комп'ютері.

Якщо налагоджувач відключений або довіряєте користувачам у вашій мережі, ви можете зробити сервер загальнодоступним, просто додавши до командного рядка --host = 0.0.0.0:

запуск фляги --host = 0.0.0.0 Це дає змогу вашій операційній системі слухати всі загальнодоступні IP-адреси.

Довідка: http://flask.pocoo.org/docs/0.11/quickstart/


2
Я не знаю, чи відчував це хтось інший, але я спробував цей метод спочатку згідно з документами QuickStart, але чомусь IP продовжував працювати 127.0.0.1(я встановив свій Flask виконуваний файл належним чином, або так, здавалося, не було впевнений, що я робив неправильно). Однак, додавши, app.run(host='0.0.0.0')як зазначено в іншій відповіді, у мій серверний файл, я зміг отримати доступ до сторінки в різних мережах. У когось іншого є така проблема, як описана нами, або є інформація про неї?
twknab

2
Для мене проблему вирішують у колбі --host = 0.0.0.0. Мені вдалося отримати доступ до url -http: // <ip address>: 5000. Спершу я перевірив, які порти відкриті на машині за допомогою команди - sudo firewall-cmd --zone = public --list-ports, потім я дізнався, що порт 5000 не відкритий. Я відкрив цей порт за допомогою команди - sudo firewall-cmd --zone = public - постійний --add-port = 5000 / tcp, а потім - sudo firewall-cmd --reload. потім запустіть додаток для колби як - колба запустити --host = 0.0.0.0
Пінту Кумар,

24

Спробуйте це, якщо метод 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

запуск програми «колба»

На моєму мобільному пристрої

скріншот з мого мобільного телефону

Необов’язкові речі

Якщо ви виконуєте цю процедуру в Windows і використовуєте Power Shell як CLI, і ви все ще не можете отримати доступ до веб-сайту, спробуйте команду CTRL + C в оболонці, в якій працює додаток. Силова оболонка іноді замерзає, і для її відродження потрібна щіпка. Це може навіть припинити роботу сервера, але це іноді робить трюк.

Це воно. Дайте великі пальці, якщо вам це здається корисним.😉

Ще кілька факультативних речей

Я створив короткий сценарій 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

Примітка. Я вказав вищезгаданий код оболонки в getIP.ps1.

Класно.👌


1
так! це працює. я в змозі отримати його на мобільному телефоні, встановивши ipv4 ip в колбу. сподіваємось, це також допоможе іншим :)
Ашу Кумар

@nwillo робити мобільний телефон, і машина, на якій я обслуговуюся, підключена до того ж wifi / мережі.
sachin rathod

@sachinrathod так. вони мають. Ось так вони можуть отримати доступ до одного і того ж IP-шлюзу.
nwillo

22

Якщо ваша coolпрограма має конфігурацію, завантажену із зовнішнього файлу, як у наступному прикладі, тоді не забудьте оновити відповідний файл конфігурації HOST = "0.0.0.0"

cool.app.run(
    host=cool.app.config.get("HOST", "localhost"),
    port=cool.app.config.get("PORT", 9000)
)            

1
Це хороший спосіб також зберегти ім'я хоста та номер порту в конфігурації колби. Я шукав саме це рішення.
compie

20

Додайте нижче рядків до свого проекту

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=5005)

Я отримуюOSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
pyd

Способи виправлення Потрібно запустити файл python із запуском як адміністратор та перевірити, чи працює якийсь порт у Windows netstat -na|findstr 5005.
Jeevan Chaitanya

10

Перевірте, чи певний порт відкритий на сервері для обслуговування клієнта чи ні?

в дистрибутиві Ubuntu або Linux

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

Перейдіть на ваш проектний шлях у CMD (командний рядок) та виконайте таку команду: -

встановити FLASK_APP = ABC.py

SET FLASK_ENV = розробка

колба запустити -h [yourIP] -p 8080

Ви отримаєте наступний o / p на CMD: -

  • Обслуговує Flask додаток "expirement.py" (ледаче завантаження)
    • Навколишнє середовище: розвиток
    • Режим налагодження: увімкнено
    • Перезапуск зі стат
    • Налагоджувач активний!
    • PIN-код налагоджувача: 199-519-700
    • Працює на http: // [yourIP]: 8080 / (Натисніть CTRL + C, щоб вийти)

Тепер ви можете отримати доступ до своєї програми для колби на іншій машині за допомогою http: // [yourIP]: 8080 / url


4

Якщо у вас виникають проблеми з доступом до сервера Flask, розгорнутого за допомогою PyCharm , врахуйте наступне:

PyCharm не запускає ваш основний .py файл безпосередньо, тому будь-який код у if __name__ == '__main__':ньому не буде виконуватися, і будь-які зміни (наприклад app.run(host='0.0.0.0', port=5000)) не набудуть чинності.

Натомість слід налаштувати сервер Flask, використовуючи Запустити конфігурації, зокрема, розмістивши --host 0.0.0.0 --port 5000в полі Додаткові параметри .

Запустіть конфігурації Flask-сервера PyCharm

Докладніше про налаштування Flask-сервера в PyCharm


Це фактично вирішило всі мої проблеми і має бути правильною відповіддю на це питання!
Альберто Белліні

4

Для мене я дотримувався вищевказаної відповіді та трохи змінив її:

  1. Просто захопіть свою ipv4 адресу за допомогою ipconfig у командному рядку
  2. Перейдіть до файлу, в якому присутній код колби
  3. У головній функції напишіть app.run (host = 'ваша ipv4 адреса')

Наприклад:

введіть тут опис зображення


3

У мене була така ж проблема, я використовую PyCharm як редактор, і коли я створював проект, PyCharm створив Flask Server. Що я зробив, це створити сервер з Python наступним чином;

Налаштування сервера Python PyCharm в основному те, що я зробив, це створити новий сервер, але колбу, якщо не пітон

Сподіваюся, це допоможе тобі


Будь ласка, не публікуйте зображення - опишіть конкретно, що ви робите, щоб вирішити проблему.
CertainPerformance

Гей, звичайно, якщо я вже редагую пост, щоб поліпшити відповідь.
Juanes30

3

Ця відповідь пов'язана не лише з фляшкою, але має бути застосована для всіх, хто не може підключити послугу до іншого сервера .

  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 показує, що є лише SYN-пакети від віддаленого хоста

Потім, перевіривши iptables --listрозділ OUTPUT, я міг побачити кілька правил:

Результат списку iptables

ці правила забороняють виводити життєві пакети tcp при рукостисканні. Видаляючи їх, проблеми вже немає.


1

перейти до набору шляхів проекту FLASK_APP = ABC.py SET FLASK_ENV = розробка

запустіть колбу -h [yourIP] -p 8080, ви будете слідувати o / p на CMD: - * Обслуговувати Flask-додаток "expirement.py" (ледаче завантаження) * Навколишнє середовище: розробка * Режим налагодження: увімкнено * Перезапуск зі стат * Налагоджувач активний ! * PIN-код налагоджувача: 199-519-700 * Запуск на http: // [yourIP]: 8080 / (Натисніть CTRL + C, щоб вийти)


1

Ви також можете встановити хост (виставити його на мережу з IP-адресою) та порт через змінні середовища.

$ export FLASK_APP=app.py
$ export FLASK_ENV=development
$ export FLASK_RUN_PORT=8000
$ export FLASK_RUN_HOST=0.0.0.0

$ flask run
 * Serving Flask app "app.py" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on https://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 329-665-000

Див. Як отримати всі доступні параметри команд для встановлення змінних середовища?


1

Створіть файл .flaskenvу кореневому каталозі проекту.

Параметри цього файлу, як правило:

FLASK_APP=app.py
FLASK_ENV=development
FLASK_RUN_HOST=[dev-host-ip]
FLASK_RUN_PORT=5000

Якщо у вас є віртуальне середовище, активуйте його та зробіть pip install python-dotenv.

Цей пакет використовує .flaskenvфайл, і декларації всередині нього будуть автоматично імпортовані протягом термінальних сесій.

Тоді ви можете зробити flask run

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.