先吹一波: 原来写接口可以这么简单!!! 简单到没朋友 。

中文官网:https://fastapi.tiangolo.com/zh/tutorial/header-params/

且天然支持异步处理。

自动生成API文档,

还说比肩NodeJs和Go 、这个我就没有具体测试了,有兴趣的可以自行尝试比较

 
当然了、一个完整的项目肯定不只是下面的这些示例、包含日志文件处理、数据库操作、返回值封装、公共参数、异常处理  等等。
 

直接上代码吧,一切的解释都是多余的。

Hello World !!

from fastapi import FastAPI,Form,Query,UploadFile,File,Request
from pydantic import BaseModel,Field
from typing import Optional,List
import os,sys
'''
虚拟环境切换: conda activate FastAPI
FastAPI 程序启动 :uvicorn manger:app --port 7777 --reload
''' app = FastAPI() @app.get('/')
async def root():
# get 请求
return {'message':'Hello World!'}

动态路径:

@app.get('/{test_id}')
async def api_get_text(test_id:int):
# get 请求 动态路径
return {'data':test_id}

post:

@app.post('/user')
async def api_post_text(data:dict):
#Post 请求,json格式
return {'data':data}

请求内容检测:

class detection(BaseModel):
name:str
age:int = 18 #默认值
sex:Optional[str] # null 类型 @app.post('/PostDetection')
async def api_post_text(data:detection):
#Post 请求内容检测
return {'data':data}

请求内容多个主体检测:

class Mds(BaseModel):
name: str
age: int = 18
home: str
height: Optional[str] class Mm(BaseModel):
title: str
phone: str = 'huawei' @app.put("/PutTest/")
async def PutTests(Mds:Mds,Mm:Mm,name:str,q: Optional[bool] = False):
ret = {} if q:
ret.update({"request_name":name})
if Mds.name:
ret.update({"Name":Mds.name})
if Mds.height:
ret.update({"height":Mds.height})
if Mm.title:
ret.update({"Title":Mm.title})
return ret

From表单:

@app.post('/userFrom/')
async def api_post_text(username: str = Form(...),password:str = Form(...)):
# Post 请求 ,From 表单格式
return {'username':username,"Password":password}

API内容代码直接体现:

class Posttest(BaseModel):
test_name:str
max_data:int = 10 class Config: # 手动定义接口返回值 示例内容
schema_extra = {
"example":{
"name":"YCC",
"data":{
"age":12,
'sex':'boy'
}
}
} @app.post("/postTest/")
async def test_posts(data:Posttest,name:str = Query(...,title="post test",example='phyger',max_length=5,alias='x-name',deprecated=True,description="test_description")):
'''
这部分可直接在 接口文档内展示
Query 字段查询检验
title 接口文档字段注释
min_length 最短
max_length 最长
alias 变量别名 用于接收不合法参数名称 (接口请求时传递x-name ,接收到时会将x-name 匹配为name,设定后 只会匹配x-name 不匹配name)
description 字段描述信息
example 示例参数
deprecated 接口废弃提示
'''
return {"name":name,"data":data}

多层嵌套检测:

class TowOptionalData(BaseModel):
townumber:int class OptionalData(BaseModel):
name:str = Field(...,example='ccc') # 检测字段内自定义限制
userlist:List[str] # 列表内容类型限制
data:Optional[TowOptionalData] @app.post('/OptionalTset/')
async def test_Optional(data:OptionalData):
'''
多层嵌套类型检测
'''
return {'masage':"多层嵌套!!","data":data}

单个文件上传:

@app.post('/File/')
async def File_upload(request:Request,files:UploadFile =File(...)):
'''
文件对象默认是个列表
files.filename 获取文件名称
files.content_type 获取文件类型
''' path = R"F:\my_pro\file\py"
newfile = files
newpath = os.path.join(path,newfile.filename)
try:
res = await newfile.read()
# print(len(res)/1024)
with open(newpath, "wb") as f:
f.write(res)
rts = {
"filename":file.filename,
"filetype":file.content_type,
"size":"%.2f KB"%(len(res)/1024)
}
return {'code':0,'data':rts}
except Exception as e :
msg = e
return {"err_msg":e}

多文件上传:

@app.post('/FileList/')
async def File_upload(request:Request,filelist:List[UploadFile] =File(...)): #多文件上传
'''
文件对象默认是个列表
files.filename 获取文件名称
files.content_type 获取文件类型
''' path = R"F:\my_pro\file\py"
oklist = []
errlist = []
for file in filelist:
try:
newpath = os.path.join(path,file.filename)
res = await file.read()
with open(newpath, "wb") as f:
f.write(res)
rts = {
"filename":file.filename,
"FileType":file.content_type,
"size":"%.2f KB"%(len(res)/1024)
}
oklist.append(rts)
except Exception as e:
errlist.append({'name':file.filename,'msg':e}) return {"code":200,"oklist":oklist,"errlist":errlist}

请求头获取:

