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. flex布局,均分的剩余空间不等分问题

    flex布局:使用flex-grow均分剩余空间,每个盒子都要给个初始宽度,才能均分

  2. tp3.2 写入日志

    function logs($content, $subDir = ''){ $subDir = trim($subDir, '/\\'); if (empty($content)) return f ...

  3. VUE学习-编译到浏览器

    vue文件时怎样编译运行到浏览器的 http://www.manongjc.com/article/21832.html 通过vue-loader,解析.vue文件,在webpack解析,拆解vue组 ...

  4. WindowsServer2012搭建FTP服务器站点

    公司需要搭建一个FTP服务器给银行推送账单,这个文章整理的比较详细,可以参考 数据来源: https://blog.csdn.net/u010483330/article/details/125931 ...

  5. Ubuntu 20.04 部署Prmoetheus+grafana+mysql+mysqld_exporter+node_exporter

    Prometheus简介 Prometheus是一个功能强大的开源监控系统,可从您的服务中收集指标并将其存储在时间序列数据库中.它通过Grafana等工具提供多维数据模型,灵活的查询语言和多样化的可视 ...

  6. 在控制台中输入msqyl一直报ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost'错误

    错误: 在绿色Mysql的bin文件下打开cmd,输入mysql,一直报ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' ...

  7. 记录一次echarts 中bar 定时跳跃并显示内容

    查看echarts api -----   https://www.echartsjs.com/zh/api.html#echarts 搜索 1.dispatchAction   执行的关键 2.hi ...

  8. AIGC 至少能在两个方面改变当前的世界-纯银

    互联网圈一个正在形成的共识是,web3 只是金融领域的创新,还没有任何征兆能进入大众社会,但 AIGC 对世界的改变正在眼前发生.AIGC 至少能在两个方面改变当前的世界.1.对于缺乏创造力的(文字) ...

  9. CMD输出文本文件内容的type指令(替代Linux的cat指令)

    :: 本脚本的所有指令本身不输出到屏幕 @echo off :: 打印文本文件内容并匹配关键字,结果不输出到屏幕 type result.txt | find "error" &g ...

  10. 【Android HttpClient引入】感慨下自己看的Android教程有点老了

    教程看到使用HttpClient,发现没有继承该类. 原因是API23即在Android 6.0(API 23) 后,Google已经移除了Apache HttpClient 相关类,推荐使用Http ...