0
前言
前几天给大家分别分享了(入门篇)简析蟒蛇网框架FastAPI——一个比瓶和托纳达更高性能的空气污染指数框架和(进阶篇)巨蟒网框架FastAPI——一个比瓶和托纳达更高性能的空气污染指数框架。今天欢迎大家来到FastAPI系列分享的完结篇,本文主要是对于前面文章的补充和扩展。
当然这些功能在实际开发中也扮演者极其重要的角色。
1
中间件的使用
瓶有钩子函数,可以对某些方法进行装饰,在某些全局或者非全局的情况下,增添特定的功能。
同样在FastAPI中也存在着像钩子函数的东西,也就是中间件中间件了。
计算回调时间
-- coding: UTF-8 --
导入时间
从fastapi导入FastAPI
来自starlette.requests导入请求
app=FastAPI()
@ app。中间( ' http ')
异步定义add _ process _ time _ header(请求:请求,调用_next):
start_time=time.time()
响应=await call _ next(请求)
process _ time=时间。时间()-开始时间
[X-进程-时间']=字符串(进程_时间)
打印(response.headers)
回应
@app.get('/ ')
异步def main():
返回{ "消息: '你好,世界'}
ifname=='__main__':
进口玉米
运行(应用程序,主机='127.0.0.1 ',端口=8000)
请求重定向中间件
从fastapi导入FastAPI
从史泰莱特。中间件。https重定向导入http重定向中间件
app=FastAPI()
应用程序。add _ middleware(HttpsredirectMidware)
被重定向到 301
@app.get('/ ')
异步def main():
返回{ "消息: '你好,世界'}
授权允许宿主访问列表(支持通配符匹配)
从fastapi导入FastAPI
从史泰莱特。中间件。可信主机导入可信主机中间件
app=FastAPI()
可信主机中间件,允许的主机数=['示例。com ','*。示例。com']
)
@app.get('/ ')
异步def main():
返回{ "消息: '你好,世界'}
跨域资源共享
从fastapi导入FastAPI
从史泰莱特。中间件。克-奥二氏分级量表导入克-奥二氏分级量表中间件
app=FastAPI()
允许跨域请求的域名列表(不一致的端口也会被视为不同的域名)
起源=[
'https://gzky.live ',
'https://google.com ',
'http://localhost:5000 ',
'http://localhost:8000 ',
]
通配符匹配,允许域名和方法
app.add_middleware(
中间件,
allow_origins=origins,
允许凭证=真,
allow_methods=['*'],
allow_headers=['*'],
)
在前端ajax请求,出现了外部链接的时候就要考虑到跨域的问题,如果不设置允许跨域,浏览器就会自动报错,跨域资源的安全问题。
所以,中间件的应用场景还是比较广的,比如爬虫,有时候在做全站爬取时抓到的Url请求结果为301,302,之类的重定向状态码,那就有可能是网站管理员设置了该域名(二级域名)不在宿主访问列表中而做出的重定向处理,当然如果你也是网站的管理员,也能根据中间件做些反爬的措施。
更多中间件参考https://fastapi.tiangolo.com/advanced/middleware
2
背景任务
创建异步任务函数,使用异步或者普通def函数来对后端函数进行调用。
发送消息
-- coding: UTF-8 --
从快速api导入后台任务,依赖项,快速空气污染指数
app=FastAPI()
def write_log(消息:字符串):
open('log.txt ',mode='a ')作为log:
log.write(消息)
def get _ query(后台任务3360后台任务,q:字符串=无):
if q:
message=f ' found query: { q } n '
后台任务.添加任务(写日志,消息)
返回q
@ app。发布( '/发送通知/{ email } ')
异步def发送通知(
email:字符串,background _ tasks 3360 background tasks,q:字符串=依赖项(get_query)
):
message=f ' message to { email } n '
后台任务.添加任务(写日志,消息)
返回{ "消息: '消息已发送'}
使用方法极其的简单,也就不多废话了,write_log当成工作方法被调用,先方法名,后传参。
3
自定义反应状态码
在一些特殊场景我们需要自己定义返回的状态码
从fastapi导入FastAPI
从starlette导入状态
app=FastAPI()
201
@app.get('/201/ ',status_code=status。HTTP _ 201 _创建)
async def item201():
返回{ ' httpStatus ' : 201 }
302
@app.get('/302/ ',status_code=status。发现)
异步def项302():
返回{ ' httpStatus ' : 302 }
404
@app.get('/404/ ',status_code=status。未找到)
异步def项404():
返回{ ' httpStatus ' : 404 }
500
@app.get('/500/ ',status_code=status。HTTP_500_INTERNAL_SERVER_ERROR)
异步def项500():
返回{ ' httpStatus ' : 500 }
ifname=='__main__':
进口玉米
运行(应用程序,主机='127.0.0.1 ',端口=8000)
所以有趣的是,假设有人写了这样一个代码
async def getHtml(自我、url、会话):
try:
async with session.get(url,标头=自身标头,超时=60,验证_ ssl=假)分别为:
如果在[的地位200,201]:
data=await resp.text()
返回数据
e:除外
打印(e)
及格
有趣的是,这个获取Html源代码的函数根据Http状态代码判断它是否正常返回。如果我按照上面写的直接返回一个404或304状态码,但是响应数据是正常的,那么这个爬行者不会爬不动任何东西吗?所以,嘿嘿你知道!
4
关于部署
部署FastAPI应用程序相对容易
紫玉米
FastAPI文档建议使用Uvicorn来部署应用程序(接下来是hypercorn),这是一个基于asyncio开发的轻量级、高效的网络服务器框架(仅支持Python 3 . 5 . 3和更高版本)
装置
pip安装uvicorn
启动模式
uv ICOM main : app-reload-host 0 . 0 . 0 . 0-port 8000
Gunicorn
如果您仍然喜欢使用Gunicorn部署项目,请参见下文。
装置
pip安装gunicorn
启动模式
gunicorn -w 4 -b 0.0.0.0:5000管理:app -D
码头工人部署
使用docker部署应用程序的优势在于,您不需要设置特定的操作环境(事实上,Docker正在帮助您拉它)。您可以通过Dockerfile构建FastAPI映像,启动Docker容器,并通过端口映射轻松访问部署的应用程序。
引擎引擎
在Uvicorm/Gunicorn FASTAPI的基础上挂一层Nginx服务,网站就可以上线了。事实上,直接使用UVIC ORM或GUNICORN没有问题,但是Nginx可以让你的网站看起来更像一个网站。