@app.get('/')
async def root(user_agent: Optional[str] = Header(None),test:Optional[str] = Header(None)):
# get 请求
return {'message':'Hello World!','data':test}

返回值封装:

安排。。。

以后项目又多了一个选择。

附上API文档:

特别鸣谢:Python 测试和开发

python FastAPI 初接触的更多相关文章

  1. python之初接触

    编程语言相关 1什么是编程语言 编程语言即语言,语言的本质就是沟通,因而编程语言与英语 .法语.日语等所有语言并无区别,只不过英语是人与人之间沟通的介质,而编程语言则是程序员与计算机沟通的介质. 程序 ...

  2. python 之 数据类型初接触

    python 之 数据类型初接触 标准数据类型 Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Set(集合) Dicti ...

  3. 初接触BurpLoader工具

    初接触burp工具 菜鸟一枚,现在在接触一段时间测试,我在测试功能性的时候,想着网站被黑案例那么多,我是不是也应该弄弄安全性测试了,所以就有了下边的第一次接触BurpLoader工具来测试手机的app ...

  4. 软工实践练习-Git初接触

    第一次听到Git,有点不知所云,听了实践课老师的讲解,才明白了Git作为最先进的分布式版本控制系统的重要性. 至于Git的安装和使用仍旧是自己摸索着去完成了,当然在这过程中也是遇到了很多的问题. 接下 ...

  5. vi初接触

    vi初接触 它有三种模式: 一 一般模式 二 编辑模式 三 命令行模式 介绍几种比较常用的吧 -- 退出:q 写入:w 强制:! (以上可叠加) 显示行号:set nu 取消:set nonu 跳转到 ...

  6. ExtJS初接触 —— 了解 Ext Core

    ExtJS初接触 —— 了解 Ext Core Ext Core是一款和jQuery媲美的轻型JS库,基于MIT许可.对于Dom的操作,我个人还是比较喜欢用jQuery.当然如果项目中用的是ExtJS ...

  7. ExtJS初接触 - 在项目中使用ExtJS

    ExtJS初接触 - 在项目中使用ExtJS 今天ExtJS官网发布了ExtJS最新正式版4.2.1.Ext JS 4.2.1 正式版 下载 ExtJS为开发者在开发富客户的B/S应用中提供丰富的UI ...

  8. Java之路——Java初接触

    本文大纲 1.Java是什么 2.Java历史 3.Java技术范围 3.1 Java SE平台技术范围 3.2 Java EE技术范围 3.3 Java 体系技术范围 4.总结 1.Java是什么 ...

  9. Dapr微服务应用开发系列2:Hello World与SDK初接触

    题记:上篇介绍了Dapr的环境配置,这次我们来动手尝试一下Dapr应用的开发 Hello World Dapr应用的Hello World其实和其他的Hello World一样简单: 首先用你喜欢的语 ...

随机推荐

  1. 十八:使用JDBC进行批处理

    一.使用Statement完成批处理 1.使用Statement对象添加要批量执行SQL语句,如下: 1 Statement.addBatch(sql1); 2 Statement.addBatch( ...

  2. AOP的底层实现-CGLIB动态代理和JDK动态代理

    AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来 ...

  3. struts2思想学习(一)

    OOP 面向对象编程 AOP 面向切面编程 而在struts2 处处体现了面向切面编程的思想(动态代理最典型)! 拦截器其实也是面向切面编程!拦截器切断了所有请求到action的操作 并做了很多的前提 ...

  4. 关于mysql的备份和恢复

    备份:在登录之前(cmd中)mysqldump -u root -p [数据库名称] > c:/back.sql备份的话,肯定是DBA才能做,所以只能用root:恢复mysql -u root ...

  5. 关于Java集合框架的总结

    Java集合框架(都实现了Cloneable和Serializable接口)支持以下两个类型的容器: 一种是为了存储一个元素集合,简称集合(collection). 另一种是为了存储键/值对,称为图( ...

  6. PyQt4制作GUI

    时间:2018-11-30 记录:byzqy 标题:PyQt4入门学习笔记(一) 地址:https://www.cnblogs.com/chuxiuhong/p/5865201.html 标题:PyQ ...

  7. 分布式ID生成器及redis,etcd分布式锁

    分布式id生成器 有时我们需要能够生成类似MySQL自增ID这样不断增大,同时又不会重复的id.以支持业务中的高并发场景.比较典型的,电商促销时,短时间内会有大量的订单涌入到系统,比如每秒10w+.明 ...

  8. JDK1.8源码阅读笔记(1)Object类

    JDK1.8源码阅读笔记(1)Object类 ​ Object 类属于 java.lang 包,此包下的所有类在使⽤时⽆需⼿动导⼊,系统会在程序编译期间⾃动 导⼊.Object 类是所有类的基类,当⼀ ...

  9. Mysql常用sql语句(11)- between and 范围查询

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 between and可以判断值是否在指定范围内 ...

  10. JUnit5快速入门指南-2

    重复测试中容易产生的问题 //结果类 private static int result = 0; public static int count(int x) throws InterruptedE ...