gpt4 book ai didi

python - 在 CherryPy 中停止请求处理并从工具返回 200 响应

转载 作者:太空狗 更新时间:2023-10-30 01:00:47 25 4
gpt4 key购买 nike

我的问题

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

背景

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

问题是,我还没有找到停止执行流程的方法。这意味着原始 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回答,但是我不想“杀死”执行,我只是想要一种方法来防止调用处理程序。

最佳答案

只需让您的工具设置 request.handler = None。参见 Request.respond对于实现这个的代码和the CachingTool例如:

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

关于python - 在 CherryPy 中停止请求处理并从工具返回 200 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32133758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com