Есть очень простое требование: написать 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
илиpipenv
FastApi можно установить:
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