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 userprofile
llamadoApp
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.ModelForm
clase heredada. Esta vez usamos otra clase: forms.Form
.
userprofile
Cree un archivo de clase de formulario en el directorio y forms.py
escriba 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.Form
cada 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.Form
puede 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, Admin
ya 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.py
Escribe 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, login
el 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,
Form
la 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. Form
No 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 queForm
se ha creado una instancia con los datos y se ha validado,cleaned_data
se 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 formatosession
.
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 logout
mó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.html
y 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_authenticated
Es models.User
una 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/userprofile
y 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 userprofile
y agregue la url
direcció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 userprofile
esto app
no 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 login
y 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.