下面两种情况,是不受跨域限制的,严格来讲,这两种情况只是跨站资源请求:
1)页面中的链接,重定向及表单提交是不受同源策略限制的
2)跨域资源的引入,如 < script src="" > < image src="" > < iframe > 等
第一种解决跨域请求的方式 JsonP, 缺点:只支持GET请求。
第二种解决跨域请求方式:在响应头加上响应的允许跨域的参数,告诉浏览器当前请求被服务器接受,这种跨域方式也是通用的。
写一个中间件解决
from django.utils.deprecation import MiddlewareMixin
# 中间件加响应头解决跨域问题
class MyCors(MiddlewareMixin):
def process_response(self,request, response):
response['Access-Control-Allow-Origin'] = '*'
# 复杂请求会先发预检 OPTIONS
if request.method == 'OPTIONS':
response['Access-Control-Allow-Headers'] = 'Content-Type'
response['Access-Control-Allow-Methods'] = 'PUT, PATCH, DELETE'
return response
第三种方式Django框架中:下载Django-cors-headers 处理跨域请求
注册APP
INSTALLED_APPS = (
...
'corsheaders',
...
)
注册中间件 这个corsheaders中间件必须在csrf跨域伪造之前
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
setting下面添加的配置
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
'*'
)
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)