2013-03-09 3 views
0

Пользователи, которые не вошли в систему, перенаправлены отделом @login_required() на номер LOGIN_URL, указанный в settings.py. Все идет нормально. Но я не хочу этого. Вместо того, чтобы перенаправлять их, я хочу показать сообщение об ошибке тем, кто не вошел в систему.@login_required() без перенаправления выведенных из системы пользователей

Я думал, что это может сработать, но я получаю TypeError: ios_login_required() takes exactly 1 argument (0 given), который я не понимаю. Это декоратор, какой аргумент нужен?

def ios_login_required(f): 
    def wrapper(request, *args, **kwargs): 
     if not request.user.is_authenticated: 
      return HttpResponse("You need to be logged in.") 
     else: 
      return f(request, *args, **kwargs) 
    return wrapper 

Вид с декоратор может выглядеть следующим образом:

@ios_login_required() 
def amiloggedinornot(request): 
    return HttpResponse("Congrats, you are logged in!") 

Любые идеи, где я пошло не так?

ответ

1
@ios_login_required() 
def amiloggedinornot(request): 
    ... 

# equals to 
def amiloggedinornot(request): 
    ... 
amiloggedinornot = ios_login_required()(amiloggedinornot) 

Вы могли видеть, что ios_login_required вызывается без какого-либо параметра в то время как он нужен параметр f.

Таким образом, попробовать что-то вроде (без () после @ios_login_required):

@ios_login_required 
def amiloggedinornot(request): 
    ... 

# which equals to 
def amiloggedinornot(request): 
    ... 
amiloggedinornot = ios_login_required(amiloggedinornot) 

Вы можете прочитать больше о Python декоратора here и here

Кроме того, user.is_authenticated является метод, вам нужно вызвать его, чтобы получить boolean result. not user.is_authenticated всегда будет False.

+0

Когда я опускаю круглые скобки, возвращаемое значение всегда '' 'Congrats, вы вошли в систему! "' ' – joschaf

+0

@Jo. Затем устанавливается TypeError. «User.is_authenticated» - это метод, он должен быть вызван: 'if not request.user.is_authenticated():'. – okm

+0

Правильно, я забыл добавить круглые скобки после '' is_authenticated''. Вместе с опущением круглых скобок после '' @ ios_login_required'' работает, как должно, спасибо! Но мне любопытно, почему мне нужно опустить их, когда я называю этот декоратор? Все мои другие декораторы имеют их. Вы знаете? – joschaf

Смежные вопросы