Вход в систему Django / выход из системы

#python #django

#python #django

Вопрос:

Я пытаюсь создать страницу входа и выхода из системы с помощью django. Проблема, с которой я сталкиваюсь, заключается в том, что когда я отправляю форму, она не указывает URL, который я указал. Когда я нажимаю кнопку входа, я хочу, чтобы она переходила к http://127.0.0.1:8000/home / но вместо этого он переходит к http://127.0.0.1:8000/?next=/home /.

Ниже приведен мой код входа в систему в моем view.py:

 def login(request):
    def errorHandler(error):
    return render_to_response('login.html', {'error' : error})
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username = username, password = password)
        if user is not None:
            if user.is_active:
                authLogin(request, user)
                fullName = user.get_full_name
                return render_to_response('logged_in.html', {'full_name': fullName})
            else:
                error = 'Account disabled.'
        return errorHandler(error)
        else:
            error = 'Invalid details entered.'
        return errorHandler(error)

    return render_to_response('login.html')

@login_required
def logout(request):
    authLogout(request)
    return render_to_response('logged_in.html')
  

мой login.html:

 {% extends "base.html" %}

{% block content %}

  {% if error %}
    <p><b><font color="red">Error: </font></b>{{ error }}</p>
  {% endif %}

  <form action="/home/" method="post">
    <label for="username">User name:</label>
    <input type="text" name="username" value="" id="username">
    <label for="password">Password:</label>
    <input type="password" name="password" value="" id="password">

    <input type="submit" value="Login" />
    <input type="hidden" name="next" value="{{ next|escape }}" />
  </form>

{% endblock %}
  

мой logged_in.html:

 {% extends "base.html" %}

{% block name %}{{ full_name }} is {% endblock %}

{% block content %}
    <p><a href='/'>Logout</a></p>
{% endblock %}
  

url:

 (r'^$', 'myapp.views.login'),
(r'^home/$', 'myapp.views.logout'), 
  

Пожалуйста, помогите

Ответ №1:

Проблема в том, что вы фактически не регистрируете пользователя, форма отправляет не прошедшего проверку подлинности пользователя /home/ , который не может обработать, потому что для этого требуется логин. 🙂 Таким образом, он перенаправляет пользователя на просмотр входа в систему, сохраняя назначение в next параметре.

Решение: <form action="" method="post">

Комментарии:

1. Это работает. Однако, поскольку он по-прежнему 127.0.0.1: 8000 (не изменяет URL), он фактически не использует представление выхода из системы. Он просто переходит на эту страницу. (для просмотра выхода установлено значение /home/)

2. LOGIN_REDIRECT_URL = '/home/' в settings.py

3. Я пробовал это раньше, но URL по-прежнему остается как 127.0.0.1:8000. Должен ли я указывать URL-адрес перенаправления в моем представлении? или это может иметь какое-то отношение к render_to_response? Я пробовал HttpResponseRedirect, но мне нужно, чтобы содержимое передавалось в шаблон, как вы можете видеть в моем коде в настоящее время.

4. Да, я был неправ, LOGIN_REDIRECT_URL не будет иметь никакого эффекта, поскольку вы не используете встроенное login представление. Итак, перенаправление — это ваша задача. Если вы хотите сохранить контекст между перенаправлениями, вы можете использовать параметры GET, сеансы, файлы cookie и так далее. By зачем вам это нужно? После входа в систему объект пользователя будет доступен из любого представления ( request.user ). И, кстати, гораздо лучше не изобретать велосипед и использовать встроенные представления ( django.contrib.auth.views )

5. Да, я думаю, почему я пытаюсь реализовать свой собственный вид входа / выхода, потому что я понятия не имею, как я буду отображать полное имя пользователя при входе в систему (т. Е. Добро пожаловать, Джон Смит) Я пытался сделать это, как вы сказали: (r ‘^home/$’, ‘django.contrib.auth.views.logout’, {‘имя_шаблона’: ‘logged_in.html ‘}) но я понятия не имею, где запрашивать информацию о пользователе. Будет ли это каким-то образом сделано в представлениях? Извините за это, как вы можете сказать, я довольно плохо разбираюсь в django;(

Ответ №2:

возможно, вам следует попытаться удалить скрытый ввод с помощью name =»next»http://docs.djangoproject.com/en/1.2/topics/auth/#django.contrib.auth.views.login