Можно ли запустить fastapi в командной строке?

#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 на веб-сервере.