Python Falcon 简明教程
Python Falcon - App Class
此类是基于 Falcon 的 WSGI 应用程序的主要入口点。此类的实例提供了一个可调用的 WSGI 接口和一个路由引擎。
import falcon
app = falcon.App()
此类的 init() 构造函数采用以下关键字参数 −
-
media_type − 在初始化 RequestOptions 和 ResponseOptions 时要使用的媒体类型。Falcon 允许轻松定制互联网媒体类型处理。默认情况下,Falcon 仅为 JSON 和 HTML(URL 编码和多部分)表单启用处理程序。
-
request_type − 此参数的默认值是 falcon.Request 类。
-
response_type − 此参数的默认值是 falcon.Response 类。
为了使 App 对象可调用,其类有一个 call() 方法。
__call__(self, env, start_response)
这是一个 WSGI 应用程序方法。WSGI 开发服务器或其他生产服务器(Waitress/Uvicorn)使用此对象启动服务器实例并侦听来自客户端的请求。
App 类还定义了 add_route() 方法。
add_route(self, uri_template, resource)
此方法有助于将 URI 路径与其资源类中的对象相关联。传入请求按一组 URI 模板路由到资源。如果路径与给定路由的模板匹配,则该请求被传递到相关资源以进行处理。根据请求方法,将调用各自的应答器方法。
Example
让我们向 on_post() 类中添加 HelloResource 应答器方法,并测试 GET 和 POST 请求的端点。
from waitress import serve
import falcon
import json
class HelloResource:
def on_get(self, req, resp):
resp.status = falcon.HTTP_200
resp.content_type = falcon.MEDIA_TEXT
resp.text = (
'Hello World'
)
def on_post(self, req, resp):
data=req.media
nm=data['name']
resp.status = falcon.HTTP_200
resp.content_type = falcon.MEDIA_TEXT
resp.text = (
'Hello '+nm
)
app = falcon.App()
hello = HelloResource()
app.add_route('/hello', hello)
if __name__ == '__main__':
serve(app, host='0.0.0.0', port=8000)
Output
使用 Waitress 服务器运行应用程序,并使用 Curl 检查响应。对于 GET 请求的响应,使用以下命令 −
C:\Users\User>curl localhost:8000/hello
Hello World
我们通过 POST 方法将一些数据发送到 /hello URL,如下所示 −
C:\Users\User>curl -i -H "Content-Type:application/json" -X
POST -d "{"""name""":"""John"""}" http://localhost:8000/hello
HTTP/1.1 200 OK
Content-Length: 10
Content-Type: text/plain; charset=utf-8
Date: Sun, 17 Apr 2022 07:06:20 GMT
Server: waitress
Hello John
要将路由添加到静态文件目录,Falcon 具有 add_static_route() 方法。
add_static_route(self, prefix, directory, downloadable=False,
fallback_filename=None)
prefix 参数是要匹配此路由的路径前缀。directory 参数是要从中提供文件的文件目录。downloadable 参数设置为 True,如果您希望在响应中包含 ContentDisposition 头。 fallback_filename 默认情况下为无,但在请求的文件未找到时可以指定。
add_error_handler() 方法用于为一个或多个异常类型注册处理程序。
add_error_handler(self, exception, handler=None)
可异步调用 App 类具有相同的方法。它在 falcon.asgi 模块中定义。
import falcon.asgi
app=falcon.asgi.App()
请注意,ASGI 应用程序中资源类的响应器必须是 coroutines (使用 async 关键字定义),而不是正常方法。
class HelloResource:
async def on_get(self, req, resp):
"""Handles GET requests"""
resp.status = falcon.HTTP_200
resp.content_type = falcon.MEDIA_TEXT
resp.text = (
'Hello World'
)