Django Ajax跨域问题解决方案

跨域调用
首先下载这个插件

pip install django-cors-headers

然后在你的Django项目中的settings.py中做如下配置(install app和middleware):

INSTALLED_APPS = (

‘corsheaders’,

)

MIDDLEWARE = [ # Or MIDDLEWARE_CLASSES on Django < 1.10

‘corsheaders.middleware.CorsMiddleware’,
‘django.middleware.common.CommonMiddleware’,

]

要注意的是,CorsMiddleware最好放的尽可能的往上,比如要 在CommonMiddleware和WhiteNoiseMiddleware的上边,要不然设置的跨域响应头可能起不了什么作用。

最后配置一下你允许的跨域请求主机

允许所有主机请求你的API,这种设置下不能设置cookie,下文会说解决方案

CORS_ORIGIN_ALLOW_ALL = True

或者指定白名单。这里注意有个坑,当前后端联机调试的时候,前端在浏览器写localhost或127.0.0.1和本机的具体IP地址在白名单里是不一样的,推荐调试的时候写具体IP地址,白名单里也写具体IP地址。

CORS_ORIGIN_WHITELIST = (
‘172.30.203.52:8080’,
‘localhost:80’
)

其它的还有可以用正则配置白名单等,详见github。

到这里跨域调用是没啥问题了,但是设置cookie还是不行。也就是说以下场景会出问题:

前台登陆,将用户名密码跨域传到后台,后台校验正确,把用户填到session里,把sessionid放到cookie中,返回response,这个时候前端发现自己仍然处于未登录状态。

设置cookie
要跨域设置cookie,需要前后端的共同努力,首先看后端:

前提是插件下载好了,并且install_app和middleware都配置了。如上边提到的,将CORS_ORIGIN_ALLOW_ALL设为false,通过白名单的方式设定允许跨域请求的请求源,然后再设置CORS_ALLOW_CREDENTIALS配置项为True,如下:

CORS_ORIGIN_ALLOW_ALL = False

CORS_ORIGIN_WHITELIST = (
‘172.30.203.52:8080’,
)

If True, cookies will be allowed to be included in cross-site HTTP requests. Defaults to False.

CORS_ALLOW_CREDENTIALS = True

至此后端配置结束,然后是前端的工作:

前端只需要在没一个跨域的Ajax请求体中添加一个.withCredentials()字段就可以啦,jquery示例如下:

$.ajax({
url: a_cross_domain_url,
// 将XHR对象的withCredentials设为true
xhrFields: {
withCredentials: true
}

然后前后端就可以愉快的cookie交互啦~

原文:https://blog.csdn.net/qq_30242609/article/details/73865076

你可能感兴趣的:(python—django,前后端分离)