📜  需要 django 登录 - Python (1)

📅  最后修改于: 2023-12-03 15:12:50.576000             🧑  作者: Mango

需要 Django 登录 - Python

在 Django 应用程序中,可能需要用户才能访问某些页面和功能。因此在应用中需要实现用户认证。本篇文章将介绍如何在 Django 应用程序中实现简单的用户登录功能。

准备工作

在开始实现认证功能之前,我们需要先创建一个 Django 项目,并创建一个 Django 应用程序。

$ django-admin startproject myproject
$ cd myproject
$ python manage.py startapp myapp

我们需要在 myproject 中打开 settings.py 文件并添加 myappINSTALLED_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 应用程序时,使用这些知识可以帮助您为您的应用程序提供更好的用户体验。