flask - fastapi    (python 异步API 框架  可以自动生成swagger 文档)  常用示例:

之前使用 flask 需要手动写文档, 这个可以自动生成,

fastapi 0.82.0
pydantic 1.10.2
python-multipart 0.0.5
uvicorn 0.18.3

swagger-ui      http://127.0.0.1:5555/docs

参数可选:

@app.post("/blog/add", tags=["blog"])  # 指定命名空间
async def add_blog_api(content: str = Form(...),
operator: str = Form(...),
# img: UploadFile = File(...)):
img: Optional[UploadFile] = None): # 可选参数
img_url = None
if img:
out_img_dir = compress_img(img.file, quality=20)
img_url = upload_file(url=UPLOAD_FILE_URL, file_path=out_img_dir)
print("img url " + str(img_url))
os.remove(path=out_img_dir)
print(img_url)
blog = add_blog(content=content, img=img_url, operator=operator)
print("post data " + str(blog))
return str(blog)

常用示例 (python3.8 )

 pip install fastapi
pip install uvicorn
pip install python-multipart
添加跨域:
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI(title="Sea test API")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
 
# -*- coding:utf-8 -*-
# file_name : base_test.py
# Author : Sea
# Time : 2022-09-06 15:03:12
# pip install fastapi
# pip install uvicorn
# pip install python-multipart
############################################
from typing import Optional, Union from fastapi import FastAPI, UploadFile, File, Query, Form, Request
import uvicorn
from pydantic import BaseModel app = FastAPI() # ************ get method ***************
@app.get("/")
async def index(xx: str, req: Request):
print(" 可以通过request 获取一切参数 xx" + str(req.query_params)) # xxxx=13
print(" 可以通过request 获取一切参数 xx" + str(req.form()))
print(" 可以通过request 获取一切参数 xx" + str(req.headers))
return {"name": "哈哈哈"} @app.get("/user/{user_id}")
async def get_user(user_id: Union[int, str], name: Optional[str] = None):
"""通过 Union 来声明一个混合类型,int 在前、str 在后。会先按照 int 解析,解析失败再变成 str
然后是 name,它表示字符串类型、但默认值为 None(不是字符串),那么应该声明为 Optional[str]"""
return {"user_id": user_id, "name": name} # Query 里面除了限制最小长度和最大长度,还有其它的功能
@app.get("/user", tags=["user"])
async def check_length(
password: str = Query(default="satori", min_length=6, max_length=15, regex=r"^satori")
):
"""此时的 password 默认值为 'satori',并且传递的时候必须要以 'satori' 开头
但是值得注意的是 password 后面的是 str,不再是 Optional[str],因为默认值不是 None 了
当然这里即使写成 Optional[str] 也是没有什么影响的
"""
return {"password": password} # ****** post method *********
class Car(BaseModel):
name: str # //必选参数
weight: Optional[str] = None # //可选参数
price: float # //必选参数
length: Optional[float] = None # ******文件上传 post json ******
@app.post("/car/", tags=["car"])
async def create_item(car: Car):
return car # 表单提交 + 文件上传 # 如果要上传多个文件 files: List[bytes] = File(...) or files: List[UploadFile] = File(...)):
@app.post("/files")
async def create_file(
file1: bytes = File(...),
file2: UploadFile = File(...),
token: str = Form(...),
username: str = Form(...), # 表单
password: str = Form(...)):
file = file2.file
return {
"filesize": len(file1),
"token": token,
"oen_content_type": file2.content_type
} # ****** put method ******
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None @app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: Optional[str] = None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q": q})
return result if __name__ == "__main__":
# 启动服务,因为我们这个文件叫做 base_test.py,所以需要启动 base_test.py 里面的 app
# 第一个参数 "base_test:app" 就表示:当前文件名字 ,然后是 host 和 port 表示监听的 ip 和端口
uvicorn.run(app, host="0.0.0.0", port=5555)

get  post   body  header  ...

class Item(BaseModel):
id: str
title: str @app.post("/body")
async def get_body(item: Item, request: Request):
myjson = await request.json() # dict
res = {
# 获取 Request Body
"body": await request.json(),
"body_bytes": await request.body()
}
print(type(myjson))
return res

 统一数据检验

