2013-06-23 4 views
2

При использовании примера «views.py без functions.py», он работает мелкий и сессия проверяется в порядке, поэтому он возвращает имя пользователя.глобальное имя «запрос» не определен

Но, при использовании второго примера, с functions.py, показывает мне следующую ошибку

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 с 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 

Почему второй не работает и как я могу решить эту проблему?

Thanks

ответ

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 }} в ваших шаблонах.

+0

+1 Хотя это хороший подход, я думаю, что OP пытается провести простой учебник, в котором он просто забыл отправить объект запроса в качестве параметра. – karthikr

+0

+1 Вау, это лучше, чем то, что я искал.На самом деле, я задавался вопросом, возможно ли это в Python. – zurfyx

2

Подумайте об этом. Запрос не передается в качестве аргумента, поэтому он неизвестен в области функции loggedin().

Вы можете просто передать запрос как

susername = loggedin(request) 

Или, в данном случае, просто передать то, что вам нужно проверить.

susername = loggedin(request.session) 

И изменить функцию

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

Ahh, thanks (filler) – zurfyx

+0

Исправлено. Спасибо @Alasdair – Achrome

+0

'return session.get ('username', '')' будет лучше, но по крайней мере код будет работать сейчас. – Alasdair