Python + Django4 para crear un blog personal (14): implementar funciones de inicio y cierre de sesión de usuario

Al comienzo de este artículo, implementaremos el módulo de gestión de usuarios.

Primero, implementemos el inicio y cierre de sesión del usuario.

Crear aplicación

Usuarios y artículos pertenecen a diferentes módulos funcionales, para facilitar la gestión creamos uno nuevo userprofilellamadoApp

Ejecute el comando startapp para crear una nueva aplicación:

python manage.py startapp userprofile

Puedes ver que hemos generado una nueva App

Agregar aplicación a la lista de aplicaciones:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'article',
    # 新增'userprofile'代码,激活app
    'userprofile',
]

Escribir formulario de inicio de sesión

Cuando los usuarios inician sesión, deben completar datos del formulario, como la contraseña de la cuenta, por lo que se utiliza la clase de formulario Formulario.

Cuando creamos el artículo anterior, introdujimos los formularios de Django. En ese momento usamos la forms.ModelFormclase heredada. Esta vez usamos otra clase: forms.Form.

userprofileCree un archivo de clase de formulario en el directorio y forms.pyescriba el siguiente código:

# 引入表单类
from django import forms

# 登录表单,继承了 forms.Form 类
class UserLoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField()

forms.ModelForm, esta clase principal es adecuada para funciones que necesitan interactuar directamente con la base de datos.

Si bien forms.Formcada campo debe configurarse manualmente, es adecuado para funciones que no interactúan directamente con la base de datos. El inicio de sesión del usuario no requiere ningún cambio en la base de datos, por lo que se forms.Formpuede heredar directamente.

Vista de escritura

En una aplicación normal, necesitamos escribir un modelo antes de escribir una vista, pero bajo el marco de Django, Django crea automáticamente un modelo de usuario para nosotros cuando creamos el proyecto.

De hecho, Adminya lo hemos usado al usar módulos.

Cuando implementamos funciones de usuario, podemos usar directamente los modelos integrados de Django User. Para los modelos integrados User, Django también integra algunas funciones de vista comunes, como iniciar sesión, cerrar sesión, administrar sesiones, etc., lo que puede mejorar enormemente nuestro desarrollo web. eficiencia. .

Vista de inicio de sesión

userprofile/views.pyEscribe la función de vista en :

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.http import HttpResponse
from .forms import UserLoginForm

# Create your views here.

def user_login(request):
    if request.method == 'POST':
        user_login_form = UserLoginForm(data=request.POST)
        if user_login_form.is_valid():
            # .cleaned_data 清洗出合法数据
            data = user_login_form.cleaned_data
            # 检验账号、密码是否正确匹配数据库中的某个用户
            # 如果均匹配则返回这个 user 对象
            user = authenticate(username=data['username'], password=data['password'])
            if user:
                # 将用户数据保存在 session 中,即实现了登录动作
                login(request, user)
                return redirect("list")
            else:
                return HttpResponse("账号或密码输入有误。请重新输入~")
        else:
            return HttpResponse("账号或密码输入不合法")
    elif request.method == 'GET':
        user_login_form = UserLoginForm()
        context = { 'form': user_login_form }
        return render(request, 'userprofile/login.html', context)
    else:
        return HttpResponse("请使用GET或POST请求数据")

Aquí presentamos authenticate, loginel módulo que viene con Django para implementar funciones de autenticación e inicio de sesión de usuario.

  • De manera similar a la clase de formulario para publicar artículos, Formla tarea principal del objeto es validar los datos. Llame al método is_valid() para verificar y devolver un valor booleano que indica si los datos especificados son válidos.
  • FormNo sólo es responsable de validar los datos, sino que también los "limpia": estandarizándolos en un formato consistente. Esta característica hace posible ingresar datos para un campo específico de varias maneras y producir siempre un resultado consistente. Una vez que Formse ha creado una instancia con los datos y se ha validado, cleaned_datase puede acceder a los datos limpios a través de propiedades.
  • authenticate()El método verifica si el nombre de usuario y la contraseña coinciden y, de ser así, devuelve estos datos de usuario.
  • login()Método para implementar el inicio de sesión del usuario y guardar los datos del usuario en formato session.

La sesión se denomina "control de sesión" en las aplicaciones de red y almacena los atributos y la información de configuración necesarios para una sesión de usuario específica.

Cuando el usuario salta entre páginas web, las variables almacenadas en el objeto Sesión no se perderán, sino que persistirán durante toda la sesión del usuario.

El uso más común de Session es almacenar datos de inicio de sesión del usuario.

Vista de cierre de sesión

