- Python Falcon教程
- Python Falcon - 主页
- Python Falcon - 简介
- Python Falcon - 环境设置
- Python Falcon - WSGI 与 ASGI
- Python Falcon - Hello World(WSGI)
- Python Falcon - 女服务员
- Python Falcon - ASGI
- 蟒蛇Falcon - Uvicorn
- Python Falcon - API 测试工具
- 请求与响应
- Python Falcon - 资源类
- Python Falcon - 应用程序类
- Python Falcon - 路由
- Falcon - 后缀响应者
- Python Falcon - 检查模块
- Python Falcon - Jinja2 模板
- Python Falcon - cookie
- Python Falcon - 状态代码
- Python Falcon - 错误处理
- Python Falcon - 钩子
- Python Falcon - 中间件
- Python Falcon - CORS
- Python Falcon - Websocket
- Python Falcon - Sqlalchemy 模型
- Python Falcon - 测试
- Python Falcon - 部署
- Python Falcon 有用资源
- Python Falcon - 快速指南
- Python Falcon - 有用的资源
- Python Falcon - 讨论
Python Falcon - 钩子
挂钩是用户定义的函数,当调用资源类中的特定响应程序方法以响应客户端请求时,这些函数会自动执行。Falcon支持前后挂钩。
除了可能需要的任何可选参数之外,还使用请求、响应和资源类作为参数来定义要用作挂钩的函数。
def hookfunction(req, resp, resource): . . . . . . . . . .
通过应用以下装饰器之一,这样的函数可以附加到单个响应程序或整个资源类 -
@falcon.before(钩子函数)
@falcon.after(钩子函数)
将 before 钩子应用到on_post()响应者 -
@falcon.before(hookfunction) def on_post(self, req, resp): . . . . . .
应用后钩 -
@falcon.after(hookfunction) def on_get(self, req, resp): . . . . . .
要装饰整个资源类,请使用类声明上方的装饰器 -
@falcon.after(hookfunction) class SomeResource: def on_get(self, req, resp): . . . . . . def on_post(self, req, resp): . . . . . .
在下面的示例中,我们有StudentResource类,其中定义了on_get()和on_post()响应程序。当 POST 请求发送一些数据时,将调用 on_post() 响应程序,并将用它创建的新dict对象添加到学生列表中。
接收到的数据在处理之前需要进行验证。为此,定义了以下函数。它检查百分比参数的值是否在 0 到 100 之间。只有当数据满足此条件时,才会将其传递给响应方。
def checkinput(req, resp, resource,params): student = json.load(req.bounded_stream) if "name" not in student: raise falcon.HTTPBadRequest( title="Bad request", description="Bad input, name must be provided." ) per=int(student['percent']) if per<0 or per>100: raise falcon.HTTPBadRequest( title="Bad request", description="Bad input, invalid percentage" ) req.context.data = student
该函数作为StudentResource类的on_post()响应程序的挂钩应用。
import falcon import json from waitress import serve students = [ {"id": 1, "name": "Ravi", "percent": 75.50}, {"id": 2, "name": "Mona", "percent": 80.00}, {"id": 3, "name": "Mathews", "percent": 65.25}, ] class StudentResource: def on_get(self, req, resp): resp.text = json.dumps(students) resp.status = falcon.HTTP_OK resp.content_type = falcon.MEDIA_JSON @falcon.before(checkinput) def on_post(self, req, resp): student = json.load(req.context.data) students.append(student) resp.text = "Student added successfully." resp.status = falcon.HTTP_OK resp.content_type = falcon.MEDIA_TEXT def on_get_student(self, req, resp, id): resp.text = json.dumps(students[id-1]) resp.status = falcon.HTTP_OK resp.content_type = falcon.MEDIA_JSON app = falcon.App() app.add_route("/students", StudentResource()) if __name__ == '__main__': serve(app, host='0.0.0.0', port=8000)
让我们运行Waitress服务器并发起 POST 请求。
http POST localhost:8000/students id=4 percent=50 HTTP/1.1 400 Bad Request Content-Length: 76 Content-Type: application/json Date: Tue, 26 Apr 2022 14:49:07 GMT Server: waitress Vary: Accept { "description": "Bad input, name must be provided.", "title": "Bad request" }
由于数据不包含名称参数的值,因此会引发异常。
在另一个如下所示的 POST 请求中,percent 参数的值无法满足所需的条件,因此出现异常。
http POST localhost:8000/students id=4 name="aaa" percent=500 HTTP/1.1 400 Bad Request Content-Length: 72 Content-Type: application/json Date: Tue, 26 Apr 2022 15:01:20 GMT Server: waitress Vary: Accept { "description": "Bad input, invalid percentage", "title": "Bad request" }