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

中文官网: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. python3.9 manage.py runserver 报错问题解决

    报错信息如下 You have 13 unapplied migration(s). Your project may not work properly until you apply the mi ...

  2. 算法入门 - 基于动态数组的栈和队列(Java版本)

    之前我们学习了动态数组的实现,接下来我们用它来实现两种数据结构--栈和队列.首先,我们先来看一下栈. 什么是栈? 栈是计算机的一种数据结构,它可以临时存储数据.那么它跟数组有何区别呢? 我们知道,在数 ...

  3. 在docker安装tomcat的时候,报错:Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true

    初识docker,试着在docker中安装tomcat(安装的tomcat8.5),并且挂载到宿主机的相关目录下,结果启动的时候报错: 12-May-2020 01:14:34.061 SEVERE ...

  4. C#简单实现表达式目录树(Expression)

    1.什么是表达式目录树 :简单的说是一种语法树,或者说是一种数据结构(Expression) 2.用Lambda声明表达式目录树: 1 2 3 4 5 Expression<Func<in ...

  5. CPU 进程 线程 关系与区别

  6. C++面试题(四)——智能指针的原理和实现

    C++面试题(一).(二)和(三)都搞定的话,恭喜你来到这里,这基本就是c++面试题的最后一波了.     1,你知道智能指针吗?智能指针的原理.     2,常用的智能指针.     3,智能指针的 ...

  7. git 的指定参考教程

    https://www.runoob.com/git/git-create-repository.html

  8. 九:Decorator设计模式

    二.使用Decorator设计模式增强request对象 Servlet API 中提供了一个request对象的Decorator设计模式的默认实现类HttpServletRequestWrappe ...

  9. Linux命令集锦之·字符截取命令

    时间:2018-11-15 记录:byzqy 字符截取命令: cut.printf.awk.sed cut $ cut [选项] 文件名 选项: -f 列号:提取第几列: -d 分隔符:按照指定分隔符 ...

  10. Electron团队为什么要干掉remote模块

    Electron团队提供remote模块给开发者, 主要目的是为了简化渲染进程和主进程互访的难度, 这个目的却是达到了. 但也带来了很多问题, 归纳起来主要分为以下四点: 第一:它很慢 通过remot ...