Настройте сервер Dev Flask, чтобы он был виден через сеть

444

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

sa125
источник

Ответы:

714

Хотя это возможно, вы не должны использовать сервер Flask для разработки. Сервер разработчика Flask не предназначен для обеспечения особой безопасности, стабильности или эффективности. См. Документы по развертыванию для правильных решений.


Добавьте параметр в свой app.run(). По умолчанию он работает на локальном хосте, измените его app.run(host= '0.0.0.0')на IP-адрес вашего компьютера.

Документировано на сайте Flask в разделе «Внешний видимый сервер» на странице быстрого запуска :

Внешне видимый сервер

Если вы запустите сервер, вы заметите, что сервер доступен только с вашего компьютера, а не с любого другого в сети. Это значение по умолчанию, поскольку в режиме отладки пользователь приложения может выполнить произвольный код Python на вашем компьютере. Если вы отключили отладку или доверяете пользователям вашей сети, вы можете сделать сервер общедоступным.

Просто измените вызов run()метода, чтобы он выглядел так:

app.run(host='0.0.0.0')

Это говорит вашей операционной системе прослушивать публичный IP.

Шон Свонер
источник
44
Для установки на определенный ip app.run (host = "192.168.1.7", port = 5010) удобно, если у вашего компьютера есть несколько ip
lxx
2
как получить доступ к скрипту фляги глобально, хостинг на моем собственном сервере
pyd
Это решение также работает для контейнеров Docker. Этот пост описывает решение для этих случаев.
для Mac: я не смог получить доступ к своему приложению фляги с 0.0.0.0 (даже если оно было там подано), кроме как нацеливанием на домен, указанный в Системных настройках> Общий доступ . Домен должен быть примерно таким mymacname.local.
Нико Чернек
14
Каким-то образом на моем Mac я должен явно использовать flask run --host 0.0.0.0его, чтобы он работал.
Minh
123

Если вы используете исполняемый файл фляги для запуска вашего сервера, вы можете flask run --host=0.0.0.0изменить значение по умолчанию с 127.0.0.1 и открыть его для нелокальных подключений. Методы config и app.run, описанные в других ответах, вероятно, лучше использовать, но это также может быть удобно.

Внешний видимый сервер Если вы запустите сервер, вы заметите, что сервер доступен только с вашего компьютера, а не с любого другого в сети. Это значение по умолчанию, поскольку в режиме отладки пользователь приложения может выполнить произвольный код Python на вашем компьютере.

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

flask run --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 --permanent --add-port = 5000 / tcp, а затем sudo firewall-cmd --reload. затем запустите приложение колбы как - колба запустить --host = 0.0.0.0
Пинту Кумар
25

Попробуйте это, если метод 0.0.0.0 не работает

Скучный материал

Я лично много боролся за то, чтобы сделать мое приложение доступным для других устройств (ноутбуков и мобильных телефонов) через локальный сервер. Я попробовал метод 0.0.0.0, но не повезло. Затем я попытался изменить порт, но он просто не работал. Поэтому, попробовав несколько разных комбинаций, я пришел к этому, и это решило мою проблему развертывания моего приложения на локальном сервере.

меры

  1. Получите локальный IPv4-адрес вашего компьютера. Это можно сделать, набрав ipconfigв Windows, ifconfigLinux и Mac.

IPv4 (Windows)

Обратите внимание: вышеуказанный шаг должен выполняться на компьютере, на котором вы обслуживаете приложение, а не на компьютере, к которому вы обращаетесь к нему. Также обратите внимание, что адрес IPv4 может измениться, если вы отключитесь и снова подключитесь к сети.

  1. Теперь просто запустите приложение фляги с полученным IPv4-адресом.

    flask run -h 192.168.X.X

    Например, в моем случае (см. Изображение) я запустил его как:

    flask run -h 192.168.1.100

запустить приложение колбу

На моем мобильном устройстве

скриншот с моего мобильного телефона

Дополнительный материал

Если вы выполняете эту процедуру в Windows и используете Power Shell в качестве интерфейса командной строки и по-прежнему не можете получить доступ к веб-сайту, попробуйте команду CTRL + C в оболочке, в которой выполняется приложение. 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

Примечание: я сохранил приведенный выше код оболочки в getIP.ps1.

Cool.👌

nwillo
источник
1
Да! оно работает. я могу получить его на свой мобильный, установив ipv4 ip в колбу. надеюсь, это также поможет другим :)
Ашу Кумар
@nwillo do mobile, и машина, на которой я работаю, будет подключена к той же сети Wi-Fi.
Сачин Ратод
@ 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)
)            
mircealungu
источник
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.
Дживан Чайтанья
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 (командная строка) и выполните следующую команду: -

set 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

Ibz.Shaikh
источник
4

Если у вас возникают проблемы с доступом к вашему серверу Flask, развернутому с помощью PyCharm , примите во внимание следующее:

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

Вместо этого вы должны настроить сервер Flask с помощью Run Configurations, в частности, поместив --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 Server PyCharm в основном то, что я сделал, было создать новый сервер, но колбу, если не Python

Я надеюсь, что это поможет вам

Juanes30
источник
Пожалуйста, не просто опубликуйте изображение - опишите конкретно, что вы делаете, чтобы решить проблему.
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 = разработка

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

Ibz.Shaikh
источник
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

Саурабх
источник