Python Falcon 钩子
钩子是用户定义的函数,当资源类中的特定响应者方法被调用以响应客户端请求时,这些函数会自动执行。Falcon支持 前 钩和 后 钩。
作为钩子使用的函数是以请求、响应和资源类为参数定义的,此外还有任何可能需要的可选参数。
def hookfunction(req, resp, resource):
. . . . .
. . . . .
通过应用以下装饰器之一,这样的函数被附加到单个响应器或整个资源类中
- @falcon.before(hookfunction)
-
@falcon.after(hookfunction)
要将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"
}
由于数据不包含name参数的值,所以出现了异常。
在另一个POST请求中,如下图所示,百分比参数的值未能满足所需的标准,因此出现异常。
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"
}