2015-01-09 4 views
0

Это содержание views.py:Джанго перенаправляет на страницу входа в систему даже после входа в

 

    @login_required 
    def home_page(request): 
     return HttpResponse("hello " + str(request.user)) 

    def login(request): 
     return render(request, 'login.html') 

    def verify(request): 
     u = request.POST['username'] 
     p = request.POST['password'] 
     user = authenticate(username=u, password=p) 
     if user is not None: 
      if user.is_active: 
       login(request) 
       print("logged in") 
       return HttpResponseRedirect('/') 
     else: 
      return HttpResponseRedirect('/accounts/login/') 

При переходе к «/» Я перенаправлены на «/ счета/Логин», которые принимают меня к страница авторизации. После ввода имени пользователя и пароля в «Verify» заявление printdd «зарегистрировалось» на терминал.

Пока все хорошо. Теперь вместо того, чтобы перенаправляться на «/», меня снова перенаправляют на «/ accounts/login», и мне показывают страницу, чтобы снова ввести имя пользователя и пароль. Зачем?

 

    [09/Jan/2015 10:50:14] "GET/HTTP/1.1" 302 0 
    [09/Jan/2015 10:50:14] "GET /accounts/login/?next=/ HTTP/1.1" 200 250 
    logged in 
    [09/Jan/2015 10:50:19] "POST /accounts/verify/ HTTP/1.1" 302 0 
    [09/Jan/2015 10:50:19] "GET/HTTP/1.1" 302 0 
    [09/Jan/2015 10:50:19] "GET /accounts/login/?next=/ HTTP/1.1" 200 250 

ответ

2

Вы забыли второй аргумент login, который является объектом пользователя. Это приводит к сбою входа в систему, поэтому, когда вы перенаправляетесь на первую страницу (у которой есть @login_required), вас отправляют обратно в форму для входа в систему, чтобы «снова войти в систему». Посмотрите на the docs.

Редактировать: вы оба импортируете django.contrib.auth.login и имеете функцию в вашем скрипте под названием login - эти имена сталкиваются, и ваша локально определенная функция «берет верх». Вы должны переименовать локальную функцию (я называю это login_view ниже), или импортировать функцию входа в систему в качестве квалифицированного/другое имя (Вы можете, например, сделать from django.contrib.auth import authenticate, login as login_user)

from django.contrib.auth import authenticate, login 

@login_required 
def home_page(request): 
    return HttpResponse("hello " + str(request.user)) 

def login_view(request): 
    return render(request, 'login.html') 

def verify(request): 
    u = request.POST['username'] 
    p = request.POST['password'] 
    user = authenticate(username=u, password=p) 
    if user is not None: 
     if user.is_active: 
      # You need to call `login` with `request` AND `user` 
      login(request, user) 
      print("logged in") 
      return HttpResponseRedirect('/') 
    else: 
     return HttpResponseRedirect('/accounts/login/') 
+0

Я получаю следующее сообщение об ошибке: логин() принимает 1 позиционный аргумент, но 2 дано – rohithpr

+0

http://stackoverflow.com/questions/1134476/django-login-takes-exactly-1-argument-2-given-error Решено, что ошибка! – rohithpr

+0

@ praroh1 Да, ты прав. Я пропустил это. Обновлен мой ответ! – vicvicvic

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