简体   繁体   English

Django为什么我不能验证用户身份?

[英]Django why can't I authenticate a user?

I'm trying to create a user authentification form using Django +1.8 but I encountered a problem, when I press the form submit button, nothing happens, the page is just reloading instead of loging in, why? 我正在尝试使用Django +1.8创建用户身份验证表单,但是遇到一个问题,当我按下表单提交按钮时,什么都没发生,页面只是重新加载而不是登录,为什么?

Here is the code: 这是代码:

views.py views.py

from django.shortcuts import render
from django.contrib.auth import authenticate
from django.contrib.auth import login as auth_login
from django.contrib.auth import logout as auth_logout

# Create your views here.
def user(request):
    context = {}
    return render(request, 'user.html', context)

def login(request):
    context = {}
    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 not None:
                auth_login(request, user)
            else:
                context['error'] = 'Non active user'
        else:
            context['error'] = 'Mauvais nom d\'utilisateur ou mot de passe'
    else:
        context['error'] = ''
    return render(request, 'user.html', context)

def logout(request):
    context = {}
    if request.method == "POST":
        auth_logout(request)
    else:
        context['error'] = 'une erreur s\'est produite.'
    return render(request, 'user.html', context)

urls.py urls.py

    from django.conf.urls import url
    from utilisateur import views

    urlpatterns = [
        url(r'^$', views.user, name="user"),
        url(r'^login$', views.login, name='login'),
        url(r'^logout$', views.logout, name='logout'),
    ]

user.html user.html

{% block content %}
{% if user.authenticated %}
<p>{{ user.username }}</p>
<a href="logout?">Logout</a>
{% else %}
<form method="post" action="login">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="password" name="password"></p>
    <input value="Se connecter" type="submit">
</form>
{% endif %}
{% endblock %}

I also thought that the middlewares could be useful in order to solve this issue. 我还认为中间件对于解决此问题可能很有用。

MIDDLEWARE_CLASSES = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

'context_processors': [
     'django.template.context_processors.debug',
     'django.template.context_processors.request',
     'django.contrib.auth.context_processors.auth',
     'django.contrib.messages.context_processors.messages',
],

I think the problem comes from context_instance=RequestContext(request) , how can I solve this ? 我认为问题来自context_instance=RequestContext(request) ,我该如何解决?

The problem is that you just forgot to add a line to redirect the user to another page if the user is valid after authentication. 问题是,如果用户在身份验证后有效,您只是忘记添加一行将用户重定向到另一个页面。 You should replace these lines 您应该替换这些行

`if user is not None:
    if user is not None:
       auth_login(request, user)
    else:
       context['error'] = 'Non active user'
 else:
    context['error'] = 'Mauvais nom d\'utilisateur ou mot de passe'`

with these 用这些

if user is not None:
    auth_login(request, user)
    redirect('login')
 else:
    context['error'] = 'Mauvais nom d\'utilisateur ou mot de passe'

then you go ahead and if the user has been authenticated with your template with this 那么您可以继续进行下去,如果用户已经通过您的模板进行了身份验证

{% if user.is_authenticated %}

or 要么

{% if not user.is_anonymous %}

feel free to let me know if the problem still persists 随时让我知道问题是否仍然存在

Actually authentication is working properly. 实际上,身份验证工作正常。 All you need to make some corrections like, user.authemticated to user.is_authenticated and change the logout function and url on template 您需要做的所有更正,例如user.authemticateduser.is_authenticated并更改注销功能和模板上的url

user.html: user.html:

{% block content %}
{% if user.is_authenticated %}
<p>{{ user.username }}</p>

<a href="/logout">Logout</a>
{% else %}
<form method="post" action="login">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="password" name="password"></p>
    <input value="Se connecter" type="submit">
</form>
{% endif %}
{% endblock %}

views.py views.py

from django.shortcuts import render
from django.contrib.auth import authenticate
from django.contrib.auth import login as auth_login
from django.contrib.auth import logout as auth_logout

# Create your views here.
def user(request):
    context = {}
    return render(request, 'user.html', context)

def login(request):
    context = {}
    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:
                auth_login(request, user)
            else:
                context['error'] = 'Non active user'
        else:
            context['error'] = 'Mauvais nom d\'utilisateur ou mot de passe'
    else:
        context['error'] = ''
    return render(request, 'user.html', context)

def logout(request):
    context = {}
    auth_logout(request)
    return render(request, 'user.html', context)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM