Ngrok flask python как пользоваться
Перейти к содержимому

Ngrok flask python как пользоваться

  • автор:

Делаем локальный сервер доступным всему интернету

При разработке веб проекта (не важно на PHP, Django, Flask) бывают случаи когда необходимо быстро продемонстрировать его работу заказчику для уточнения деталей, а так как обычно разработка происходит на локальном компьютере разработчика, то необходимо предварительно выложить проект на удаленный сервер.

Было бы удобней просто дать заказчику временную ссылку, которая даст доступ к проекту запущенному локально у разработчика. Для этих целей есть инструмент ngrok, как его использовать описано в этой заметке.

Установка ngrok на Windows

ngrok доступен под все основные операционные системы, скачать его можно с https://ngrok.com/download. Под Windows доступна как установка через менеджер пакетов Chocolatey, так через скачивания zip архива.

После скачивания архива (содержащего всего один файл) его нужно просто распаковать. На этом собственно установка завершена.

Регистрируемся тут https://dashboard.ngrok.com/login и получаем токен.

Далее в командной строке Windows перейдем в папку с ngrok.exe и выполним команду:

ngrok config add-authtoken 21dwwv1C_ТУТ_ВАШ_ТОКЕН

Как пользоваться ngrok

Например, мы разрабатываем проект на Джанго используя тестовый сервер и хотим показать проект заказчику, как нам это сделать?

Запустим тестовый сервер python manage.py runserver , теперь проект доступен нам по адресу http://127.0.0.1:8000/

Далее в командной строке Windows перейдем в папку с ngrok.exe и выполним следующую команду:

ngrok http 8000

8000 — это порт на котором у нас запущен тестовый сервер Django.

В результате получаем такой вывод:

Вывод ngrok в консоль после запуска

http://f1ff-109-63-232-90.ngrok.io/ это адрес по которому наш локальный сервер доступен в интернете.

Наш тестовый сервер будет доступен по этому адресу до тех пор, пока мы не закроем окно консоли или не нажмем в ней Ctrl + C. После этого, чтобы сервер стал доступен вновь извне с помощью ссылки, нужно заново запустить ngrok.

Попробуем перейти по полученному адресу и уже увидим страницу Джанго, осталось только убрать эту ошибку:

Страница с ошибкой Django при использовании ngrok

Для этого в файле settings.py нашего проекта поправим директиву ALLOWED_HOSTS:

ALLOWED_HOSTS = [ '127.0.0.1', 'localhost', '.ngrok.io']

Перезапускаем сервер Django и теперь все ок:

Начальная страница Django при импользовании ngrok

Вот таким образом мы можем продемонстрировать процесс разработки заказчику.

Заключение

Описанное выше это не все, что можно сделать с помощью ngrok, например мы можем сделать доступ извне к нашей локально запущенной Postgresql (например на порту 5432). Для этого достаточно команды:

Далее мы получим вывод с данными доступа.

Более подробно о работе с ngrok лучше читать в официальной документации https://ngrok.com/docs

Категории

Свежие записи

  • Импорт/экспорт Linux WSL
  • Не печатаются заглавные буквы в PowerShell
  • 1С-Битрикс: Ошибка авторизации! Срок действия пароля истек, необходимо сменить пароль.
  • Несколько конфигураций для проекта Django
  • Django inclusion_tag с разными шаблонами
  • Декоратор @property в моделях Django

How to Run Python Flask App Online using Ngrok?

Ngrok is a tool that is used to create a secure tunnel between your local machine and the internet. It is used to test the web application and allows developers to expose their local web server to the internet without having to deploy it to a remote server. Python Flask allows you to create web applications locally but we might want to showcase it to the world by running it online. In this article, we will use the Ngrok tool to run the web application online without hosting it on any server.

The Steps to Run Python Flask App Online Using Ngrok are as follows −

Step 1: Install Ngrok

