Django-cors-headers解决同源策略限制下的跨域请求

2023-06-3017:09:26后端程序开发Comments696 views字数 2893阅读模式

浏览器具有同源策略的限制,导致发送ajax请求+跨域存在无法获取数据。Django-cors-headers就是用于解决Django跨域请求问题的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

、安装和配置cors-headers文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

  1. 安装django-cors-headers
pip install django-cors-headers

2.在setting.py添加配置文件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

#注册应用INSTALLED_APPS = (  ...  'corsheaders',  ...)#中间层添加设置MIDDLEWARE = [  ...  'corsheaders.middleware.CorsMiddleware',  ...]

二、添加跨域白名单设置文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

(一)必选设置文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

在 Django 设置中配置中间件的行为。必须设置以下三个中的至少一个:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

CORS_ALLOWED_ORIGINSCORS_ALLOWED_ORIGIN_REGEXESCORS_ALLOW_ALL_ORIGINS

1.CORS_ALLOWED_ORIGINS:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

可以发出跨站点 HTTP 请求的源列表。默认端口(HTTPS = 443,HTTP = 80)是可选的。此前这个方法别名叫CORS_ORIGIN_WHITELIST。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

CORS_ALLOWED_ORIGINS = [    "https://example.com",    "https://sub.example.com",    "http://localhost:8080",    "http://127.0.0.1:9000",]

2.CORS_ALLOWED_ORIGIN_REGEXES:序列[str |模式[str]]文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

表示与可以发出跨站点 HTTP 请求的源匹配的正则表达式的字符串列表。默认为 []。 当CORS_ALLOWED_ORIGINS当有大量子域名时很有用。以前此设置称为 CORS_ORIGIN_REGEX_WHITELIST。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

CORS_ALLOWED_ORIGIN_REGEXES = [    r"^https://\w+\.example\.com$",]

3.CORS_ALLOW_ALL_ORIGINS:布尔值文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

如果为 True,则将允许所有源。限制允许的源的其他设置将被忽略。默认为 False。将其设置为 True 可能很危险,因为它允许任何网站向您的网站发出跨源请求。通常,需要使用CORS_ALLOWED_ORIGINS或CORS_ALLOWED_ORIGIN_REGEXES来限制允许的源列表。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

以前此设置称为 CORS_ORIGIN_ALLOW_ALL。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

三、可选设置,默认值基本够用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

1.CORS_ALLOW_METHODS请求允许的 HTTP 动作的列表。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

CORS_ALLOW_METHODS = (    "DELETE",    "GET",    "OPTIONS",    "PATCH",    "POST",    "PUT",)

默认值可以作为corsheaders.defaults.default_methods导入,自定义扩展如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

from corsheaders.defaults import default_methods
CORS_ALLOW_METHODS = (    *default_methods,    "POKE",)

2.CORS_ALLOW_HEADERS来自浏览器的请求中允许的非标准 HTTP 请求头的列表。设置访问控制允许请求头以响应预检请求。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

默认为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

CORS_ALLOW_HEADERS = (    "accept",    "authorization",    "content-type",    "user-agent",    "x-csrftoken",    "x-requested-with",)

默认值可以作为corsheaders.defaults.default_headers导入,自定义扩展如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

from corsheaders.defaults import default_headers
CORS_ALLOW_HEADERS = (    *default_headers,    "my-custom-header",)

四.CSRF 集成文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

大多数站点都需要利用跨站点请求伪造保护Django请求。CORS和CSRF是分开的,Django无法使用CORS配置以免除站点的引用检查,如果要需使用需设置CSRF_TRUSTED_ORIGINS。例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

CORS_ALLOWED_ORIGINS = [    "https://read-only.example.com",    "https://read-and-write.example.com",]CSRF_TRUSTED_ORIGINS = [    "https://read-and-write.example.com",]

五、与Signals信号一起使用文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

如果处理程序附加到信号返回一个真实值,请求被允许。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

例如,自定义如下处理程序:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

# myapp/handlers.pyfrom corsheaders.signals import check_request_enabledfrom myapp.models import MySite
def cors_allow_mysites(sender, request, **kwargs):    return MySite.objects.filter(host=request.headers["origin"]).exists()
check_request_enabled.connect(cors_allow_mysites)

然后在应用程序准备就绪时使用 Django AppConfig 连接它:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

# myapp/__init__.py
default_app_config = "myapp.apps.MyAppConfig"
# myapp/apps.pyfrom django.apps import AppConfig
class MyAppConfig(AppConfig):    name = "myapp"    def ready(self):        # Makes sure all signal handlers are connected        from myapp import handlers  # noqa

信号的一个常见用例是允许所有源访问子集 的 URL,同时允许一组普通的源访问所有 URL。首先将CORS_ALLOWED_ORIGINS设置为受信任源的列表,这些源是 允许访问每个 URL,然后将处理程序添加到 check_request_enabled 以允许 CORS,而不考虑 不受限制的网址。例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

# myapp/handlers.pyfrom corsheaders.signals import check_request_enabled
def cors_allow_api_to_everyone(sender, request, **kwargs):    return request.path.startswith("/api/")
check_request_enabled.connect(cors_allow_api_to_everyone)

参考文档:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

https://github.com/adamchainz/django-cors-headers文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48918.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/48918.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定