news 2026/9/11 5:22:45

如何配置 blackd 的 --cors-allow-origin 允许浏览器跨域请求

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何配置 blackd 的 --cors-allow-origin 允许浏览器跨域请求

如何配置 blackd 的 --cors-allow-origin 允许浏览器跨域请求

【免费下载链接】blackThe uncompromising Python code formatter项目地址: https://gitcode.com/GitHub_Trending/bl/black

如果你在浏览器侧写了客户端(网页或浏览器内工具通过 fetch 调用 blackd 的 HTTP 接口来格式化 Python 代码),会碰到一个默认行为:blackd 默认拒绝跨域的浏览器请求——任何携带Origin请求头且未在白名单中的请求都会被返回 HTTP 403,浏览器端表现为跨域失败。解决方法是在启动 blackd 时传入一个或多个--cors-allow-origin参数,放行指定的来源。本文按安装、观察默认拒绝行为、配置白名单、验证预检与真实请求的顺序完成这个任务。

安装 blackd

blackd 没有随 black 一起打包,因为它有额外依赖,需要通过[d]extra 安装:

pip install 'black[d]'

官方文档明确警告:blackd 不应作为公开可访问的服务运行,没有任何防止滥用的安全措施,仅限本地使用。安装后运行blackd --help可以查看全部命令行参数,blackd 提供的选项比 black 本身更少。

默认行为:白名单外的 Origin 会被 403 拒绝

blackd 只在/路径接受POST请求。请求的 CORS 处理逻辑在中间件 src/blackd/middlewares.py 中:

  • 请求没有Origin头(例如直接用 curl 调用):不受 CORS 检查影响,直接处理;
  • Origin不在允许列表中:返回 HTTP 403,响应体为CORS origin is not allowed,且响应中没有任何Access-Control-Allow-Origin等 CORS 头。

先启动一个未配置任何 origin 的 blackd 来验证这个默认行为。以下端口沿用官方文档的测试示例(9090;不加参数时默认绑定 localhost、端口 45484,见 src/blackd/init.py):

blackd --bind-port 9090 & curl -si -XPOST "localhost:9090" -d "print('valid')" -H "Origin: https://example.com"

预期得到 403,响应体为CORS origin is not allowed,且响应头中没有Access-Control-Allow-Origin。项目测试 tests/test_blackd.py 中的test_cors_requests_rejected_by_default断言的正是这一结果。

用 --cors-allow-origin 放行指定来源

--cors-allow-origin参数定义在 src/blackd/init.py,帮助文本为 "Origin allowed to access blackd over CORS. Can be passed multiple times."——可以多次传入,每传入一次放行一个来源:

blackd --bind-port 9090 --cors-allow-origin "https://example.com"

https://example.com是项目测试中使用的示例值,你需要把它替换为实际调用 blackd 的网页的 Origin(协议 + 主机 + 端口,即浏览器发出的Origin头的值)。需要放行多个来源时,再追加参数并同样传入对应的 Origin 值。

验证配置生效

带参数重启 blackd 后,分两步验证。

预检(preflight)请求

浏览器对携带自定义请求头的跨域 POST 会先发出 OPTIONS 预检。tests/test_blackd.py 中test_cors_preflight(配置了 origin 的测试用例)给出的请求头如下,等价命令:

curl -si -X OPTIONS "localhost:9090" \ -H "Origin: https://example.com" \ -H "Access-Control-Request-Method: POST" \ -H "Access-Control-Request-Headers: Content-Type"

该测试断言的结果即预期结果:响应状态为 200,Access-Control-Allow-Origin的值就是被放行的 origin,Access-Control-Allow-HeadersAccess-Control-Allow-Methods均存在。其中Allow-Headers的内容是 blackd 支持的全部X-*请求头加上Content-TypeAllow-MethodsOPTIONS, POST(见 src/blackd/middlewares.py)。

真实 POST 请求

curl -si -XPOST "localhost:9090" -d "print('valid')" -H "Origin: https://example.com"

响应会带有Access-Control-Allow-Origin: https://example.com,并且Access-Control-Expose-Headers中包含X-Black-Version,也就是浏览器端 JS 可以读取响应头中的 black 版本号。状态码含义按官方协议说明:

  • 200:输入需要格式化,响应体为格式化后的代码;
  • 204:输入已符合格式,响应体为空(上面的print('valid')属于这种情况);
  • 400:输入存在语法错误,细节在响应体中返回。

而用白名单之外的 Origin 发送同样的请求,仍然返回 403——白名单只放行你显式传入的 origin。

使用限制

  • blackd 仅限本地使用,文档明确警告不要把它当作公开服务运行;
  • 只接受/路径上的POST,预检放行的方法固定为OPTIONS, POST
  • 请求体默认限制 5 MiB,需要传输更长代码时用--max-body-size调整该上限;
  • origin 匹配是中间件对Origin头做的精确匹配(见 src/blackd/middlewares.py),文档未提供通配符等模糊匹配机制。

【免费下载链接】blackThe uncompromising Python code formatter项目地址: https://gitcode.com/GitHub_Trending/bl/black

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 5:22:09

Spark ALS音乐推荐实战:千万级日志下的参数调优与冷启动工程方案

简介:本资源是一套完整的Spark大数据音乐推荐系统实践方案,面向计算机、人工智能、电子信息等专业的在校学生、教师及初入行业的工程师,聚焦协同过滤算法在真实场景中的落地应用。内容涵盖ALS矩阵分解原理详解、Spark MLlib实现代码、可运行项…

作者头像 李华
网站建设 2026/9/11 5:21:35

Windows多版本开发环境管理实战:从JDK到Docker

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 5:21:06

光模块固晶机高精度伺服系统调试实战指南

1. 项目概述:这不是一台普通贴片机,而是一台“光路级”精密装配系统光模块固晶机——这个名字听起来像半导体封装设备里的常规选手,但实际走进产线你会发现,它干的活儿远比普通SMT贴片机更“娇气”。普通贴片机对位精度做到25μm就…

作者头像 李华
网站建设 2026/9/11 5:20:52

ARM Cortex-M4嵌入式AI静态评测:从KWS固件解剖到内存与指令级优化

1. 项目概述:这不是一次普通代码扫描,而是一次嵌入式AI系统的“解剖手术”你手头正拿着一块基于Cortex-M4的开发板,上面跑着一个关键词唤醒(KWS)模型,它能在毫瓦级功耗下听懂“Hey Jarvis”——但你完全不清…

作者头像 李华
网站建设 2026/9/11 5:19:32

cURL自定义Host头引发的跨源Cookie泄漏与注入攻击详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 5:19:29

Qwen3源码证据驱动评测:大模型开源仓库的静态工程审阅

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华