SWFUpload + Django 1.2 CSRF 问题
Posted
技术标签:
【中文标题】SWFUpload + Django 1.2 CSRF 问题【英文标题】:SWFUpload + Django 1.2 CSRF problem 【发布时间】:2011-06-30 14:48:51 【问题描述】:每当我尝试在 Django 1.2 上使用 SWFUpload 上传文件时,都会收到 HTTP 403 错误。我确定这是一个 CSRF 错误,因为当我使用 @csrf_exempt 装饰器时工作正常。
window.onload = function
var settings =
...
post_params:
"csrfmiddlewaretoken": "csrf_token"
,
...
;
var swfu = new SWFUpload(settings);
;
我也尝试使用 SWFUpload.addPostParam() 没有成功
var swfu = new SWFUpload(settings);
swfu.addPostParam('csrfmiddlewaretoken', 'csrf_token');
我确定我将令牌传递给模板,因为我可以在源代码中看到它。 我上传到的目录是可写的。我 chmod 777 它。
有什么想法吗?
【问题讨论】:
【参考方案1】:除了 post params 中的“csrfmiddlewaretoken”,django 还期望 CSRF cookie 设置正确,否则用户将收到 404 错误。
在您的中间件中将会话令牌复制到 cookie 中,同时复制 csrftoken 即可。我按照http://blog.fogtunes.com/2009/11/howto-integrate-swfupload-with-django/ 的说明更新了中间件部分,如下所示:
class SWFUploadMiddleware(object):
def process_request(self, request):
if (request.method == 'POST') and (request.path == reverse('uploads.views.manual')) :
if request.POST.has_key(settings.SESSION_COOKIE_NAME):
request.COOKIES[settings.SESSION_COOKIE_NAME] = request.POST[settings.SESSION_COOKIE_NAME]
if request.POST.has_key('csrftoken'):
request.COOKIES['csrftoken'] = request.POST['csrftoken']
【讨论】:
以上是关于SWFUpload + Django 1.2 CSRF 问题的主要内容,如果未能解决你的问题,请参考以下文章