【问题标题】:Stop request processing in CherryPy and return 200 response from a tool在 CherryPy 中停止请求处理并从工具返回 200 响应
【发布时间】:2015-11-15 00:16:14
【问题描述】:

我的问题

我正在寻找一种方法来停止工具中的请求处理而不引发异常。换句话说:我想在请求到达指定控制器之前停止请求并返回 2xx 状态码?

背景

我们希望我们的应用程序支持 CORS 并因此支持预检请求。这个想法是编写一个挂钩before_handler 的工具。如果发出 OPTIONS 请求,则返回相关的 CORS 标头并退出。

问题是,我还没有找到停止执行流程的方法。这意味着原始 URL 已被处理,就像正常请求时一样。关键是:这可能会导致安全问题,因为总是会发出预检请求。这是我目前所拥有的:

class CORSTool(cherrypy.Tool):
    def __init__(self):
        cherrypy.Tool.__init__(self, 'before_handler', self.insert_cors_header, priority=40)
        cherrypy.request.hooks.attach('before_handler', self.insert_cors_header, priority=40)

    def _setup(self):
        cherrypy.Tool._setup(self)

    def insert_cors_header(self):
        """
        Inserts the relevant CORS-Headers:
        - Access-Control-Allow-Origin: <from-config>
        - Access-Control-Allow-Methods: POST, GET, OPTIONS
        - Access-Control-Max-Age: 86400
        """
        if cherrypy.config.get('enable_cors') is True:
            if cherrypy.request.method.upper() == "OPTIONS":
                cherrypy.response.headers['Access-Control-Allow-Origin'] = cherrypy.config.get('cors_domains')
                cherrypy.response.headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
                cherrypy.response.headers['Access-Control-Max-Age'] = '86400'

                # Stop execution
                cherrypy.response.body = None
                cherrypy.response.status = 200
                cherrypy.response.finalize()

                # And NOW stop doing anything else...

替代方案可能不起作用

我知道有一个cherrypy-cors 插件,但是从源代码中我看不到它是如何停止执行的。

我也知道 CherryPy 有一个 MethodDispatcher,但这意味着我们要完全重写我们的代码。

搜索 Stackoverflow 我找到了this 答案,但是我不想“杀死”执行,我只是想要一种方法来防止调用处理程序。

【问题讨论】:

  • 查看cherrypy中的HandlerTool示例wiki

标签: python cors cherrypy


【解决方案1】:

只需让您的工具集 request.handler = None。有关实现此功能的代码,请参见 Request.respond,示例请参见 the CachingTool

    request = cherrypy.serving.request
    if _caching.get(**kwargs):
        request.handler = None

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多