一个简单的栗子

  1. from fastapi import FastAPI
  2. app = FastAPI()
  3. @app.get("/")
  4. async def root():
  5. return {"message": "Hello World"}
  1. FASTAPI继承Starlette,因此在Starlette中的所有可调用的对象在FASTAPI中可以直接引用

编写步骤

步骤一:导入FastAPI

  1. from fastapi import FastAPI

步骤二:创建FastAPI实例

  1. app = FastAPI()

步骤三:创建访问路径

  1. @app.get("/")

这个路径告诉FastAPI,该装饰器下的方法是用来处理路径是“/”的GET请求

步骤四:定义方法,处理请求

  1. async def root():

步骤五:返回响应信息

  1. return {"message": "Hello World"}

步骤六:运行

  1. uvicorn main:app --reload

获取路径参数

  1. from fastapi import FastAPI
  2. app = FastAPI()
  3. @app.get("/items/{item_id}")
  4. async def read_item(item_id):
  5. return {"item_id": item_id}

路径中的item_id将会被解析,传递给方法中的item_id。请求http://127.0.0.1:8000/items/foo会返回如下结果:

  1. {"item_id":"foo"}

也可以在方法中定义参数类型:

  1. from fastapi import FastAPI
  2. app = FastAPI()
  3. @app.get("/items/{item_id}")
  4. async def read_item(item_id: int):
  5. return {"item_id": item_id}

继续请求http://127.0.0.1:8000/items/3,会返回

  1. {"item_id":3}

此时的item_id是int类型的3,而不是string类型,这是因为FastAPI在解析请求时,自动根据声明的类型进行了解析

如果请求http://127.0.0.1:8000/items/foo,此时会返回:

  1. {
  2. "detail": [
  3. {
  4. "loc": [
  5. "path",
  6. "item_id"
  7. ],
  8. "msg": "value is not a valid integer",
  9. "type": "type_error.integer"
  10. }
  11. ]
  12. }

这是因为foo并不能转换成int类型。请求http://127.0.0.1:8000/items/4.2也会出现上述错误

所有的数据类型验证,都是通过Pydantic完成的

如果想对路径参数做一个预定义,可以使用Enum:

  1. from enum import Enum
  2. from fastapi import FastAPI
  3. class ModelName(str, Enum):
  4. alexnet = "alexnet"
  5. resnet = "resnet"
  6. lenet = "lenet"
  7. app = FastAPI()
  8. @app.get("/model/{model_name}")
  9. async def get_model(model_name: ModelName):
  10. if model_name == ModelName.alexnet:
  11. return {"model_name": model_name, "message": "Deep Learning FTW!"}
  12. if model_name.value == "lenet":
  13. return {"model_name": model_name, "message": "LeCNN all the images"}
  14. return {"model_name": model_name, "message": "Have some residuals"}

打开http://127.0.0.1:8000/docs:

除此之外,假如想接收一个路径参数,它本身就是一个路径,就像/files/{file_path},而这个file_path是home/johndoe/myfile.txt时,可以写成/files/{file_path:path}:

  1. from fastapi import FastAPI
  2. app = FastAPI()
  3. @app.get("/files/{file_path:path}")
  4. async def read_user_me(file_path: str):
  5. return {"file_path": file_path}

OpenAPI本身不支持在路径参数包含路径,但是可以当作Starlette内部的一个使用方法

此时访问http://127.0.0.1:8000/files/home/johndoe/myfile.txt,返回:

  1. {"file_path":"home/johndoe/myfile.txt"}

如果将路径改为/files/{file_path},会返回:

  1. {"detail":"Not Found"}

获取查询参数

这里依旧是一个例子:

  1. from fastapi import FastAPI
  2. app = FastAPI()
  3. fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
  4. @app.get("/items/")
  5. async def read_item(skip: int = 0, limit: int = 10):
  6. return fake_items_db[skip : skip + limit]

尝试访问http://127.0.0.1:8000/items/?skip=0&limit=2,返回:

  1. [{"item_name":"Foo"},{"item_name":"Bar"}]

尝试访问http://127.0.0.1:8000/items/,返回:

  1. [{"item_name":"Foo"},{"item_name":"Bar"},{"item_name":"Baz"}]

由于我们在定义方法的时候,分别赋予skip和limit默认值,当不添加querystring时,会使用默认值。当然,我们也可以将默认值赋值为None:

  1. from fastapi import FastAPI
  2. app = FastAPI()
  3. @app.get("/items/{item_id}")
  4. async def read_item(item_id: str, q: str = None):
  5. if q:
  6. return {"item_id": item_id, "q": q}
  7. return {"item_id": item_id}

此时,我们请求http://127.0.0.1:8000/items/1?q=qqq:

  1. {"item_id":"1","q":"qqq"}

