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

задняя часть Python

Есть очень простое требование: написать HTTP-интерфейс, отправить строку JSON методом POST, прочитать отправленные параметры в интерфейсе, обработать один из параметров и вернуть его.

Если мы используем Flask для разработки этого интерфейса, то код будет таким:

from flask import Flask, request

app = Flask(__name__)


@app.route('/insert', methods=['POST'])
def insert():
    info = request.json
    name = info['name']
    age = info['age']
    age_after_10_years = age + 10
    msg = f'此人名叫:{name},10年后,此人年龄:{age_after_10_years}'
    return {'success': True, 'msg': msg}

Код уже выглядит чистым. мы используемrequestsОтправьте запрос, чтобы увидеть эффект, как показано на следующем рисунке:

Это выглядит хорошо.

Сейчас наделаю порчу, положуageИзмените поле на строку и запустите его снова:

Как и ожидалось, было сообщено об ошибке.

Теперь мы ставимageПоле изменено обратно на число, но удалено напрямуюnameПоле:

Ошибка снова.

Чтобы предотвратить незаконную отправку данных пользователями, мы должны оценивать различные аномальные данные в интерфейсе. Таким образом, код после добавления решения усложняется:

@app.route('/insert', methods=['POST'])
def insert():
    info = request.json
    name = info.get('name', '')
    if not name:
        return {'success': False, 'msg': 'name 参数不可省略,不可为空!'}
    age = info.get('age', 0)
    if not isinstance(age, int):
        return {'success': False, 'msg': 'age参数不是数字!'}
    age_after_10_years = age + 10
    msg = f'此人名叫:{name},10年后,此人年龄:{age_after_10_years}'
    return {'success': True, 'msg': msg}

Кажется, что с Flask, хотя можно написать проект с очень коротким кодом. Но чтобы написать проект, который можно использовать, вам все равно нужно написать больше кода самостоятельно.

Давайте взглянем на современные веб-фреймворки:FaskApiНасколько можно упростить этот проект:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class People(BaseModel):
    name: str
    age: int
    address: str
    salary: float
    
@app.post('/insert')
def insert(people: People):
    age_after_10_years = people.age + 10
    msg = f'此人名字叫做:{people.name},十年后此人年龄:{age_after_10_years}'
    return {'success': True, 'msg': msg}

Мы по-прежнему используем запросы для отправки сообщения в HTTP-интерфейс, разработанный FastApi. Для обычных данных, обычное использование:

Теперь мы ставимageИзмените поле на строку:

Вернись к дружеской подсказке, скажи мне类型错误:age 字段不是 integer.

Давай попробуем ещеnameУдалены поля:

Верните дружественную информацию, подскажите值错误:name字段丢失.

На протяжении всего процесса проверка типов выполняется самим FastApi. Мы экономим много времени.

Я использую Flask уже четыре года, но после использования FastApi в течение 5 минут я решил больше не использовать Flask.

Давайте вернемся и познакомим вас с FastApi.

использоватьpipилиpipenvFastApi можно установить:

pip install fastapi
pipenv install fastapi

После завершения установки давайте завершим первый API:

from fastapi import FastAPI

app = FastAPI()


@app.get('/')
def index():
    return {'message': '你已经正确创建 FastApi 服务!'}

Написание здесь почти такое же, как у Flask. Просто во Flask мы определяем декоратор маршрута как@app.route('/'). а тут так написано@app.get('/')

Как показано ниже:

После написания кода нам нужно использоватьuvicornдля запуска FastApi. первое использованиеpipилиpipenvУстановитьuvicorn:

pip install uvicorn
pipenv install uvicorn

Затем выполните команду:

uvicorn main:app --reload

вmainозначает, что наш кодовый файлmain.py,appПредставляет имя объекта FastApi, который мы инициализировали.--reloadПараметр указывает, что он вступит в силу сразу после изменения кода, перезагрузка не требуется.

После запуска команды мы получаем доступhttp://127.0.0.1:8000Вы можете видеть, что интерфейс корректно возвращает данные в формате JSON:

Так как же определить метод GET с параметрами? Напишем еще один кусок кода:

@app.get('/query/{uid}')
def query(uid):
    msg = f'你查询的 uid 为:{uid}'
    return {'success': True, 'msg': msg}

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

Что, если вы хотите ограничить uid только числами, а не строками? Вам просто нужно добавить еще 4字符:

@app.get('/query/{uid}')
def query(uid: int):
    msg = f'你查询的 uid 为:{uid}'
    return {'success': True, 'msg': msg}

парная функцияqueryПараметры аннотируются типом, аннотируются типом int. Теперь давайте снова получим доступ к интерфейсу:

Когда параметр после запроса не является целым числом, обычно сообщается об ошибке.

Давайте еще раз взглянем на метод POST в начале этой статьи. При использовании Flask нам необходимо вручную проверить формат данных, отправленных пользователем POST, и правильность полей.

Но при использовании FastApi нам нужны только аннотации типов, чтобы решить все проблемы. Сначала мы импортируемfrom pydantic import BaseModel, затем наследуйтеBaseModelРеализуйте поля данных и форматы, которые мы разрешаем отправлять методу POST:

from pydantic import BaseModel

app = FastAPI()


class People(BaseModel):
    name: str
    age: int
    address: str
    salary: float

PeopleЭтот класс аннотирован по типу, с указанием его 4 полей и их типов. Теперь давайте реализуем метод POST:

@app.post('/insert')
def insert(people: People):
    age_after_10_years = people.age + 10
    msg = f'此人名字叫做:{people.name},十年后此人年龄:{age_after_10_years}'
    return {'success': True, 'msg': msg}

insertаргументы функцииpeopleЗадается аннотацией типа какPeopleтип.

Когда мы отправляем данные методом POST, FastApi автоматическиPeopleПоля, определенные в поле, используются в качестве эталона для проверки данных, и, если будет обнаружено, что они неверны, будет возвращено сообщение об ошибке.

FastApi не только упрощает разработку интерфейса, но и автоматически генерирует для нас документацию по интерфейсу. все посещаютhttp://127.0.0.1:8000/docs, вы можете видеть, что документ интерфейса был сгенерирован автоматически:

Этот интерфейс может не только просматривать, но и напрямую изменять образцы данных на странице интерфейса, отправлять запросы и тестировать на месте:

Выше приведено минимальное введение в FastApi. Заинтересованные студенты могут обратиться к егоофициальная документация

Наконец, позвольте мне сказать вам, что FastApi — это асинхронный веб-фреймворк, который очень, очень, очень быстр. Гораздо больше, чем Flask.

FastApi — один из самых быстрых веб-фреймворков. Скорость может соответствовать интерфейсу, написанному Golang. Подробное сравнение см.one of the fastest Python frameworks available