📅  最后修改于: 2023-12-03 15:12:50.576000             🧑  作者: Mango
在 Django 应用程序中,可能需要用户才能访问某些页面和功能。因此在应用中需要实现用户认证。本篇文章将介绍如何在 Django 应用程序中实现简单的用户登录功能。
在开始实现认证功能之前,我们需要先创建一个 Django 项目,并创建一个 Django 应用程序。
$ django-admin startproject myproject
$ cd myproject
$ python manage.py startapp myapp
我们需要在 myproject
中打开 settings.py
文件并添加 myapp
到 INSTALLED_APPS
中:
INSTALLED_APPS = [
...
'myapp',
]
我们还需要为应用程序创建一个 URLConf,以便处理用户认证相关的 URL。在 myapp
文件夹中创建一个名为 urls.py
的新文件,然后添加以下内容:
from django.urls import path
from . import views
urlpatterns = [
path('login/', views.login_view, name='login'),
path('logout/', views.logout_view, name='logout'),
]
该 URLConf 中定义了两个 URL 模式:login/
和 logout/
。这些 URL 模式都将由 views
模块中的函数来处理。
为了实现用户认证,我们需要实现以下内容:
User
模型User
模型首先我们需要创建一个 user
数据模型,用于存储用户的登录信息。可以使用 Django 的内置 User
模型,该模型包含了常用的用户字段,包括用户名和密码。要使用 Django 的内置 User
模型,需要在 myapp/models.py
中导入 AbstractUser
并继承它。
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
然后运行以下命令来创建 user
表,该表将在数据库中存储用户信息:
$ python manage.py makemigrations myapp
$ python manage.py migrate
创建登录表单,实际上是创建一个 HTML 表单,它包含一个用户名字段和一个密码字段以及一个提交按钮。在 Django 中,登录表单是通过一个继承了 AuthenticationForm
的类来实现的。我们将创建一个 LoginForm
类,用户可以在该类中定制登录表单。
在 myapp/forms.py
文件中,添加以下内容:
from django import forms
from django.contrib.auth.forms import AuthenticationForm
class LoginForm(AuthenticationForm):
username = forms.CharField(
label='用户名',
max_length=30,
widget=forms.TextInput(attrs={'class': 'form-control', 'name': 'username'})
)
password = forms.CharField(
label='密码',
max_length=30,
widget=forms.PasswordInput(attrs={'class': 'form-control', 'name': 'password'})
)
为了能够认证用户,我们需要处理表单并使用 Django 提供的 authenticate
方法来验证用户的凭据是否正确。如果表单验证成功,则在 request.session
中设置 user_id
以标识该用户已登录。
在 myapp/views.py
文件中添加以下内容:
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponseRedirect
from django.urls import reverse
from .forms import LoginForm
def login_view(request):
if request.method == 'POST':
form = LoginForm(request, request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return HttpResponseRedirect(reverse('index'))
else:
form = LoginForm(request)
return render(request, 'login.html', {'form': form})
def logout_view(request):
logout(request)
return HttpResponseRedirect(reverse('login'))
我们完成了认证,接下来在应用程序中使用 Django 提供的 @login_required
装饰器来限制需要登录才能访问的页面。
在 myapp
中创建一个新的 views.py
文件,并在该文件中添加以下内容:
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
@login_required
def index(request):
return HttpResponse("欢迎登录!")
最后,在 myproject
中的 settings.py
文件中设置登录 URL 和重定向 URL:
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/index/'
这篇文章介绍了如何在 Django 应用程序中实现简单的用户登录功能,包括创建 User
模型、创建登录表单、处理表单并认证用户以及在应用程序中使用用户认证。在实现 Django 应用程序时,使用这些知识可以帮助您为您的应用程序提供更好的用户体验。