You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:21:16