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

JupyterLab扩展请求Tornado服务器遭CORS拦截问题排查

问题:JupyterLab扩展跨域请求被CORS策略拦截
  • 开发场景:JupyterLab(运行在8888端口)扩展中,通过右键文件上下文菜单按钮触发Fetch API请求,目标是本地8889端口的Tornado服务器。
  • Tornado服务器已配置CORS头(GET和OPTIONS方法):
def get(self):
    self.set_header("Access-Control-Allow-Origin", "*")
    self.set_header("Access-Control-Allow-Headers", "x-requested-with")
    self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
    # ... 业务逻辑
    self.set_status(200)
    self.finish(json.dumps(...))

def options(self):
    self.set_header("Access-Control-Allow-Origin", "*")
    self.set_header("Access-Control-Allow-Headers", "x-requested-with")
    self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
    self.set_status(204)
    self.finish()
  • 前端请求代码:
const response = await fetch("http://localhost:8889/api/", {
   method: 'GET', 
   mode: 'cors', 
   headers: {
      'Accept': 'application/json'
   }
});
  • 问题现象:点击按钮后控制台提示CORS拦截,原因是缺少允许跨域的响应头;但直接在浏览器访问Tornado端点时,响应头和内容显示正常。

解决方案

1. 补充允许的请求头配置

你的请求中携带了Accept: application/json头,但Tornado配置的Access-Control-Allow-Headers仅包含x-requested-with,这会导致浏览器预检(OPTIONS)请求失败。修改服务器的允许头配置,加入Accept:

# 在GET和OPTIONS方法中更新该行
self.set_header("Access-Control-Allow-Headers", "x-requested-with, Accept")

如果需要支持更多自定义头,也可以临时用*(生产环境不推荐,存在安全风险):

self.set_header("Access-Control-Allow-Headers", "*")

2. 验证预检请求的响应

打开浏览器开发者工具(Network面板),筛选OPTIONS请求,检查响应头是否包含正确的Access-Control-*字段:

  • 确认Access-Control-Allow-Origin为*
  • 确认Access-Control-Allow-Headers包含请求中使用的所有头
  • 确认Access-Control-Allow-Methods包含GET

3. 检查Tornado头设置的时机

确保所有CORS头在self.finish()之前设置,避免被后续逻辑覆盖。如果使用了Tornado的装饰器或中间件,需确认它们没有修改或移除CORS头。

4. 关于JupyterLab的说明

JupyterLab本身不会额外限制跨域请求,问题根源还是浏览器的标准CORS规则,和从JupyterLab发起请求无关。


内容的提问来源于stack exchange,提问作者Zedoka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:55:23