Cerrar sesión en la vista es aún más simple: el logoutmódulo importado llama directamente a la función incorporada logout()y todas las acciones relacionadas con la web se completan en segundo plano de Django.

# 用户退出
def user_logout(request):
    logout(request)
    return redirect("list")

Escribir plantilla

Aquí cambiamos dos lugares:

1. Agregue una entrada a la barra de navegación:

Vuelva a escribirlo tempalates/header.htmly agregue botones de inicio de sesión y cierre de sesión:

	...
				<li class="nav-item">
                    <a class="nav-link" href="{% url 'create' %}">创作</a>
                </li>
#增加以下内容
                <!-- Django的 if 模板语句 -->
                {% if user.is_authenticated %}
                 <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">{
   
   { user.username }}</a>
                    <ul class="dropdown-menu">
                        <a class="dropdown-item" href="{% url 'logout' %}">退出登录</a>
                    </ul>
                 </li>
                    <!-- 如果用户未登录,则显示 “登录” -->
                {% else %}
                 <li class="nav-item">
                    <a class="nav-link" href="{% url 'login' %}">登录</a>
                 </li>
                <!-- if 语句在这里结束 -->
                {% endif %}

La nueva sintaxis de plantilla se utiliza aquí: {% if ... %}para determinar si el usuario ha iniciado sesión:

  • Si el usuario ha iniciado sesión, se muestra un cuadro desplegable con el nombre del usuario. El cuadro desplegable tiene una subopción para cerrar sesión, como en un sitio de redes sociales normal.
  • Si el usuario no ha iniciado sesión, se muestra la palabra "Iniciar sesión" para recordarle que haga clic para iniciar sesión.

is_authenticatedEs models.Useruna propiedad de la clase que se utiliza para determinar si el usuario ha sido autenticado.

2. Crea una nueva página de inicio de sesión

Cree una nueva carpeta templates/userprofiley luego agregue login.html:

{% extends "base.html" %} {% load static %}
{% block title %} 登录 {% endblock title %}
{% block content %}
<div class="container">
    <div class="row">
        <div class="col-12">
            <br>
            <form method="post" action=".">
                {% csrf_token %}
                <!-- 账号 -->
                <div class="form-group">
                    <label for="username">账号</label>
                    <input type="text" class="form-control" id="username" name="username">
                </div>
                <!-- 密码 -->
                <div class="form-group">
                    <label for="password">密码</label>
                    <input type="password" class="form-control" id="password" name="password">
                </div>
                <!-- 提交按钮 -->
                <button type="submit" class="btn btn-primary">提交</button>
            </form>
        </div>
    </div>
</div>
{% endblock content %}

Reescribir URL

Introduzca la vista en el archivo url.py userprofiley agregue la urldirección de enrutamiento administrada por el usuario.

from django.contrib import admin
from django.urls import path, re_path
# 引入app视图
import article.views
import userprofile.views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', article.views.hello),
    re_path(r'^$', article.views.article_list),
    path('list/', article.views.article_list, name='list'),  # 展示文章
    path('detail/<int:id>/', article.views.article_detail, name='detail'),  # 文章详情
    path('create/', article.views.article_create, name='create'),  # 写文章
    path('delete/<int:id>/', article.views.article_delete, name='delete'),# 删除文章
    path('update/<int:id>/', article.views.article_update, name='update'),    # 更新文章
    # 增加用户管理
    path('login/', userprofile.views.user_login, name='login' ),
    path('logout/', userprofile.views.user_logout, name='logout' ),
]

Como userprofileesto appno ha cambiado model, no necesitamos migrar los datos.

Ejecute el servidor y abra la URL del blog. Si hemos iniciado sesión como superusuario antes admin, la información de superusuario que hemos iniciado sesión se mostrará directamente:

Haga clic en Cerrar sesión en el menú desplegable del usuario y aparecerá un botón de inicio de sesión en la URL:

Haga clic en el botón de inicio de sesión

Después de ingresar el nombre de usuario y la contraseña, haga clic en el botón de inicio de sesión, el inicio de sesión se realizó correctamente y se muestra nuestro nombre de usuario:

En este punto, hemos implementado completamente las funciones de inicio y cierre de sesión de usuario.

Conclusión

En este artículo, utilizamos el modelo de usuario integrado de Django y llamamos a funciones integradas como loginy para implementar las funciones de inicio y cierre de sesión de un sitio web.logout

La sintaxis de las plantillas de Django utilizadas en las plantillas {% if ... %}permite mostrar contenido diferente según diferentes condiciones.

En el próximo artículo, continuaremos implementando funciones relacionadas con la administración de usuarios: registro de usuarios.

Supongo que te gusta

Origin blog.csdn.net/agelee/article/details/126937900
Recomendado
Clasificación