#!/usr/bin/env python3
import time
from typing import Optional
import uvicorn
from fastapi import FastAPI, Request
from fastapi.exceptions import RequestValidationError
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from fastapi.responses import JSONResponse
# ------------------------- API ------------------------------
app = FastAPI(title="Sea test API")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
) @app.get("/airline/test", tags=["Sea"])
def base_test_api():
return {"你好": "今天天气不错!"} """
统一异常处理 (数据校验)
"""
@app.exception_handler(RequestValidationError)
async def request_validation_exception_handler(request: Request, exc: RequestValidationError):
print(f"参数不对{request.method} {request.url}")
return JSONResponse({"code": "2003", "message": exc.errors()}) class FlightInfo(BaseModel):
flight: str # 必填
origin: Optional[str] = None # 可选参数
destination: str
etd: str
eta: str = None @app.post("/airline/add_flight", tags=["Sea"])
async def add_flight_schedule(flight: FlightInfo, req: Request):
if flight:
body = await req.json()
print(body)
body["_id"] = time.strftime('%Y-%m-%d') + str(flight.flight)
body["ts"] = int(time.time())
body["query_date"] = time.strftime('%Y-%m-%d %T')
return {"code": "200", "message": "ok"} if __name__ == '__main__':
uvicorn.run(app, host='0.0.0.0', port=7500)

数据嵌套 LIst[Bean]

from typing import Optional, Union, List
import uvicorn
from fastapi import FastAPI, Body
from pydantic import BaseModel, HttpUrl
app = FastAPI()
class Image(BaseModel):
name: str
url: HttpUrl
class Person(BaseModel):
name: str
desc: Optional[str] = None
year: List[int]
img: Union[List[Image], None] = None
@app.post("/item")
async def create_item(person: Person = Body(embed=True)):
return person
if __name__ == '__main__':
uvicorn.run(app=app, host="0.0.0.0", debug=True)
整合eureka (pip install py_eureka_client)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @mail : lshan523@163.com
# @Time : 2022/9/8 15:53
# @Author : Sea
# @File : fastapi_euraka.py
# @history:
# pip install py_eureka_client
# ****************************
import base64
import uvicorn
from fastapi import FastAPI
from fastapi.responses import FileResponse
import py_eureka_client.eureka_client as eureka_client
import socket # 获取ip
def extract_ip():
st = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
st.connect(('10.255.255.255', 1))
ip = st.getsockname()[0]
except Exception:
ip = '127.0.0.1'
finally:
st.close()
return ip server_port = 9090
server_host = extract_ip()
# 配置eureka
eureka_client.init(eureka_server="http://root:root@hadoop002:8761",
app_name="fastapi_euraka-app",
instance_port=server_port,
instance_host=server_host) app = FastAPI(title="Sea test python euraka") @app.get("/hello/{name}")
def say_hello(name: str):
return {"message": f"Hello {name}"} @app.post("/picture")
def get_picture():
return FileResponse('/home/sea/img/test.png') # return ase64
@app.get("/base64img")
def get_picture():
with open('/home/sea/img/test.png', mode='rb') as file:
read = file.read()
image_base64 = base64.standard_b64encode(read)
return {"image": str(image_base64)} if __name__ == '__main__':
eureka_client.get_client()
uvicorn.run(app, host="0.0.0.0", port=5000)
 

打开swagger文档:

127.0.0.1:5555/docs

整合nacos:

import nacos
import uvicorn
from fastapi import FastAPI
from fastapi.responses import JSONResponse
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from suds.client import Client
from suds.transport.https import HttpAuthenticated client=nacos.NacosClient('172.16.244.200:8848',namespace='8b6f08b7-b09c-4181-bcac-1505fba5e1aa') async def beat():
client.add_naming_instance('fastapi-service','172.16.244.10',8000,group_name='dev') # 微服务注册nacos
def register_nacos():
client.add_naming_instance('fastapi-service','172.16.244.10',8000,group_name='dev') app=FastAPI() # 微服务注册
register_nacos() @app.on_event('startup')
def init_scheduler(): scheduler = AsyncIOScheduler(timezone="Asia/Shanghai")
scheduler.add_job(beat, 'interval', seconds=5)
scheduler.start() @app.get('/sap/materials')
async def sap_materials():
''' 功能实现'''
return JSONResponse({'code':1000,'msg':'succ','data':data},status_code=200)

要注意的几点

group_name要与其他java微服务配置要一致 写的不正确 spring cloud gateway 提示404错误

timezone='Asia/Shangai'  不加启动时会提示时区用utc

