请求与响应


2021年8月19日 14:20     admin

  1. # -*- coding:utf-8 -*-
  2. # @Author: komeiji satori
  3. from fastapi import FastAPI
  4. import uvicorn
  5. # 类似于 app = Flask(__name__)
  6. app = FastAPI()
  7. # 绑定路由和视图函数
  8. @app.get("/")
  9. async def index():
  10. return {"name": "古明地觉"}
  11. # 在 Windows 中必须加上 if __name__ == "__main__",否则会抛出 RuntimeError: This event loop is already running
  12. if __name__ == "__main__":
  13. # 启动服务,因为我们这个文件叫做 main.py,所以需要启动 main.py 里面的 app
  14. # 第一个参数 "main:app" 就表示这个含义,然后是 host 和 port 表示监听的 ip 和端口
  15. uvicorn.run("main:app", host="0.0.0.0", port=5555)

我们在浏览器中输入 “localhost:5555” 就会显示相应的输出,我们看到在视图函数中可以直接返回一个字典。当然除了字典,其它的数据类型也是可以的,举个栗子:

  1. # -*- coding:utf-8 -*-
  2. # @Author: komeiji satori
  3. from fastapi import FastAPI
  4. import uvicorn
  5. app = FastAPI()
  6. @app.get("/int")
  7. async def index1():
  8. return 666
  9. @app.get("/str")
  10. async def index2():
  11. return "古明地觉"
  12. @app.get("/bytes")
  13. async def index3():
  14. return b"satori"
  15. @app.get("/tuple")
  16. async def index4():
  17. return ("古明地觉", "古明地恋", "雾雨魔理沙")
  18. @app.get("/list")
  19. async def index5():
  20. return [{"name": "古明地觉", "age": 17}, {"name": "古明地恋", "age": 16}]
  21. if __name__ == "__main__":
  22. uvicorn.run("main:app", host="0.0.0.0", port=5555)

直接使用 requests 发请求

我们看到基本上都是支持的,只不过元组自动转成列表返回了。这里我们在路由中指定了路径,可以看到 FastAPI 中的路径形式和其它框架并无二致,只不过目前的路径是写死的,如果我们想动态声明路径参数该怎么做呢?

  1. # -*- coding:utf-8 -*-
  2. # @Author: komeiji satori
  3. from fastapi import FastAPI
  4. import uvicorn
  5. app = FastAPI()
  6. @app.get("/items/{item_id}")
  7. async def get_item(item_id):
  8. """和 Flask 不同,Flask 是使用 <>,而 FastAPI 使用 {}"""
  9. return {"item_id": item_id}
  10. if __name__ == "__main__":
  11. uvicorn.run("main:app", host="0.0.0.0", port=5555)

整体非常简单,路由里面的路径参数我们可以放任意个,只是 {} 里面的参数必须要在定义的视图函数的参数中出现。但是问题来了,我们好像没有规定类型啊,如果我们希望某个路径参数只能接收指定的类型要怎么做呢?

  1. # -*- coding:utf-8 -*-
  2. # @Author: komeiji satori
  3. from fastapi import FastAPI
  4. import uvicorn
  5. app = FastAPI()
  6. @app.get("/apple/{item_id}")
  7. async def get_item(item_id: int):
  8. """和 Flask 不同,Flask 定义类型是在路由当中,也就是在 <> 里面,变量和类型通过 : 分隔
  9. 而 FastAPI 是使用类型注解的方式,此时的 item_id 要求一个整型(准确的说是一个能够转成整型的字符串)"""
  10. return {"item_id": item_id}
  11. if __name__ == "__main__":
  12. uvicorn.run("main:app", host="0.0.0.0", port=5555)

如果我们传递的值无法转成整型的话,那么会进行提示:告诉我们 value 不是一个有效的整型,可以看到给的提示信息还是非常清晰的。

所以通过 Python 的类型声明,FastAPI提供了数据校验的功能,当校验不通过的时候会清楚地指出没有通过的原因。在我们开发和调试的时候,这个功能非常有用。


返回值不带””

在 FastAPI 中,如果您想要返回一个字符串而不带双引号,可以使用 Response 类来自定义响应。通过使用 Response 类,您可以设置响应的内容类型和主体。

  1. from fastapi import FastAPI, Response
  2. app = FastAPI()
  3. @app.get("/data")
  4. def get_data():
  5. data = "Hello, World!"
  6. return Response(content=data, media_type="text/plain")