问题描述
django版本3.2
在做前后端分离项目过程中需要用到跨站点POST请求,但会被django拦截。尽管将settings.py
中的django.middleware.csrf.CsrfViewMiddleware
注释掉可以解决,但在正式部署的情况下是不能这么做的,因为这会导致全局的csrf防护失效从而出现漏洞。
解决方案
在settings.py中添加
1 2
| CSRF_TRUSTED_ORIGINS = ['servicewechat.com']
|
首先要使前后端能交流csrftoken和cookie:
Django后端:
1 2 3 4 5 6 7 8 9 10
| from django.middleware.csrf import get_token
def token(request): token=get_token(request) return JsonResponse({'token':token})
path('token', views.token)
|
微信js前端:
1 2 3 4 5 6 7 8 9
| function getToken(callback) { wx.request({ url: DBPath + 'token', success:(res)=>{ if(callback) callback(res); } }); }
|
在小程序启动或者登录的时候向后端发送获取csrftoken
的请求
1 2 3 4 5 6 7
| getToken((res)=>{ console.log(res) let temp = (res.cookies[0].split(';')[0]).split('=')[1]; wx.setStorageSync('csrftoken', res.data.token); wx.setStorageSync('cookie', res.header['Set-Cookie']); })
|
在js的POST请求中添加请求头(以wx.uploadFile
为例):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| wx.uploadFile({ filePath: path, name: 'file', header: { 'content-type': 'application/x-www-form-urlencoded', 'cookie': wx.getStorageSync('cookie'), 'X-CSRFToken': wx.getStorageSync('csrftoken') }, formData:{ ... }, url: DBPath + 'upload-avatar', }
|