FastAPI

大约 3 分钟

FastAPI

安装fastapi

# 安装fastapi
pip install fastapi
# 安装服务器,用来启动 fastapi 项目
pip install uvicorn

# 或者可以直接,这个安装包括了 uvicorn
# pip install fastapi[all]

教程 - 用户指南 - 简介 - FastAPI (tiangolo.com)open in new window

简单起个服务

""" 文件:main.py """
from fastapi import FastAPI
import uvicorn

app = FastAPI()

@app.get("/{msg}")
async def root(msg):
  return {"message": msg}

if __name__ == "__main__":
  uvicorn.run(
    app="main:app",
    host="127.0.0.1",
    port=8000,
    reload=True
  )

然后运行这个main.py文件,在浏览器输入http://127.0.0.1/hi,可以看到浏览器页面上有个hi

获取请求头 header

from fastapi import FastAPI, Header
import uvicorn

app = FastAPI()

@app.get("/{msg}")
# 这里演示的是获取 token
async def root(msg, token = Header(None)):
  # 如果请求头里面没有 token,则返回的是 null
  return {"msg": msg, "token": token}

if __name__ == "__main__":
  uvicorn.run(
    app="main:app",
    host="127.0.0.1",
    port=8000,
    reload=True
  )

获取psot请求参数

json

from fastapi import FastAPI, Body
import uvicorn

app = FastAPI()

@app.post("/login")
# data 就是接口传递的 json 数据
def login(data = Body(None)):
  return data

if __name__ == "__main__":
  uvicorn.run(
    app="main:app",
    host="127.0.0.1",
    port=8000,
    reload=True
  )

form表单格式数据(form-data)

from fastapi import FastAPI, Form
import uvicorn

app = FastAPI()

@app.post("/login")
# data 就是接口传递的 json 数据
def login(username = Form(None), password = Form(None)):
  return {
    "username": username,
    "password": password
  }

if __name__ == "__main__":
  uvicorn.run(
    app="main:app",
    host="127.0.0.1",
    port=8000,
    reload=True
  )

完成上面的步骤后,我们会发现它提示:Form data requires "python-multipart" to be installed.,即我们需要pip install python-multipart安装这个模块后 ,python 才有处理 form 表单数据的能力。

等待安装完成后,再次运行程序,就可以看到返回结果了。

返回自定义信息、html、文件

返回定制信息

from fastapi import FastAPI
# 导入定制返回信息的方法
from fastapi.responses import JSONResponse
import uvicorn

app = FastAPI()

@app.get("/user")
def user():
  """
    JSONResponse(): 定制返回信息
    content: 返回的数据信息
    status_code: 状态码
    headers: 请求头
  """
  return JSONResponse(content={
      "msg": "this is message"
    },
    status_code=202,
    headers={"a": "A"}
  )

if __name__ == "__main__":
  uvicorn.run(
    app="main:app",
    host="127.0.0.1",
    port=8000,
    reload=True
  )

返回html片段

from fastapi import FastAPI
# 导入定制返回html的方法
from fastapi.responses import HTMLResponse
import uvicorn

app = FastAPI()

@app.get("/user")
def user():
  html_content = """
    <html>
      <body>
        <div> 这是一个 html 片段 </div>
      </body>
    </html>
  """
  return HTMLResponse(content=html_content)

if __name__ == "__main__":
  uvicorn.run(
    app="main:app",
    host="127.0.0.1",
    port=8000,
    reload=True
  )

返回文件

from fastapi import FastAPI
# 导入定制返回文件的方法
from fastapi.responses import FileResponse
import uvicorn

app = FastAPI()

@app.get("/user")
def user():
  file_path = "seleniumDemo/codeimgs/fullbg.jpg"
  # 如果不填写 filename 字段,则不会弹出下载按钮,而是直接访问
  return FileResponse(file_path, filename="test.jpg")

if __name__ == "__main__":
  uvicorn.run(
    app="main:app",
    host="127.0.0.1",
    port=8000,
    reload=True
  )

jinja2模板返回html页面

需要安装模块pip install jinja2

from fastapi import FastAPI, Request
from fastapi.responses import FileResponse
from fastapi.templating import Jinja2Templates
import uvicorn

app = FastAPI()
# 实例化模板,告诉解析器html文件在哪个文件夹
template = Jinja2Templates("file")

@app.get("/")
# 这个 username 表示 query 参数
def user(username, req: Request):
  # 不填写 content={"request": req}会报错:Internal Server Error
  # index.html 表示要解析的文件名
  # 这个 name 表示 username 在前端页面中的映射名称,在标签中书写{{name}}即可使用
  return template.TemplateResponse("index.html", context={"request": req, "name": username})

if __name__ == "__main__":
  uvicorn.run(
    app="main:app",
    host="127.0.0.1",
    port=8000,
    reload=True
  )
上次编辑于: