Django auth登录将空请求传递给login.html

时间:2014-02-03 13:54:07

标签: authentication login request django-1.6

在从Django 1.3升级到1.6时,我注意到我无法再访问'registration / login.html'中的请求。

因为我在每个页面上都有一个购物车(包括登录页面),所以现在提出“/ errors / login / - 'str'object中的AttributeError没有属性'session'”,因为购物车功能不能通过request.session获取购物车项目。

供参考,这是内置的auth.login函数:

@sensitive_post_parameters()
@csrf_protect
@never_cache
def login(request, template_name='registration/login.html',
          redirect_field_name=REDIRECT_FIELD_NAME,
          authentication_form=AuthenticationForm,
          current_app=None, extra_context=None):
    """
    Displays the login form and handles the login action.
    """
    redirect_to = request.REQUEST.get(redirect_field_name, '')

    if request.method == "POST":
        form = authentication_form(request, data=request.POST)
        if form.is_valid():

            # Ensure the user-originating redirection url is safe.
            if not is_safe_url(url=redirect_to, host=request.get_host()):
                redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)

            # Okay, security check complete. Log the user in.
            auth_login(request, form.get_user())

            return HttpResponseRedirect(redirect_to)
    else:
        form = authentication_form(request)

    current_site = get_current_site(request)

    context = {
        'form': form,
        redirect_field_name: redirect_to,
        'site': current_site,
        'site_name': current_site.name,
    }
    if extra_context is not None:
        context.update(extra_context)
    return TemplateResponse(request, template_name, context,
                            current_app=current_app)

此函数似乎通过TemplateResponse返回请求对象,但我无法在'registration / login.html'中访问它。如果我删除购物车,登录正常工作。

作为一种解决方法,我可以从登录页面中删除购物车,但我想知道为什么会发生这种变化(可能是安全漏洞?)。似乎在调用auth.login函数和login.html页面之间的某个地方,请求就丢失了。有谁知道请求发生了什么?

1 个答案:

答案 0 :(得分:0)

好的,我想我已经解决了。

出于某种原因,settings.py中的TEMPLATE_CONTEXT_PROCESSORS为空。根据{{​​3}},Django 1.6的默认TEMPLATE_CONTEXT_PROCESSORS应为:

("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages")

添加以下行:

'django.core.context_processors.request',

到TEMPLATE_CONTEXT_PROCESSORS设置使一切按预期工作。现在我想知道当TEMPLATE_CONTEXT_PROCESSORS为空时,为什么网站的其余部分正常工作! (如果没有设置,我的其他页面如何能够访问请求?)