Django自定义客户端登录页面未进行身份验证



Django的新手,来自Laravel,在那里设置登录和身份验证要容易得多。也就是说,我很难让一个简单的登录页面正常工作,我花了几个晚上的时间使用SO、Django文档和各种教程来完成它。Django文档似乎没有很好地组织起来,对于那些只想了解登录页面基础知识的人来说,这有点让人不知所措,而且我遇到的大多数SO答案都是旧的。

我用过这两个教程,都没有得到我想要的东西:

Django 添加用户身份验证的正确方法

如何使用Django的内置登录系统

使用Python 3.5.2、Django 1.10和PostgreSQL 9.6。在我的设置中,localhost:8000是登录页面。用户需要登录才能查看任何内容。我也有应用程序/home/results等,但现在我只使用/home。如果他们试图转到localhost:8000/home,他们将被路由到登录,这样做目前会将他们带到http://localhost:8000/?next=/home/。所以这么多都很有效。

当我输入凭据时,它会一直将我发送到登录屏幕。转到localhost:8000/home也会做同样的事情。似乎不是在验证。数据库凭据正确,用户凭据正确,并且可以在python manage.py shell中与数据库通信。

这是我的简化目录结构:

~/portal-client
project_dir
apps
account
templates
account
login.html
forms.py
urls.py
views.py
home
templates
home
home.html
urls.py
views.py
results
settings.py
urls.py
scripts
manage.py
static
templates
base.html
footer.html
title.html

project_dir/settings.py

# INSTALLED_APPS, TEMPLATES, STATIC, DATABASES all correct so just this line added
LOGIN_REDIRECT_URL = 'home'

project_dir/urls.py

from django.conf.urls import include, url
from django.contrib import admin
from django.contrib.auth import views as auth_views
from account.forms import LoginForm
urlpatterns = [
url(r'', include('account.urls')),
url(r'^admin/', admin.site.urls),
url(r'^documents/$', include('documents.urls')),
url(r'^help/$', include('help.urls')),
url(r'^home/$', include('home.urls')),
url(r'^results/$', include('results.urls')),
url(r'^logout/$', auth_views.logout, {'next_page': '/'}, name='logout'),
url(r'^login/$', auth_views.login, {'template_name': 'account/login.html', 'authentication_form': LoginForm}, name='login'),
]

主页/views.py

from django.shortcuts import render
from django.contrib.auth.decorators import login_required
# Create your view here.
# The following prohibits access to the website unless authenticated
@login_required(login_url="/")
def home(request):
return render(request, 'home/home.html')

account/urls.py-编辑

from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.user_login, name='user_login'),
]

account/forms.py-编辑

from django.contrib.auth.forms import AuthenticationForm
from django import forms
# If you don't do this you cannot use Bootstrap CSS
class LoginForm(AuthenticationForm:
username = forms.CharField(max_length=50)
password = forms.CharField(widget=forms.PasswordInput)
def clean_username(self):
username = self.cleaned_data.get("username")
def clean_password(self):
password= self.cleaned_data.get("password")

account/views.py-编辑

from django.shortcuts import render
from django.contrib.auth import views
from .forms import LoginForm
# Create your view here.
def user_login(request):
form = LoginForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return httpResponseRedirect('/home')
else:
return httpResponseRedirect('/')
context = {
"form" : form
}
return render(request, "account/login.html", context)   

account/login.html

<form class="form-horizontal" role="form" method="POST" action="{% url 'home' %}">
{% csrf_token %}
<div class="form-group">
<label for="email" class="col-md-4 control-label">Username</label>
<div class="col-md-6">
{{ form.username }}
</div>
</div>
<div class="form-group">
<label for="password" class="col-md-4 control-label">Password</label>

<div class="col-md-6">
{{ form.password }}
</div>
</div>

<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<div class="checkbox">
<label>
<input type="checkbox" name="remember"> Remember Me
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-8 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Login
</button>
<a class="btn btn-link" href="url('/password/reset')">
Forgot Your Password?
</a>
</div>
</div>
</form>

我想这就是一切!我很感激你提前提供的帮助!我很想继续把这些应用程序放在一起,并通过身份验证。

编辑:

不过,有一件事我还没有读过,那就是我是否需要对account/models.py文件做任何事情。所有客户数据都在默认的auth_user表中。

此外,想知道像django-allauth这样的东西是否是一个好的解决方案。

Django附带了身份验证视图,如果可能的话,您应该使用这些视图,而不是编写自己的视图。

您已经在URL模式中包含了内置的登录视图。

url(r'^login/$', auth_views.login, {'template_name': 'account/login.html'}, name='login'),

因此,你不需要user_login视图,所以我会删除它。我已经删除了你的自定义身份验证表单,因为它不是必需的。默认身份验证表单已包含用户名和密码字段。您破坏了clean_方法,因为您没有返回值。

接下来,在模板中修复表单的action。当前您正在将表单数据提交到home视图。您应该将其发送到login视图。

<form class="form-horizontal" role="form" method="POST" action="{% url 'login' %}">

最后,我将LOGIN_URL = 'login'添加到您的设置中,然后您可以将使用login_required的代码简化为以下代码:

@login_required
def home(request):
...

最新更新