Python Falcon - 应用类



此类是基于 Falcon 的 WSGI 应用的主要入口点。此类的实例提供了可调用的 WSGI 接口和路由引擎。

import falcon
app = falcon.App()

此类的 __init__() 构造函数接受以下关键字参数 -

  • media_type - 初始化 RequestOptions 和 ResponseOptions 时使用的媒体类型。Falcon 允许轻松自定义互联网媒体类型处理。默认情况下,Falcon 仅启用 JSON 和 HTML(URL 编码和多部分)表单的处理程序。

  • Falcon 支持的其他媒体类型由以下常量表示 -

    • falcon.MEDIA_JSON

    • falcon.MEDIA_MSGPACK

    • falcon.MEDIA_MULTIPART

    • falcon.MEDIA_URLENCODED

    • falcon.MEDIA_YAML

    • falcon.MEDIA_XML

    • falcon.MEDIA_HTML

    • falcon.MEDIA_JS

    • falcon.MEDIA_TEXT

    • falcon.MEDIA_JPEG

    • falcon.MEDIA_PNG

    • falcon.MEDIA_GIF

  • 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 模板路由到资源。如果路径与给定路由的模板匹配,则请求将传递给关联的资源以进行处理。根据请求方法,将调用相应的响应器方法。

示例

让我们将 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)

输出

使用 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"""}" https://127.0.0.1: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 参数是要从中提供文件的源目录。如果要包含 ContentDisposition 标头在响应中,则 downloadable 参数设置为 True。fallback_filename 默认情况下为 None,但可以在找不到请求的文件时指定。

add_error_handler() 方法用于为一个或多个异常类型注册处理程序。

add_error_handler(self, exception, handler=None)

ASGI 可调用 App 类拥有相同的方法。它在 falcon.asgi 模块中定义。

import falcon.asgi
app=falcon.asgi.App()

请注意,ASGI 应用程序中资源类的响应器必须是 协程(用 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'
      )
广告