Настройка Flask-разработчика для доступности в сети
Я не совсем уверен, является ли это проблемой, специфичной для Flask, но когда я запускаю приложение в режиме разработки (http://localhost:5000), я не могу получить к нему доступ с других машин в сети (по адресу http://[dev-host-ip]:5000). Например, с Rails в режиме разработки всё работает нормально. Я не смог найти документацию по настройке сервера разработки Flask. Есть идеи, что нужно настроить, чтобы это заработало?
5 ответ(ов)
Если вы используете исполняемый файл flask
для запуска вашего сервера, добавьте --host=0.0.0.0
к команде flask run
, чтобы изменить настройку по умолчанию с 127.0.0.1 и открыть доступ для не локальных соединений.
По умолчанию сервер доступен только с вашего компьютера, и не может быть открыт для других устройств в сети. Это связано с тем, что в режиме отладки пользователь приложения может выполнять произвольный код Python на вашем компьютере.
Если вы отключили отладчик или доверяете пользователям в вашей сети, вы можете сделать сервер общедоступным, просто добавив --host=0.0.0.0
в командной строке:
$ flask run --host=0.0.0.0
Это указывает вашей операционной системе слушать на всех публичных IP-адресах.
Чтобы запустить ваше приложение Flask на всех доступных интерфейсах, добавьте host='0.0.0.0'
в вызов app.run()
. Это позволит вашему приложению принимать запросы не только с локального компьютера, но и с других устройств в сети.
Вот пример кода, как это должно выглядеть:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Если при запуске приложения вы получаете ошибку OSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
, это может означать, что у вас нет разрешения на использование указанного порта, или другой процесс уже использует этот порт. Чтобы выяснить, чем занят порт 5000, вы можете воспользоваться командой:
netstat -na | findstr 5000
Эта команда покажет вам, если что-то другое использует 5000 порт, и вы сможете принять меры, такие как окончание процесса или выбор другого порта для вашего приложения.
Чтобы проверить, открыт ли определённый порт на сервере для обслуживания клиента в Ubuntu или другой дистрибуции Linux, вы можете выполнить следующие шаги:
Включите UFW (Uncomplicated Firewall), если он ещё не включён:
sudo ufw enable
Разрешите доступ к нужному порту. Например, для порта 5000 используйте следующую команду:
sudo ufw allow 5000/tcp
Это позволит серверу обрабатывать запросы на порту 5000.
Настройте ваше приложение для обработки удалённых запросов. Запустите его с помощью параметра
host='0.0.0.0'
, чтобы ваше приложение слушало на всех интерфейсах:app.run(host='0.0.0.0', port=5000)
Теперь запустите приложение в фоновом режиме:
python3 app.py &
После выполнения этих шагов ваш сервер будет готов принимать входящие подключения на порту 5000. Вы можете использовать утилиты, такие как netstat
или ss
, чтобы проверить, что порт действительно открыт:
sudo netstat -tuln | grep 5000
или
sudo ss -tuln | grep 5000
Если вы видите строку с 0.0.0.0:5000
, это означает, что порт открыт и ваше приложение работает.
Если ваше приложение cool
загружает конфигурацию из внешнего файла, как показано в следующем примере, не забудьте обновить соответствующий конфигурационный файл, добавив строку HOST="0.0.0.0"
:
cool.app.run(
host=cool.app.config.get("HOST", "localhost"),
port=cool.app.config.get("PORT", 9000)
)
Это важно для того, чтобы приложение слушало на всех интерфейсах и было доступно извне.
Чтобы создать файл .flaskenv
в корневом каталоге вашего проекта, выполните следующие действия:
- Создайте файл с именем
.flaskenv
в корне вашего проекта. - Вставьте в него следующие параметры:
FLASK_APP=app.py
FLASK_ENV=development
FLASK_RUN_HOST=[ip-адрес-разработчика]
FLASK_RUN_PORT=5000
Если у вас есть виртуальное окружение, активируйте его и выполните команду:
pip install python-dotenv
Этот пакет будет использовать файл .flaskenv
, и переменные, объявленные в нем, будут автоматически импортированы в различных сеансах терминала.
После этого вы можете запустить приложение с помощью команды:
flask run
Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!
Возврат JSON-ответа из представления Flask
Как обслуживать статические файлы в Flask
Как получить именованные параметры из URL с помощью Flask?
Как получить доступ к строке запроса в маршрутах Flask?
Как изменить порядок столбцов в DataFrame?