了解 FastApi, 是什么

fastApi

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。

关键特性:

  • 快速:可与 NodeJSGo 比肩的极高性能(归功于 Starlette 和 Pydantic )。最快的 Python web 框架之一
  • 高效编码:提高功能开发速度约 200 % 至 300 %。*
  • 更少 bug:减少约 40 % 的人为(开发者)导致错误。*
  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
  • 简单:设计的易于使用和学习,阅读文档的时间更短。
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。
  • 标准化:基于(并完全兼容) API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema

tips: 此文章部分代码直接 copy 官方,他网速实在太渣。避免以后查询,所以先复制过来再说。

同时对于某些方法的属性,最好的方式是查看源码, 虽然这个源码没注释。就真的很扎心

官网速度加载感人,同时源码没有注释

初识 fastApi

一个简单的示例:

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}


if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8080)

  • /items/{item_id} 路径 有一个 路径参数 item_id 并且应该为 int 类型。
  • /items/{item_id} 路径 有一个可选的 str 类型的 查询参数 q
  • 访问: /items/3?=10

运行:

uvicorn fileName:app --reload
# file 程序入口文件名,此文件中 app = FastAPI() 创建的对象名。
# or 
# 直接再运行这个文件

自动生成的文档

交互式 API 文档

访问 /docs。

自动生成的交互式 API 文档(由 Swagger UI生成)

可选的 API 文档

访问 /redoc。

自动生成的文档(由 ReDoc 生成)

引入模板

可以将任何所需的模板引擎与 FastApi 一起使用, 则为它本身没有模板引擎。个人感觉也没必要。

jinja2 安装

pip install jinja2
# 如果还需要提供静态文件(模板内引用,还需要安装 aiofiles
pip install aiofiles

使用:

from starlette.requests import Request
from starlette.templating import Jinja2Templates
from fastapi import FastAPI

app = FastAPI()
# 创建模板对象,并指定模板存放目录
templates = Jinja2Templates(directory='./')


@app.get('/{item_id}/')
async def item(request: Request, item_id):
    # 渲染模板,并向模板内传递参数 ...
    # 'request' 必须传递进模板,作为 context. 为啥要传入模板?
    print(request.headers.get('user-agent'))
    return templates.TemplateResponse('index.html',
                                      {'request': request, 'item_id': item_id})

模板

<body>
<h3>{{ item_id }}</h3>
<pre>
    {{ request.__dict__ }}
</pre>
</body>

一些 python 语法

三个省略号

表示函数没有实现任何代码,跟 pass 的作用类似

def fn():
  ... 

传入函数中

def fn2(default, *, a: int = 10, **kwargs):
    print(default)
    print(type(default))
    print(bool(default))
    print(kwargs)

fn2(..., b=20, c=30)

# 输出:

# Ellipsis
# <class 'ellipsis'>
# True
# {'b': 20, 'c': 30}

FastAPI 中经常用 ... 来表达请求参数

如果想做一些验证,比如最小长度是 10 ,并且是可选的,可以写成这样。

async def something(q: str = Query(None, min_length=10)):
  ...
# query 第一个参数代表此形参的默认值,有默认值代表可以忽略

如果我们想为参数设置最小长度同时又需要它,可以使用 ... 表示参数为必须的

async def something(q: str = Query(..., min_length=10)):
  ...

最后

Ellipsis 本身没有什么特殊的东西,它只是一个有着特殊类型的单例。Python 提供这个对象给你在一些特殊情况下做某些语法上的扩展,但通常情况下没什么强行使用的价值。来自

python 函数形参中的单个星号

python 单个星号+形参名 接收多余参数. 如果只是为单个星号 则表示形参列表中星号后面的参数只能以关键字形式传入

def fn(default, *, a, **kwargs):
    print(default)
    print(a)


fn('默认接收参数, 其余非关键值参数不会被函数接收', a = 20, b=30)
# fn('', 30, a=10) error

相关推荐:

来自系列:fastapi

分类 python下文章:

1.0 爬虫的介绍,和requests模块的简单使用

1.1 数据解析的三种方式。正则表达式, bs4, xpath

2.0 多任务(进程,协程,线程)爬虫:验证码识别,返回头储存,ip代理 介绍。 异步是什么,爬虫异步的方式。线程,进程,介绍

2.0.1 协程的 async/await 实现 爬虫 单线程 + 异步协程的实现

3.0 基于selenium 模块的 爬虫操作。 selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。

更多...

评论([[comments.sum]])

发表

加载更多([[item.son.length-2]])...

发表

2020-11 By chuan.

Python-flask & bootstrap-flask

图片外链来自:fghrsh

互联网ICP备案号:蜀ICP备2020031846号