值得放心的一点是,FastAPI很聪明,他知道参数来自哪里~

假如,我们不给参数默认值会发生什么情况呢?这里还是一个例子:

  1. from fastapi import FastAPI
  2. app = FastAPI()
  3. @app.get("/items/{item_id}")
  4. async def read_user_item(item_id: str, needy: str):
  5. item = {"item_id": item_id, "needy": needy}
  6. return item

继续请求http://127.0.0.1:8000/items/1,会发现,返回报错:

  1. {
  2. "detail": [
  3. {
  4. "loc": [
  5. "query",
  6. "needy"
  7. ],
  8. "msg": "field required",
  9. "type": "value_error.missing"
  10. }
  11. ]
  12. }

fastapi教程进阶的更多相关文章

  1. Flink 实践教程-进阶(2):复杂格式数据抽取

    作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接.亚 ...

  2. Flink 实践教程-进阶(5):排序(乱序调整)

    作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接.亚 ...

  3. vue3.0新特性以及进阶路线

    Vue3.0新特性/改动 新手学习路线  ===> 起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要 ...

  4. 【基础篇】hexo博客搭建教程

    [基础篇]搭建hexo博客(一) 作者:Huanhao bilibili:Mrhuanhao 前言 你是否想拥有属于自己的博客?你是否无奈与自己不会写网站而烦恼? 不要担心,本系列教程将会实现你白嫖的 ...

  5. FastAPI(1)- 简单介绍

    前言 为啥要学它呢,因为学 Flask 的时候发现有人更推荐它代替 Flask,看了下介绍,感觉很强,而且也能拿来做平台,当然学起来!卷起来! 为什么要使用 FastAPI ? 日渐没落的是后端 HT ...

  6. Linux下服务器端开发流程及相关工具介绍(C++)

    去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...

  7. 新手入门指导:Vue 2.0 的建议学习顺序

    起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script> ...

  8. 初学Vue2.0--基础篇

    概述: 鉴于本人初学,使用的编译器是webStorm,需添加对VUE的支持,添加方法可以参考 http://www.jianshu.com/p/142dae4f8b51. 起步: 1. 扎实的 Jav ...

  9. Vue.js 整理笔记

    以前我们用Jquery进行dom的操作,虽然熟悉后开发效率很高,但是如果多个控件的相互操作多的情况下,还是会乱.相比之下,Vue的使用更加清晰,通过虚拟dom将数据绑定,而且组件化和路由的帮助下,让整 ...

随机推荐

  1. 函数式编程思想概述和冗余的Runnable代码

    函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方法 相对而言,面向对象过分强调必须通过对象的形式来做事情,而函数式的思想是尽量忽略复杂的面向对象的复杂语法--是强调做什么而不是以什么 ...

  2. typescript关于postgres数据库的API封装

    文章结构     1 新建 postgres.ts 文件     2 配置文件说明     3 依赖引用说明     4 API使用示例   1 新建 postgres.ts 文件,代码如下: imp ...

  3. 【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法

    问题描述 在PHP项目部署在App Service后,上传文件如果大于1MB就会遇见 413 Request Entity Too Large 的问题. 问题解决 目前这个问题,首先需要分析应用所在的 ...

  4. python zip、*、**理解

    zip函数 zip()一般传入可迭代对象(不止一个),将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的zip对象(python2返回元组),需要手动使用tuple.list等序列转换成可使 ...

  5. Modbus转OPC

    在这里给大家介绍一种低成本的将Modbus RTU协议的串口设备接入到OPC UA的服务器呢? OPC全称是OLE(Object Linking and Embedding) for Process ...

  6. 在阿里云Centos7.6上面部署基于Redis的分布式爬虫Scrapy-Redis

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_83 Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取.但是当我们要爬取的页面非常多的 ...

  7. 小白之Python基础(三)

    列表和元组 1.列表:最常用的 Python 数据类型(可变的数据类型) 1)列表是一个值,它包含多个值构成的序列: 2)通过[ ]或list()创建的有序元素的集合: 3)表项(列表中的值,也可以叫 ...

  8. 如何让 JS 代码不可断点

    绕过断点 调试 JS 代码时,单步执行(F11)可跟踪所有操作.例如这段代码,每次调用 alert 时都会被断住: debugger alert(11) alert(22) alert(33) ale ...

  9. http、https和Cookie

    http和https http,https 都是网络传输协议 是用于网络相关传输,http走的是明文传输,https走的密文传输(内部采用对称加密以及非对称加密).对应的https安全性要高于http ...

  10. django自带的序列化组件

    1.什么是序列化组件 在django中,自带一个序列化组件,它是用来将数据进行整理.转化成特定的为一个特定的格式(比如json数据格式),然后传输给前端,以便前端对数据进行处理操作. 2.为什么要用序 ...