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

中文官网: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. CGO入门和OCR文字识别(非第三方API,有源码,效果好)实战

    这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战 系列文章见: [第四天] GDB调试指南:C++中如何调试生产环境的程序? [第三天] IM敏感词算法原理和实现 [第二天] 现代IM架构研 ...

  2. luogu P2473 奖励关

    奖励关 看到数据范围,想到状压,那问题就是如何设计方程 设\(dp[i][j]\)表示在第\(i\)轮的时候,状态为\(j\)时的最优策略所拿的分值,\(j\)的二进制下为1的位置,表示选了这个宝物, ...

  3. flutter canvas圆圈转圈动画

    import 'dart:math'; import 'dart:ui'; import 'package:flutter/material.dart'; void main() => runA ...

  4. C#基础知识---is与as

    一.is与as对比 is检查一个对象是否兼容于指定的类型,并返回一个Boolean值:true或者fasle. 注:is操作符永远不会抛出异常 经常按如下方法使用: ClassA { .... } O ...

  5. Linux第一个动态库

    动态库一般以.so结尾,就是shared object的意思. 其基本生成步骤为   ⑴编写函数代码   ⑵编译生成动态库文件,要加上 -shared 和 -fpic 选项 ,     库文件名以li ...

  6. 【转】Mysql中事务ACID实现原理

    转自:https://www.cnblogs.com/rjzheng/p/10841031.html 作者:孤独烟 引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" ...

  7. 【springcloud】模拟RPC调用(Feign)

    转自:https://blog.csdn.net/pengjunlee/article/details/86615408 Feign简介 Feign是一个声明式的Web Service客户端,它能够让 ...

  8. 十四:Servlet3.0的动态

    动态的创建是为了简化配置文件的.对于我们创建的servlet,filter和listener后可以使用.这也是注解的另外一种替代方式. package com.hotusm.dynamic; impo ...

  9. Javascript - Vue - webpack + vue-cil

    cnpm(node package manager)和webpack模块 npm是运行在node.js环境下的包管理工具(先安装node.js,再通过命令 npm install npm -g 安装n ...

  10. 微信小程序学习笔记二 列表渲染 + 条件渲染

    1. 列表渲染 1.1 wx:for 在组件上使用wx:for控制属性绑定一个数组, 即可使用数组中各项的数据重复渲染该组件 默认数组的当前项的下标变量名默认为 index, 数组当前项的变量名默认为 ...