背景:

前后端分离开发, 由于前段使用vue架构开发不可避免遇到跨域问题

解决方法

使用corsheaders模块

步骤

第一步:corsheaders安装

pip install django-cors-headers

第二步:打开项目中setting.py文件

第三步:注册应用

INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
]

第四步:中间件设置

MIDDLEWARE = [  
    ...    
    'corsheaders.middleware.CorsMiddleware',
    ...
]

第五步:添加白名单以及其他配置信息

CORS_ORIGIN_ALLOW_ALL: 

添加允许执行跨站点请求的主机

# 如果为True,则将不使用白名单,并且将接受所有来源。默认为FalseCORS_ORIGIN_ALLOW_ALL = True	

CORS_ORIGIN_WHITELIST: 

授权进行跨站点HTTP请求的来源列表。默认为[]

CORS_ORIGIN_WHITELIST = [
    '127.0.0.1:8080',
]

CORS_ORIGIN_REGEX_WHITELIST: 

代表正则表达式的字符串列表

CORS_ORIGIN_REGEX_WHITELIST = [
    r"^ 
]

CORS_URLS_REGEX: 

只需要在网站的一部分上使用CORS时很有用,例如位于的API /api/。 CORS_URLS_REGEX = r'^/api/.*$'

CORS_URLS_REGEX = [
     r'^/api/.*$',
]

CORS_ALLOW_METHODS: 

实际请求所允许的HTTP动词列表。(可以不写,不写不会影响使用)

# 默认为
# CORS_ALLOW_METHODS = [
#     'DELETE',
#     'GET',
#     'OPTIONS',
#     'PATCH',
#     'POST',
#     'PUT',
# ]

# 自定义所允许的http动词列表
from corsheaders.defaults import default_methods
CORS_ALLOW_METHODS = list(default_methods) + [
    'POKE',]

CORS_ALLOW_HEADERS: 

发出实际请求时可以使用的非标准HTTP标头的列表。

# 默认为:CORS_ALLOW_HEADERS = [
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',]# 自定义http标头from corsheaders.defaults import default_headers
CORS_ALLOW_HEADERS = list(default_headers) + [
    'my-custom-header',]

CORS_EXPOSE_HEADERS: 

将向浏览器公开的HTTP标头列表。默认为 []。

CORS_PREFLIGHT_MAX_AGE: 

客户端/浏览器可以缓存预检响应的秒数。如果该值为0(或任何错误值),则不会发送最大期限标头。默认为 86400(一天)。

注意:预检请求是在发出“不太简单”的请求(例如Content-Type,不是 application/x-www-form-urlencoded)时确定的,它是确定服务器实际接受的请求的额外请求。

CORS_ALLOW_CREDENTIALS: 

如果为True,则将允许将cookie包含在跨站点HTTP请求中。默认为False

在Django 2.1中,添加了SESSION_COOKIE_SAMESITE设置,'Lax’默认情况下设置为 ,这将防止Django的会话cookie跨域发送。更改它以None绕过此安全限制

CSRF整合

大多数站点都需要利用Django提供的跨站点请求伪造保护。CORS和CSRF是分开的,并且Django无法使用您的CORS配置免除网站Referer对安全请求所做的检查。做到这一点的方法是使用其CSRF_TRUSTED_ORIGINS设置。例如:

CORS_ORIGIN_WHITELIST = [
    'http://read.only.com',
    'http://change.allowed.com',
]

CSRF_TRUSTED_ORIGINS = [
    'change.allowed.com',
]

CORS_REPLACE_HTTPS_REFERER

CSRF_TRUSTED_ORIGINS是Django 1.9中引入的,因此早期版本的用户将需要替代解决方案。如果CORS_REPLACE_HTTPS_REFERER为 True,CorsMiddleware则将Referer标头更改为每当CORS检查通过时将通过Django的CSRF检查的内容。默认为 False。

请注意,与不同CSRF_TRUSTED_ORIGINS,此设置不允许您区分CORS 信任读取资源的域和避免CSRF保护而信任更改资源的域。

启用此功能corsheaders.middleware.CorsPostCsrfMiddleware后django.middleware.csrf.CsrfViewMiddleware,还应该在之后 添加,MIDDLEWARE_CLASSES以撤消Referer替换:

MIDDLEWARE_CLASSES = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    ...
    'django.middleware.csrf.CsrfViewMiddleware',
    'corsheaders.middleware.CorsPostCsrfMiddleware',
    ...
]


本文地址: http://chenxm.cc/article/1175.html
版权声明: 本文为原创文章,版权归  陈新明  所有,欢迎分享本文,转载请保留出处!
上一篇: 阿里云云数据库RDS MySQL版中执行“create table XXX select XXX”语句报错
下一篇: mac 使用python安装 python install playwright提示错误 Operation not permitted解决方法
发表评论

还没有留言,还不快点抢沙发?