python跨域_Django解决ajax跨域访问问题

Django解决ajax跨域访问问题

这篇文章主要给大家介绍了关于Django跨域请求问题解决的相关资料,文中介绍的实现方法包括:使用django-cors-headers全局控制、使用JsonP,只能用于Get方法以及在views.py里设置响应头,只能控制单个接口,需要的朋友可以参考下。

使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调用该API:

但是,Chrome浏览器提示错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource.

这是由于CORS导致的。

什么是CORS?

CORS(跨域资源共享,Cross-Origin Resource Sharing)是一种跨域访问的机制,可以让Ajax实现跨域访问。

其实,在服务器的response header中,加入“Access-Control-Allow-Origin: *”即可支持CORS,非常的简单,apache/nginx等怎么配置,见参考文档。

举个例子:

API部署在DomainA上;

Ajax文件部署在DomainB上,Ajax文件会向API发送请求,返回数据;

用户通过DomainC访问DomainB的Ajax文件,请求数据

几种方法:

1.使用JSONP使用Ajax获取json数据时,存在跨域的限制。不过,在Web页面上调用js的script脚本文件时却不受跨域的影响,JSONP就是利用这个来实现跨域的传输。因此,我们需要将Ajax调用中的dataType从JSON改为JSONP(相应的API也需要支持JSONP)格式。

JSONP只能用于GET请求。

2.直接修改Django中的views.py文件修改views.py中对应API的实现函数,允许其他域通过Ajax请求数据:

def myview(_request):

response = HttpResponse(json.dumps({"key": "value", "key2": "value"}))

response["Access-Control-Allow-Origin"] = "*"

response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"

response["Access-Control-Max-Age"] = "1000"

response["Access-Control-Allow-Headers"] = "*"

return response

3.安装django-cors-headers这里还有一各发现!在Django中,有人开发了CORS-header的middleware,只在settings.py中做一些简单的配置即可,见:https://github.com/ottoyiu/dj...,开启CORS,没有跨域烦恼,真爽!~

django-cors-headers

首先安装

然后在settings.py里配置一番就可以

INSTALLED_APPS = [

...

'corsheaders',

... ]

MIDDLEWARE_CLASSES = (

...

#尽可能靠前,必须在CsrfViewMiddleware、CommonMiddleware之前。

#我们直接放在第一个位置就好了

'django.middleware.csrf.CsrfViewMiddleware',

'corsheaders.middleware.CorsMiddleware',

'django.middleware.common.CommonMiddleware',

...

)

添加参数为true

CORS_ORIGIN_ALLOW_ALL = True

#下面这些可以不用设置

#跨域增加忽略

CORS_ALLOW_CREDENTIALS = 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',

)

你可能感兴趣的:(python跨域)