PYTHON-跨域请求

本文解析了CORS请求的两种类型:简单请求与非简单请求。简单请求直接进行数据传输,而非简单请求需先进行预检,确认服务器允许特定请求方法和头部信息后,再进行数据传输。文章详细介绍了预检过程及服务器如何设置响应头来允许特定请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两种请求

浏览器将CORS请求分为两类:简单请求(simple request)和非简单请求(not-so-simple request).
只要同时满足以下两大条件, 就属于简单请求

(1) 请求方法一下三种方法之一:
HEAD
GET
POST
(2)HTTP的头信息不超过提下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type: 只限于三个值application/x-www-from-urlencoded、multipart/form-data、text/plain

凡是不同时满足上面两个条件, 就属于非正常请求。
浏览器对着两种请求的处理, 是不一样的。

- 简单请求和非简单请求的区别?
	简单请求: 一次请求
	非简单请求: 两次请求, 在发送数据之前会发生一次请求用于"预检", 只有"预检"通过后才在发送一次请求用于数据传输。
- 关于"预检"

- 请求方式:OPTIONS
- "预检"其实做检查, 检查如果通过则允许传输数据, 查不通过则不再发送真正想要发送的消息
- 如何"预检"
	=> 如果复杂的请求是PUT等请求, 则服务器需要设置允许某请求, 否则"预检不通过"Access-Control-Request-Method
	=> 如果复杂请求设置了请求头, 则服务端需要设置允许请求头, 否则"预检"不通过Access-Control-Request-Headers

案列

  • 服务器1向服务器2要数据图解
    在这里插入图片描述
  1. 简单请求解决方案
    在服务器2的接口里设置个Access-Control-Allow-Origin
    在这里插入图片描述
  2. 非简单请求
    会发送两条请求, 一条options, 一条post
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在服务器2的接口里设置个Access-Control-Allow-Headers
    在这里插入图片描述
### Python 中设置请求 (CORS) 的解决方案 在 Python 开发中,尤其是基于 Flask 或 Django 的 Web 应用程序开发过程中,可能会遇到资源共享(CORS)问题。以下是针对 Flask 和其他框架的常见解决方案。 #### 使用 Flask-CORS 实现全局支持 对于 Flask 框架,可以借助 `flask-cors` 扩展库实现请求的支持。以下是一个典型的例子: ```python from flask import Flask, jsonify from flask_cors import CORS app = Flask(__name__) # 方式1:允许所有路由的请求 CORS(app, resources=r'/*') @app.route('/api/data') def get_data(): return jsonify({'data': 'Hello, CORS with global settings!'}) if __name__ == '__main__': app.run(debug=True) ``` 上述代码展示了如何通过 `CORS(app, resources=r'/*')` 来启用全局范围内的支持[^4]。这里的参数 `resources=r'/*'` 表示匹配所有路径下的资源都可被访问。 另一种方法可以通过指定额外选项来增强安全性或满足特定需求: ```python CORS(app, supports_credentials=True) ``` 此配置能够处理带有凭证(如 Cookies)的请求[^2]。 #### 原理说明 CORS 是一种由 W3C 制定的标准协议,用于定义浏览器与服务器之间如何协商源 HTTP 请求的安全边界条件。当客户端尝试发送一个站点 AJAX 请求时,现代浏览器会自动附加 Origin 头部字段到该请求上;随后服务端需返回合适的 Access-Control-Allow-Origin 响应头部以表明其接受哪些来源的连接[^3]。 例如,在响应头加入如下内容即可显式声明许可某单一名或者开放给任意网站调用 API 接口: ``` Access-Control-Allow-Origin: * ``` #### Spring Boot 下的注解方式 除了 Flask 平台外,在 Java 生态中的 Spring Boot 微服务体系里也有简便快捷的办法应对同样的场景——即利用内置的 @CrossOrigin 注解读写控制器层逻辑部分即可快速达成目标效果而无需修改太多底层架构设计细节。 --- ### 总结 无论是选用轻量级脚本语言构建的小型项目还是大型企业级应用系统建设过程之中都会面临类似的挑战情况发生时候应该优先考虑官方推荐的最佳实践做法并结合实际业务特点灵活调整策略最终达到既保障安全又能高效运作的目的.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只因为你温柔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值