Django,csrf_令牌在重定向后未出现在窗体上

Django,csrf_令牌在重定向后未出现在窗体上,django,Django,我使用这个中间件将所有页面重定向到登录页:(属于AuthRequiredMiddleware类的一部分) def process_request(self, request): assert hasattr(request, 'user') if not request.user.is_authenticated(): path = request.path_info.lstrip('/') if path not in ['ipn/', 'pp

我使用这个中间件将所有页面重定向到登录页:(属于
AuthRequiredMiddleware
类的一部分)

def process_request(self, request):
    assert hasattr(request, 'user') 
    if not request.user.is_authenticated():
        path = request.path_info.lstrip('/')
        if path not in ['ipn/', 'pp_cancel/', 'pp_success/', 'sitemap/', 'welcome/']:
            lang = request.GET.get('lang', 'en')
            ru = request.GET.get('ru', '')
            return render_to_response('landing_en.html', RequestContext(request, {'ru': ru}))
这是我的
settings.py

MIDDLEWARE_CLASSES = (                                                                                                                                                                                   
     'django.middleware.cache.UpdateCacheMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.locale.LocaleMiddleware',
     'main.common.SessionBasedLocaleMiddleware.SessionBasedLocaleMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.cache.FetchFromCacheMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'main.common.tz_middleware.TimezoneMiddleware',
     'main.common.sslMiddleware.SSLRedirect',
     'main.common.RedirectAllMiddleware.AuthRequiredMiddleware',
)
如果url是(例如)
/welcome/
,并且没有执行重定向
{%csrf_token%}
工作并显示在表单中。如果用户被重定向,则表单中没有显示csrf_token

我做错了什么?

来自关于CSRF:

跨站点请求伪造,也称为一键攻击或 会话骑乘[…]是对网站的一种恶意攻击 未经授权的命令由 网站信托

后来,在预防下:

验证请求的标头是否包含X-Requested-With(已使用 通过RubyonRails(v2.0之前的版本)和Django(v1.2.5之前的版本),或者 HTTP引用器标头和/或HTTP源标头

所以,实际上,你的csrf保护工作得很好。因为,虽然我不是100%认为问题具体在于缺少推荐人,但我确实认为这是由于没有使用正确的重定向导致的,这会触发csrf违规

解决方案-使用
HttpResponseRedirect
并将信息传递到另一个视图。您可以将其作为GET data传递:

 d = {'ru': ru, 'other': 'variables'}
 url = '/landing/?%' % '&'.join( map(lambda x: '='.join(x), d.items()) )
 return HttpResponseRedirect(url)

您也可以在url中使用正则表达式模式(如果有意义的话),或者在url中有任何敏感内容时使用正则表达式模式。

我相信这是csrf提供的保护的一部分(主要问题是跨站点伪造,有人假装是用户,但来自不同的url)。我不知道如何将此转换为解决方案,但可以尝试使用
render
而不是
render\u to\u response
。它确保所有上下文处理器都能正常工作,因此这可能会有所帮助。这不是重定向!是重定向。
RequestContext(request,{'ru':ru})
包含csrf\u令牌?出于调试目的,您可以将
打印请求.META[“csrf\u COOKIE”]
?此外,如何移动到真正的重定向?这将添加正确的引用。“一组模板变量”-使用真正的重定向不会阻止任何操作,正如@danihp所提到的,将添加正确的引用(这很可能是个问题)是的,它很有效。我还设法传递了模板变量。谢谢!