The first step is to download Ngrok in your local system. You can download Ngrok from its official website (https://ngrok.com/download). You can download it for your required operating System (Windows/macOS/Linux). Once you have downloaded the required system, simply extract the contents of the archive to the folder of your choice.

Step 2: Create a Flask App

Now once we have installed the Ngrok tool, we need to create a Flask App which we will use to Run using Ngrok. Create a new Python file `app.py` and write the code shown below to create a Flask app with a single route that returns the string “Hello World!” when the root URL is accessed.

from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return 'Hello, World!' if __name__ == '__main__': app.run(port=5000)

Step 3: Run the Flask App

After creating the Flask App we need to run the Flask App locally and check if the app is working correctly or not. To run the Flask app locally, simply run the below command in your terminal or command prompt.

Python app.py

To check if the App is working you can hit the `http://localhost:5000` on your browser and see the returned value by the App.

Step 4: Run Ngrok

To run Ngrok, open a new terminal window and navigate to the folder where you extracted the Ngrok archive. Then run the following command −

./ngrok http 5000

This command will start Ngrok and create a secure tunnel between your local machine and the internet. Ngrok will display a URL that you can use to access your Flask app from anywhere in the world.

Step 5: Access your Flask App Online

Once Ngrok is running, you can access your Flask app from anywhere by visiting the URL that Ngrok provided. For example, if Ngrok displayed the URL

https://c7d99d3c.ngrok.io, you can access your Flask app by visiting https://c7d99d3c.ngrok.io/ in your web browser.

Uses of Running Python Flask app using Ngrok

Running a Python Flask app using Ngrok has a wide range of applications in various scenarios. Some examples are −

  • Testing − When developers are working on a Flask application, they may want to test it on different devices to ensure that it works correctly and without any issues. Running a Flask app using Ngrok allows developers to test their applications on different devices, including mobile devices, without having to deploy the app to a remote server.
  • Demonstrating − Flask is a popular framework used for building web applications, and sometimes developers want to showcase their work to clients or stakeholders. Running a Flask app using Ngrok makes it easy to demonstrate the app to others without having to deploy it to a remote server.
  • Debugging − When developing a Flask application, developers may encounter errors or bugs that are difficult to reproduce locally. Running a Flask app using Ngrok allows developers to share the URL with other developers who can access the application remotely and help debug the issue.
  • Prototyping − Flask is a flexible framework that can be used for developing different types of applications. Running a Flask app using Ngrok allows developers to quickly prototype and test new features without having to deploy the app to a remote server.
  • Integration testing − Flask applications often interact with other third-party services, such as APIs. Running a Flask app using Ngrok allows developers to test the integration with third-party services in a real-world scenario.

Conclusion

In this article, we have discussed Running Python Flask App online using Ngrok. Using the Ngrok tool we can showcase our Flask app to anyone in the world without hosting it on any server. Ngrok simply exposes your local web server to the internet, making it ideal for testing and showcasing to anyone.

Using ngrok with Flask

This article assumes you have Python, PIP, and Flask already installed.

To share a local Flask development server with someone else, simply run: ngrok http 5000 .

Note: For users on the latest MacOS, there is an issue where the default port of 5000 is used by Apple AirPlay Receiver. You can use a different port for your Flask app or see this Stack Overflow post for disabling the AirPlay Receiver service.

Agent Management​

If you’re looking to natively embed the ngrok agent into your Flask development flow, you can leverage the pyngrok project so that a tunnel is created each time you type flask run .

Python SDK (beta)​

You can also use the beta ngrok Python SDK to start a tunnel to the Flask dev server via python code, or using a ngrok ASGI runner with an ASGI Wrapper.

  • ngrok SDK on PyPi
  • ngrok SDK on Github
  • Reference Documentation

Запуск web приложения на Flask в Colab

При быстром написании Python web приложений на Flask лень что-то устанавливать на локальном ПК. Хочется ,быстро запустить в облаке Google Colab без лишних танцев с бубнами и получить доступ к серверу по некоторому доменному имени.

Для проброса web обращений к приложению за NAT-ом есть немало сервисов. Наиболее популярный — ngrok. Альтернативный вариант localtunnel.

Ngrok для доступа к веб приложению снаружи

Самый простой вариант пробросить запущенный на локальных IP адресах сервер — использовать популярный сервер ngrok.

Вариант 1.

!pip install flask-ngrok from flask import Flask from flask_ngrok import run_with_ngrok app = Flask(__name__) run_with_ngrok(app) @app.route("/test") def home(): return "<h1>GFG is great platform to learn</h1>" app.run()

После выполнеия кода получим строчку вроде:

* Serving Flask app "__main__" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Running on http://1680e48e0f6a.ngrok.io * Traffic stats available on http://127.0.0.1:4040

В строке «Running on http://1680e48e0f6a.ngrok.io» — указан URL доступный снаружи.

Вариант 2.

Библиотека flask_ngrok довольно старая и она не поддерживает командую строку для запуска ngrok с параметрами, например, строкой авторизации или поддержкой subdomain.

Subdomain — очень важный параметр, позволяющий задать не рандомный домен третьего уровня в 1680e48e0f6a.ngrok.io, а заданный, например, test20210701.ngrok.io. Естественно, домен должен быть свободен.

Для запуска воспользуемся регулярно обновляемой и хорошо документируемой библиотекой pyngrok.

import os import threading !pip install pyngrok from flask import Flask from pyngrok import ngrok os.environ["FLASK_ENV"] = "development" app = Flask(__name__) port = 5000 #Setting an auth token allows us to open multiple tunnels at the same time ngrok.set_auth_token("&amp;amp;amp;amp;amp;amp;lt;YOUR_AUTH_TOKEN>") # Open a ngrok tunnel to the HTTP server public_url = ngrok.connect(port).public_url print(" * ngrok tunnel \"<>\" -> \"http://127.0.0.1:<>\"".format(public_url, port)) # Update any base URLs to use the public ngrok URL app.config["BASE_URL"] = public_url # Define Flask routes @app.route("/") def index(): return "Hello from Colab!" # Start the Flask server in a new thread threading.Thread(target=app.run, kwargs=).start()

После запуска кода получаем сообщение вида:

* ngrok tunnel "http://ae7250c89181.ngrok.io" -> "http://127.0.0.1:5000" * Serving Flask app "__main__" (lazy loading) * Environment: development * Debug mode: on

Если в строке соединения указать поддомен третьего уровня, который мы хотим получить

public_url = ngrok.connect(subdomain="foo20210701")

то получим сообщение об ошибке вида «Only paid plans may bind custom subdomains.\nFailed to bind the custom subdomain ‘foo20210701’ for the account ‘XXXXXX’.\nThis account is on the ‘Free’ plan.\n\nUpgrade to a paid plan at:»

Описание тарифных планов для ngork указано здесь. Минимальный тарифный план на котором можно использовать поддомены стоит 5 USD в мес.

Запуск Gunicorn на Colab

Gunicorn ‘Green Unicorn’ — это Python WSGI HTTP север для UNIX. Запустим этот сервер на Colab. Для начала создам простой тестовый Python web скрипт.

def generateWebApp(): text = "from flask import Flask\r\n"\ "app = Flask(__name__)\r\n"\ "\r\n"\ "@app.route(\"/\")\r\n"\ "def hello():\r\n"\ " return \"Hello Localtunnel\"\r\n"\ "\r\n"\ "if __name__ == \"__main__\":\r\n"\ " app.run()\r\n" #print(text) with open('webapp.py', 'w') as f: f.write(text) generateWebApp()
!pip install gunicorn !gunicorn --workers 2 -b localhost:8000 webapp:app

После запуска gunicorn в Colab получим такой результат:

[2021-07-04 03:16:34 +0000] [332] [INFO] Starting gunicorn 20.1.0 [2021-07-04 03:16:34 +0000] [332] [INFO] Listening at: http://127.0.0.1:8000 (332) [2021-07-04 03:16:34 +0000] [332] [INFO] Using worker: sync [2021-07-04 03:16:34 +0000] [335] [INFO] Booting worker with pid: 335 [2021-07-04 03:16:34 +0000] [336] [INFO] Booting worker with pid: 336 [2021-07-04 03:23:47 +0000] [332] [INFO] Handling signal: int [2021-07-04 03:23:47 +0000] [335] [INFO] Worker exiting (pid: 335) [2021-07-04 03:23:47 +0000] [336] [INFO] Worker exiting (pid: 336) [2021-07-04 03:23:47 +0000] [332] [INFO] Shutting down: Master

Все запускается, но встает вопрос как обратится к веб скрипту запущенному в Colab под gunicorn снаружи, чтобы можно было обратится к нему по некоторому фиксированому поддомену.

Запуск localtunnel на Colab

Здесь на помощь придет localtunnel. В нем, в отличие от ngrok можно создавать subdomain бесплатно, что полезно для решения коротких тестовых задач.

localtunnel создает обратный SSH-туннель к публичному сервису обратного туннелирования, чтобы пробросить наружу локальный сервер. В данном случае Gunicorn поднят на 8000 порту на виртуальной машине Colab и нам надо пробросить к нему снаружи все обращения с домена с фиксированным именем https://smarthome161075.loca.lt.

Важный момент, в аргументе localtunnel в имени subdomain можно использовать ТОЛЬКО строчные символы. Иначе localtunnel не стартует. Ошибку не выдает.

#Deploy localtunnel on Colab !npm install -g localtunnel !lt --port 8000 --subdomain smarthome161075

В результатах получим сообщение:

your url is: https://smarthome161075.loca.lt

Все отрабатывает, но вот незадача, оба процесса Gunicorn и localtunnel стартуют в Colab как однозадачные, а нам надо, чтобы они работали параллельно.

Запуск нескольких процессов в Colab

Нам нужно, чтобы обе команды запуска Gunicorn и localtunnel отрабатывали независимо друг от друга. Для этого воспользуемся UNIX командой nohup. Например, чтобы запустить localtunnel как фоновый процесс нужно выполнить в Colab следующую команду:

!nohup lt —port 8000 —subdomain $domainName > lt.log 2>&1 &

При запуске localtunnel таким образом Colab запустит его в виде фонового процесса. В lt.log будут переадресованы все выводы localtunnel. Поскольку при запуске процесса таким образом мы не можем остановить его штатными средствами Colab, для того, чтобы его удалить придется воспользоваться командой kill. Но для её выполнения нужно получить PID запущенного процесса. Это делается следующим образом:

!ps -ef | grep lt

В результатах вывода получим что-то вроде:

root 52 1 0 03:46 ? 00:00:08 /usr/local/bin/dap_multiplexer --domain_socket_path=/tmp/debugger_bi5ptuks4 root 793 62 0 04:37 ? 00:00:00 /bin/bash -c lt --port 8000 --subdomain smarthome161075 > lt.log 2>&amp;amp;amp;amp;amp;amp;amp;1 root 794 793 0 04:37 ? 00:00:00 node /tools/node/bin/lt --port 8000 --subdomain smarthome161075 root 1107 62 0 05:29 ? 00:00:00 /bin/bash -c ps -ef | grep "lt" root 1109 1107 0 05:29 ? 00:00:00 grep lt

Искомый процесс запущен с PID = 794. Для его принудительного завершения используем команду:

!kill 794

Аналогичным образом можем запустить в Colab Gunicorn как фоновый процесс:

!nohup gunicorn —workers 2 -b localhost:8000 webapp:app > gunicorn.log 2>&1 &
!ps -ef | grep gunicorn

В логе gunicorn.log получим всю информацию о PID-ах запущенных worker-ов. Или посмотреть процессы можно в результатах выдачи -ps:

root 360 1 0 04:06 ? 00:00:00 [gunicorn] &amp;amp;amp;amp;amp;amp;lt;defunct> root 515 1 0 04:24 ? 00:00:00 [gunicorn] &amp;amp;amp;amp;amp;amp;lt;defunct> root 599 1 0 04:28 ? 00:00:00 [gunicorn] &amp;amp;amp;amp;amp;amp;lt;defunct> root 779 1 8 04:37 ? 00:00:00 /usr/bin/python3 /usr/local/bin/gunicorn --workers 2 -b localhost:8000 webapp:app root 785 779 3 04:37 ? 00:00:00 /usr/bin/python3 /usr/local/bin/gunicorn --workers 2 -b localhost:8000 webapp:app root 786 779 3 04:37 ? 00:00:00 /usr/bin/python3 /usr/local/bin/gunicorn --workers 2 -b localhost:8000 webapp:app root 787 62 0 04:37 ? 00:00:00 /bin/bash -c ps -ef | grep "gunicorn" root 789 787 0 04:37 ? 00:00:00 grep gunicorn

Видим, что основной процесс с PID = 779 породил два дочерних процесса (workers), как заказывали, с PID: 785, 786. Срубив основной процесс с PID = 779 дочерние процессы также останавливаются.

Не очень удобно так останавливать запущенные процессы, поэтому воспользуемся штатным функционалом Colab для запуска процесса Gunicorn и localtunnel.

import threading def execLocalTunnel(domainName): print("Exec localtunnel with domain name:", domainName) !lt --port 8000 --subdomain $domainName > lt.log 2>&amp;amp;amp;amp;amp;amp;1 if __name__ == '__main__': my_thread = threading.Thread(target=execLocalTunnel, args=("smarthome161075",)) my_thread.start()

При таком запуске localtunnel из-под Colab есть возможность остановить запущенный процесс нажав на крестик воле него.

По аналогии запустим Gunicorn под Colab:

def execGunicorn(port = 8000): print("Exec localtunnel with port:", port) !gunicorn --workers 2 -b localhost:$port webapp:app > gunicorn.log 2>&amp;amp;amp;amp;amp;amp;1 &amp;amp;amp;amp;amp;amp; if __name__ == '__main__': gunicorn_thread = threading.Thread(target=execGunicorn, args=(8000,)) gunicorn_thread.start()

Теперь можно запускать веб сервер на Colab и давать к нему доступ снаружи используя фиксированное имя домена, что удобно при отладке сервисов, чтобы не «городить огород» с контейнерами docker и пр.

Список литературы

  • Все приведенные в статье примеры работы с web сервером Flask на Google Colab.
  • 4 лучшие альтернативы для ngrok.
  • How to Deploy Web Application from Home.
  • https://docs.gunicorn.org/en/stable/
  • https://towardsdatascience.com/quickly-share-ml-webapps-from-google-colab-using-ngrok-for-free-ae899ca2661a
  • https://pyngrok.readthedocs.io/en/latest/integrations.html
  • https://ngrok.com/docs
  • https://www.geeksforgeeks.org/how-to-run-flask-app-on-google-colab/
  • https://towardsdatascience.com/how-to-deploy-ml-models-using-flask-gunicorn-nginx-docker-9b32055b3d0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *