Django身份验证初试

使用Django身份验证框架在项目中构建一个身份验证系统。

Django有一个内置的认证框架,可以处理用户认证、会话、权限和用户组。

认证系统包括登录、注销、修改密码、重置密码等常见用户操作的视图。

当你使用startproject命令创建一个新的Django项目时,这个认证框架会包含在项目的默认设置中。它由django.contrib.auth应用程序和在项目的middleware设置中找到的以下两个中间件类组成:

  • AuthenticationMiddleware:使用会话将用户与请求关联起来
  • SessionMiddleware:处理跨请求的当前会话

认证框架还包括以下模型:

  • User:包含基本字段的用户模型;该模型的主要字段是username、password、email、first_name、last_name和is_active
  • Group:对用户进行分类的组模型
  • Permission:用户或组执行某些操作的标志

该框架还包括我们稍后将使用的默认身份验证视图和表单。

目录

构建登录表单类

构建登录视图方法

构建登录URL

构建登录模版


在Django项目中创建一个应用
django-admin startapp account

在setting.py文件INSTALLED_APPS中添加应用

python 复制代码
INSTALLED_APPS = [

    'account.apps.AccountConfig',
    # ...

]

📌通过将account应用放在INSTALLED_APPS设置的首位,可以确保默认情况下使用这个认证模板,而不是其他应用中包含的任何其他认证模板。Django通过INSTALLED_APPS设置中应用出现的顺序来查找模板

将数据库与INSTALLED_APPS设置中包含的默认应用程序的模型同步
python manage.py migrate

构建登录表单类

创建一个新的forms.py文件

python 复制代码
from django import forms

class LoginForm(form.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

构建登录视图方法

编辑views.py文件

python 复制代码
from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate,login
from .forms import LoginForm

def user_login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            user = authenticate(request,
                                username=cd['username'],
                                password=cd['password'])
            if user is not None:
                if user.is_active:
                    login(request,user)
                    return HttpResponse('Aauthenticated successfully')
                else:
                    return HttpResponse('Disabled account')
            else:
                return HttpResponse('Invalid login')
    else:

        form = LoginForm()
    return render(request,'account/login.html',{'form':form})

当使用GET请求调用user_login视图时,使用form = LoginForm()实例化一个新的登录表单,以便在模板中显示它。当用户通过POST提交表单时,我们执行以下操作:

  • 使用form = LoginForm(request.POST)将提交的数据实例化表单。

  • 使用form.is_valid()检查表单是否有效。

  • 如果无效,将在模板中显示表单错误(例如,如果用户没有填写其中一个字段)。如果提交的数据是有效的,我们使用authenticate()方法根据数据库对用户进行身份验证。此方法接受请求对象、用户名和密码参数,如果用户已成功认证,则返回User对象,否则返回None。如果用户没有经过身份验证,返回一个原始的HttpResponse,显示Invalid login消息。

  • 如果用户身份验证成功,检查用户是否活动,访问其is_active属性。这是Django用户模型的一个属性。如果用户不是活动的,我们返回一个HttpResponse,其中显示Disabled帐户消息。

  • 如果用户是活跃的,将用户登录到网站。通过调用login()方法在会话中设置用户,并返回Authenticated成功消息。

📌authenticate和login之间的区别:authenticate()检查用户凭据,如果正确则返回user对象;Login()设置当前会话中的用户。

构建登录URL

创建urls.py(应用目录)

python 复制代码
from django.urls import path,include
from . import views

urlpatterns = [

    path("login/",views.user_login,name='login'),
  
]

编辑urls.py(项目目录)

python 复制代码
from django.contrib import admin
from django.urls import path,include


urlpatterns = [

    path("admin/", admin.site.urls),
    path("account/",include('account.urls'))

]

现在可以通过URL访问登录视图。可以为这个视图创建一个模板了。

由于没有此项目的任何模板,因此可以从创建可由登录模板扩展的基本模板开始。在account目录下创建以下文件和目录:

templates/account/login.html

templates/base.html

构建登录模版

编辑base.html

python 复制代码
{% load staticfiles %}

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="{% static 'css/base.css' %}">
</head>

<body>

    <div id="header">
        <span class="logo">Bookmarks</span>
    </div>

    <div id="content">
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>

基模板定义了一个标题块和一个内容块,可以用从它扩展的模板填充内容。

编辑login.html

python 复制代码
{% extends "base.html" %}
{% block title %}Log-in{% endblock %}
{% block content %}

    <h1>Log-in</h1>
    <p>Please, use the following form to log-in:</p>
    <form action="." method="post">
        {{ form.as_p }}
        {% csrf_token %}
        <p><input type="submit" value="Log in"></p>
    </form>

{% endblock %}

该模板包括在视图中实例化的表单。由于表单将通过POST提交,因此包含{% csrf_token %}模板标签来进行CSRF保护。

相关推荐
Kai HVZ24 分钟前
python爬虫----爬取视频实战
爬虫·python·音视频
古希腊掌管学习的神26 分钟前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
m0_7482448329 分钟前
StarRocks 排查单副本表
大数据·数据库·python
B站计算机毕业设计超人36 分钟前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化
路人甲ing..39 分钟前
jupyter切换内核方法配置问题总结
chrome·python·jupyter
游客5201 小时前
opencv中的常用的100个API
图像处理·人工智能·python·opencv·计算机视觉
每天都要学信号1 小时前
Python(第一天)
开发语言·python
凡人的AI工具箱1 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
咸鱼桨2 小时前
《庐山派从入门到...》PWM板载蜂鸣器
人工智能·windows·python·k230·庐山派
北京_宏哥2 小时前
python接口自动化(四十)- logger 日志 - 下(超详解)
python·前端框架·自动化运维