#python #fastapi
Вопрос:
Мы можем запустить любой скрипт на python, выполнив:
python main.py
Можно ли сделать то же самое, если бы сценарий был приложением FastApi?
Что-то вроде:
python main.py ПОЛУЧИТЬ /login.html
Чтобы вызвать метод GET, который возвращает login.html страница.
Если нет, то как я мог бы запустить приложение FastApi без использования Uvicorn или другого веб-сервера?
Я бы хотел, чтобы скрипт можно было запускать только при необходимости.
Спасибо
Комментарии:
1. Какова ваша реальная цель, если метод входа вызывается вне веб-контекста? Обычно вы делаете это, реструктурируя свой код таким образом, чтобы части, которые вы хотите использовать как в контексте командной строки, так и в веб-контексте, не зависели от самих представлений.
2. Вход в систему был только примером, а не целью.
3. Да, но возникает вопрос: какова ваша цель для вызова конечной точки вне веб-контекста? Трудно дать хороший ответ, не зная, почему вы хотите это сделать; если вы хотите протестировать свою платформу извне, для этого есть специальные тестовые клиенты; если вы хотите вызывать код в контексте cli, вам следует переместить общий код за пределы самой конечной точки. Если вы хотите выполнить какую-то другую задачу, возможно, лучше вызвать ее из-за пределов FastAPI. Это зависит от того, чего вы хотите достичь и почему.
Ответ №1:
FastApi разработан, чтобы позволить вам создавать API, которые можно запрашивать с помощью HTTP-клиента, а не напрямую запрашивать эти API самостоятельно; однако технически я считаю, что вы могли бы это сделать.
При запуске сценария вы можете запустить приложение FastApi в другом процессе, работающем в фоновом режиме, а затем отправить ему запрос.
import subprocess
import threading
import requests
url = "localhost/some_path"
# launch sub process in background task while redirecting all output to /dev/null
thread = threading.Thread(target=lambda: subprocess.check_output(["uvcorn", "main:app"]))
thread.start()
response = requests.get(url)
# do something with the response...
thread.join()
Очевидно, что в этом фрагменте есть МНОГО возможностей для улучшения, например, поток никогда не закончится, если не произойдет что-то плохое, это всего лишь минимальный пример.
Этот метод имеет явный недостаток-запуск API каждый раз, когда вы хотите выполнить команду. Лучшим подходом было бы эмулировать такие приложения, как Docker, в которых вы запускали бы демона локального сервера, который затем проверяли бы с помощью приложения командной строки.
Это означало бы, что API будет работать намного дольше в фоновом режиме, но обычно эти API довольно легкие, и вы не должны замечать и влиять на производительность вашего компьютера. Это также обеспечивает преимущество одновременного выполнения команды несколькими пользователями.
Если вы использовали первый предыдущий метод, вы можете столкнуться с ситуациями, когда пользователь A отправляет запрос GET, запускает сервер, используя комбинацию настроенных портов хоста. Когда пользователь B попытается выполнить ту же команду сразу после этого, он не сможет запустить сервер. и выполните запрос.
Это также позволит вам в конечном итоге перенести API на внешний сервер с минимальными усилиями в дальнейшем. Все, что вам нужно будет сделать, это изменить базовый URL-адрес запросов.
TLDR; Запустите приложение FastApi как демон и вместо этого запросите локальный сервер из программы командной строки.
Комментарии:
1. Спасибо, но этот код вызывает Uvicorn. Я спросил, НЕ используя Uvicorn или другой веб-сервер.
2. Тогда нет, API по своей конструкции является веб-сервером, если вы не хотите упаковать всю логику сервера, подключения к базе данных и т. Д. В отдельную библиотеку, Которую вы также использовали бы в приложении командной строки, вам нужно будет запустить API на веб-сервере.