未定义全局名称“请求”

时间:2013-06-23 10:30:54

标签: python django session

使用示例" views.py而不使用functions.py" 时,它正在运行正常并正在检查会话,所以它返回用户名。

但是,当使用第二个示例 with functions.py 时,会显示以下错误

  

/ login /

中的NameError      

全球名称'请求'未定义

views.py没有functions.py

def main(request):
    c = {}
    c.update(csrf(request))

    if request.session.get('username'):
        susername = request.session['username']
    else:
        susername = ""

    return render_to_response("login/login.html",{'username': susername},context_instance=RequestContext(request))

views.py with functions.py

def main(request):
    c = {}
    c.update(csrf(request))

    susername = loggedin()


    return render_to_response("login/login.html",{'username': susername},context_instance=RequestContext(request))

functions.py

from django.template import RequestContext

def loggedin():
    if request.session.get('username'):
        susername = request.session['username']
    else:
        susername = ""

    return susername

为什么第二个不起作用,我该如何解决?

由于

2 个答案:

答案 0 :(得分:4)

您所编写的是模板上下文处理器,您应该这样写:

def loggedin(request):
    return {'username': request.session.get('username','')}

将其保存在文件中,并在TEMPLATE_CONTEXT_PROCESSORS行之后的settings.py中将其添加到'django.core.context_processors.request',

如果您将文件命名为someapp/processors.py,则会将'somapp.processors.loggedin',添加到元组。

然后,只要您返回RequestContext的实例,您的模板中就会有{{ username }}

答案 1 :(得分:2)

想一想。请求不作为参数传递,因此在loggedin()函数的范围内未知。

您可以像

一样传递请求
susername = loggedin(request)

或者,在这种情况下,只需传递您需要检查的内容。

susername = loggedin(request.session)

将功能更改为

def loggedin(session):
    return session['username'] if session.get('username') else ''