flask - fastapi (python 异步API 框架 可以自动生成swagger 文档) 常用示例 以及整合euraka nacos的更多相关文章

  1. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)

    一.Django中的缓存: 前戏: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一 ...

  2. Web API 自动生成帮助文档并使用Web API Test Client 测试

    之前在项目中有用到webapi对外提供接口,发现在项目中有根据webapi的方法和注释自动生成帮助文档,还可以测试webapi方法,功能很是强大,现拿出来与大家分享一下. 先看一下生成的webapi文 ...

  3. Web Api 自动生成帮助文档

    Web Api 自动生成帮助文档   新建Web Api项目之后,会在首页有API的导航菜单,点击即可看到API帮助文档,不过很遗憾,Description 是没有内容的. 怎么办呢? 第一步: 如果 ...

  4. Spring Boot(九)Swagger2自动生成接口文档和Mock模拟数据

    一.简介 在当下这个前后端分离的技术趋势下,前端工程师过度依赖后端工程师的接口和数据,给开发带来了两大问题: 问题一.后端接口查看难:要怎么调用?参数怎么传递?有几个参数?参数都代表什么含义? 问题二 ...

  5. drf07 过滤 排序 分页 异常处理 自动生成接口文档

    4. 过滤Filtering 对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持. pip install django-filter 在配置文件sett ...

  6. Spring Boot Swagger2自动生成接口文档

    一.简介 在当下这个前后端分离的技术趋势下,前端工程师过度依赖后端工程师的接口和数据,给开发带来了两大问题: 1.问题一.后端接口查看难:要怎么调用?参数怎么传递?有几个参数?参数都代表什么含义? 2 ...

  7. drf频率源码、自动生成接口文档、JWT

    目录 一.drf频率源码分析 二.自动生成接口文档 1 安装依赖 2 设置接口文档访问路径 3 文档描述说明的定义位置 4 访问接口文档网页 三.JWT 1 JWT基本原理 1.1 header 1. ...

  8. day74:drf:drf其他功能:认证/权限/限流/过滤/排序/分页/异常处理&自动生成接口文档

    目录 1.django-admin 2.认证:Authentication 3.权限:Permissions 4.限流:Throttling 5.过滤:Filtering 6.排序:OrderingF ...

  9. rbac介绍、自动生成接口文档、jwt介绍与快速签发认证、jwt定制返回格式

    今日内容概要 RBAC 自动生成接口文档 jwt介绍与快速使用 jwt定制返回格式 jwt源码分析 内容详细 1.RBAC(重要) # RBAC 是基于角色的访问控制(Role-Based Acces ...

  10. webAPI 自动生成帮助文档

    之前在项目中有用到webapi对外提供接口,发现在项目中有根据webapi的方法和注释自动生成帮助文档,还可以测试webapi方法,功能很是强大,现拿出来与大家分享一下. 先看一下生成的webapi文 ...

随机推荐

  1. VUE中如何使用MOCK

    安装mockjs npm install mockjs 可以使用数据模板生成模拟数据. Mock.mock( rurl?, rtype?, template ) ) // 或者 Mock.mock( ...

  2. pgsql临时表

    with ete as ( SELECT * from table_name ) SELECT * from ete

  3. ThinkPHP3.2设置异常页面404跳转

    在ThinkPHP3.2版本中当我们访问不存在的页面时会出现非常不友好错误提示页面. 解决办法: 1.在ThinkPHP3.2详细的介绍了该框架下的ThinkPHP惯例配置文件convention.p ...

  4. 杭电 oj 第几天?

    Problem Description 给定一个日期,输出这个日期是该年的第几天.   Input 输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input , ...

  5. JS篇(003)-请用 js 去除字符串空格?

    答案:replace 正则匹配方法.str.trim()方法.JQ 方法:$.trim(str)方法 解析: 方法一:replace 正则匹配方法 去除字符串内所有的空格:str = str.repl ...

  6. 非线性优化-SLAM14CP6

    在前声明下面有一部分直接引用高翔老师SLAM14讲中的内容.因为我实在是看不懂.临时放在这里.以后有用到再做详细研究. 在SLAM14讲的CP2中第一次引入运动方程以及观测方程来描述物体带着传感器在空 ...

  7. Unity Editor 扩展入门1

    教程来源:https://www.youtube.com/watch?v=491TSNwXTIg&t=204s 一个点击物体修改材质颜色的简单editor扩展工具 using UnityEng ...

  8. python机器学习——PCA降维算法

    背景与原理: PCA(主成分分析)是将一个数据的特征数量减少的同时尽可能保留最多信息的方法.所谓降维,就是在说对于一个$n$维数据集,其可以看做一个$n$维空间中的点集(或者向量集),而我们要把这个向 ...

  9. Flutter Web预览时白屏解决方法

    原因是因为运行 flutter run 是自动选择渲染器 桌面端WEB浏览器默认使用  CanvasKit渲染器 移动端WEB浏览器默认使用  HTML渲染器 问题就出在了CanvasKit渲染器,他 ...

  10. char和int的类型转换

    char类型是16位的,底层采用unicode编码保存.char类型是可以直接赋值给int类型的,因为是16位到32位低到高.举个例子比如int i='1';打印i的值是49.char类型跟int类型 ...