CherryPy CORS预请求响应异常:浏览器跨域请求被拦截问题
解决CherryPy Webhook的CORS预请求错误问题
根据你遇到的错误,核心问题是OPTIONS预请求没有返回200 OK状态码,即便配置了cherrypy_cors,也可能是处理逻辑未覆盖OPTIONS请求或头信息设置不全。以下是具体解决方案:
1. 完整配置cherrypy_cors并处理OPTIONS请求
要确保CherryPy正确响应预请求,需在全局和路由层面配置CORS,并显式处理OPTIONS方法:
import cherrypy import cherrypy_cors class WebhookService: @cherrypy.expose @cherrypy.tools.json_in() @cherrypy.tools.json_out() def webhook(self): # 优先处理OPTIONS预请求 if cherrypy.request.method == 'OPTIONS': cherrypy_cors.preflight(allowed_methods=['POST', 'OPTIONS']) return '' # 处理POST请求的业务逻辑 req_data = cherrypy.request.json return {"status": "success", "received": req_data} if __name__ == '__main__': # 初始化CORS工具 cherrypy_cors.install() # 全局配置 cherrypy.config.update({ 'cors.expose.on': True, 'server.socket_host': '0.0.0.0', 'server.socket_port': 8080, }) # 路由级CORS设置 cherrypy.tree.mount( WebhookService(), '/', { '/webhook': { 'cors.expose.on': True, # 指定允许的前端源(生产环境别用*) 'cors.origin.allow': ['http://127.0.0.1:3000'], 'cors.methods.allow': ['POST', 'OPTIONS'], # 允许htmx的自定义请求头 'cors.headers.allow': ['Content-Type', 'HX-Request', 'HX-Target', 'HX-Current-URL'] } } ) cherrypy.engine.start() cherrypy.engine.block()
2. 关键配置要点
- 必须在
webhook方法中显式处理OPTIONS请求,调用cherrypy_cors.preflight()后返回空字符串,确保返回200 OK状态。 - 路由配置中要把
OPTIONS加入允许的方法列表,否则CherryPy会默认拒绝该请求。 - 要包含htmx特有的请求头到
cors.headers.allow中,因为htmx发起请求会携带这些头,预请求必须允许这些头才能通过。
3. 验证预请求是否正常
用curl发送OPTIONS请求测试:
curl -X OPTIONS http://localhost:8080/webhook \ -H "Origin: http://127.0.0.1:3000" \ -H "Access-Control-Request-Method: POST" \ -H "Access-Control-Request-Headers: Content-Type,HX-Request"
若返回状态码200,且响应头包含Access-Control-Allow-Origin、Access-Control-Allow-Methods等字段,说明配置生效。
4. 常见错误排查
- 检查全局配置是否开启
cors.expose.on,否则路由级配置不会生效。 - 不要遗漏htmx的自定义请求头,否则预请求会因不允许的头被拦截。
- 生产环境避免用
*作为允许的源,指定具体域名更安全。
内容的提问来源于stack exchange,提问作者Joshua Dunne
相关产品推荐
相关产品推荐

