Chr*_*ris 5 python cherrypy cors
我的问题
我正在寻找一种方法来停止工具中的请求处理,而不会引发异常.换句话说:我想停止请求它到达指定的控制器并返回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...
Run Code Online (Sandbox Code Playgroud)
替代品可能无效
我知道有一个cherrypy-cors插件,但从源头上我看不出这是如何阻止执行的.
我也知道CherryPy有一个MethodDispatcher,但这意味着我们的代码完全重写.
搜索Stackoverflow我找到了这个答案,但是我不想"杀死"执行,我只想要一种方法来阻止处理程序被调用.
只需要你的工具集request.handler = None.有关实现此代码的代码和CachingTool的示例,请参阅Request.respond:
Run Code Online (Sandbox Code Playgroud)request = cherrypy.serving.request if _caching.get(**kwargs): request.handler = None
| 归档时间: |
|
| 查看次数: |
693 次 |
| 最近记录: |