Django2.2 学习笔记 (11)_登录_账号+密码+动态图形验证码+登出

目录

1 代码编写顺序

2 urls.py文件

3 views.py文件

4  在用户目录下新建forms.py

5 前端login.html注意事项

refer1: URL构成简析

refer2: 图形验证码(captcha)的安装

refer3: HTTP重定向(Redirect)技术

refer4: HTML 属性


1 代码编写顺序

针对每一个功能写代码的循环顺序:配置url(urls.py)→ 编写apps/user中的view类(apps/user/views.py)→(如果需要)编写新建的py文件 → 修改前端页面

2 urls.py文件

# urls.py
from django.urls import path, re_path, include
from django.views.generic import TemplateView

from apps.users.views import LoginView,LoginoutView  # 自己创建的类

# TemplateView 可以省略view层,直接在url层返回页面
# 官方文档:https://docs.djangoproject.com/zh-hans/2.2/ref/class-based-views/base/#django.views.generic.base.TemplateView
# TemplateView.as_view(template_name="要渲染的模板文件"
# 可以使用get_context_data() 函数传一些额外内容到模板
# 参考文档:https://blog.csdn.net/mikezhou002/article/details/81293293

# context
# 可以利用context传递数据给Template对象。一个context是一系列变量和它们值的集合
# 参考文档:https://www.cnblogs.com/haiyan123/p/9771628.html

# https://docs.djangoproject.com/en/2.2/ref/urls/
urlpatterns = [
    # path路径为空代表访问域名(http://127.0.0.1:8000)时展示的页面
    # path('login/',TemplateView.as_view(template_name="login.html"),name="login"),
    path('',LoginView.as_view(),name="login"),

    # index.html 是登录之后跳转的页面
    # 结尾一定要加/,这样既可以匹配index/,也可以匹配index。如果不加,则只能匹配index
    path('index/',TemplateView.as_view(template_name="index.html"),name="index"),
    
    # 登出url
    path('logout/',LoginoutView.as_view(),name="logout"),

    # 验证码相关
    re_path('^captcha/', include('captcha.urls')),
    # 验证码官方文档:https://django-simple-captcha.readthedocs.io/en/latest/usage.html#installation
]

3 views.py文件

# apps/user/views.py
from django.shortcuts import render
from django.views.generic.base import View
from django.contrib.auth import authenticate,login,logout
from django.http import HttpResponseRedirect
from django.urls import reverse

from apps.users.forms import LoginForm, DynamicLoginForm # 自己创建的类

# Django提供的Form表单可以自动判断各种逻辑,例如:是否为空,长度是否符合, 输入是否正确 等等功能
# https://docs.djangoproject.com/zh-hans/2.2/ref/forms/api/
 

# 登录
class LoginView(View):
    # 定义view类中的get请求
    def get(self, request, *args, **kwargs):
        # is_authenticated 在Django中用来判断是否是登录状态
        # 如果是登录状态,则跳转到index页
        if request.user.is_authenticated:
            # HttpResponseRedirect 重定向
            # reverse 根据urls.py中配置的路径名称(urlpatterns path中的name),找到相应的url
            return HttpResponseRedirect(reverse("index"))
        # 如果不是登录状态,则返回登录页面,同时显示图片验证码
        dynamic_form = DynamicLoginForm()
        # 将动态验证码传递到前端页面
        return render(request,"login.html",{"login_form": dynamic_form})
    
    # 定义view类中的post请求
    def post(self,request,*args, **kwargs):
        # request.POST 用来接收从前端表单中传过来的数据
        login_form = LoginForm(request.POST)
        # is_valid是Django内置的验证login_form的方法,判断是否符合LoginForm中定义的条件
        # 如果验证通过
        if login_form.is_valid():
            # 获取前端填写的username、password字段的内容
            user_name = login_form.cleaned_data["username"]
            password = login_form.cleaned_data["password"]
            # 也可以用如下方法。第二个参数是默认值
            # user_name = request.POST.get("username","")
            # password = request.POST.get("password","")

            # 如果不为空,则通过用户名和密码查询用户是否存在
            user = authenticate(username=user_name,password=password)
            # 查询到用户存在
            if user is not None:
                # Django内置的登录操作,如session等
                login(request,user)
                # 登录成功之后,跳转到index页面
                return HttpResponseRedirect(reverse("index"))
            # 查询到用户不存在
            else:
                # 提示“用户名或密码错误”,同时在前端的表单中显示之前填写的内容
                return render(request, "login.html", {"msg": "用户名或密码错误", "login_form": login_form})
        # 如果验证不通过,在前端页面显示填写的内容
        else:
            return render(request, "login.html", {"login_form": login_form})

# 登出
class LoginoutView(View):
    def get(self,request,*args, **kwargs):
        # Django 内置的登出操作
        logout(request)
        # 返回登录页面
        return HttpResponseRedirect(reverse("login"))

4  在用户目录下新建forms.py

# apps/user/forms.py
from django import forms
from captcha.fields import CaptchaField

# 登录表单验证
# https://docs.djangoproject.com/zh-hans/2.2/ref/forms/fields/
class LoginForm(forms.Form):
    # 用户名不能为空,且至少3位
    username = forms.CharField(required=True,min_length=3)
    # 密码不能为空,且至少6位
    password = forms.CharField(required=True,min_length=6)

# 动态验证码获取
class DynamicLoginForm(forms.Form):
    captcha = CaptchaField()

5 前端login.html注意事项

# {{ 变量 }}:变量代码
# {% 代码段落 %}:逻辑代码

# {% url 'login' %}
# Django 可根据urls.py中 path 的 name 来找到对应的url

# {% csrf_token %}
# 防范csrf攻击,Django自动处理的内部机制

# {{ dynamic_form.captcha }}
# 获取图片动态验证码。可参照后端froms.py、views.py中的相关代码

# {% if login_form.errors.username %}errorput{% endif %}
# 返回错误提示。可参照后端froms.py、views.py中的相关代码

# {{ login_form.password.value }}
# 值回填功能

# {% for key,error in login_form.errors.items %}{{ error }}{% endfor %}
# 遍历错误信息


<form class="tab-form" action="{% url 'login' %}" method="post" autocomplete="off" id="form">
	<div class="form-group marb20 ">
		<input name="username" id="account_l" type="text" placeholder="手机号" />
	</div>
	<div class="form-group marb20 {% if login_form.errors.password %} errorput {% endif %} ">
		<input name="password" id="password_l" value="{{ login_form.password.value }}" type="password" placeholder="请输入您的密码" />
	</div>
	<div class="form-group marb20 blur" id="jsRefreshCode">
		{{ dynamic_form.captcha }}
	</div>
    <div class="clearfix">
        <div class="error btns login-form-tips" id="jsLoginTips">{{ msg }}</div>
	<div class="error btns login-form-tips" id="jsLoginTips"></div>
		<input class="btn btn-green" id="jsLoginBtn" type="submit" value="立即登录 > " />
	{% csrf_token %}
</form>

# 首页前端代码用到的css、js、images等文件存放到了static目录下
# 所以,需要将首页前端代码中的../css等统一替换为/static/css等,需要注意的是前边有/

参考信息:

refer1: URL构成简析

http://www.example.com:80/path/to/myfile.html?key=value#SomewhereInTheDocument

1【http://】 协议名Protocol。标明请求需要使用的协议,通常是HTTP协议或者HTTPS协议

2【www.example.com】域名Domain。也可替换为IP地址

域名是一个字符串形式的服务器地址,主要是方便人阅读和记忆

IP地址是机器语言形式的服务器地址,是网络底层实际使用的地址,主要有机器来处理的

用域名访问服务器的话,计算机先回向域名服务器(DNS)请求把域名翻译成IP地址,然后再去用IP地址访问服务器。

3【80】 端口号Port。用于区分服务的端口。如果省略端口部分,将采用默认端口

一台服务器可以提供许多服务,比如WEB服务,FTP服务等,如果把服务器比作房子,端口号可以看做通向不同服务的门

4【path/to/myfile.html】路径Path。表示服务器上资源的路径

5【?key=value】参数Paramy。也叫查询,或者搜索。参数以问号(?)开始,以(&)隔开

6【#SomewhereInTheDocument】锚点。可以理解为书签,前端来做页面定位的,后台一般不用管

refer2: 图形验证码(captcha)的安装

1 安装captcha包

pip install  django-simple-captcha

2 在 settings.py 注册captcha app

INSTALLED_APPS = [
    'captcha',
]

3 迁移和同步captcha 所以依赖的表

# 迁移
python manage.py makemigrations

# 同步
python manage.py migrate

4 在 urls.py 中添加相应url

from django.urls import path, re_path, include

urlpatterns = [
    re_path('^captcha/', include('captcha.urls')),
]

官方文档:https://django-simple-captcha.readthedocs.io/en/latest/usage.html#installation

refer3: HTTP重定向(Redirect)技术

URL 重定向Redirect,是一种当实际资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,保持(原有)链接可用的技术。

参考链接1:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Redirections

参考链接2:https://blog.csdn.net/kiyoometal/article/details/90698761

refer4: HTML 属性

1 HTML 全局属性

1)class 属性:规定元素的类的名称。如需为一个元素规定多个类,用空格分隔类名。

① class 属性大多数时候用于指向样式表中的类(class)。不过,也可以利用它通过 JavaScript 来改变带有指定 class 的 HTML 元素。

② class 属性不能在以下 HTML 元素中使用:base, head, html, meta, param, script, style 以及 title

③ 类名不能以数字开头!

2)id 属性:规定 HTML 元素的唯一的 id,id 在 HTML 文档中也必须是唯一的。

id 属性可用作链接锚(link anchor),通过 JavaScript(HTML DOM)或通过 CSS 为带有指定 id 的元素改变或添加样式。

2 HTML <form>标签

① <form> 标签用于为用户输入创建 HTML 表单。

② 表单能够包含 input 元素,比如文本字段、复选框、单选框、提交按钮等等。

③ 表单还可以包含 menustextareafieldsetlegend 和 label 元素

④ 表单用于向服务器传输数据。

属性 描述
action URL 规定当提交表单时向何处发送表单数据
method

post

get

规定用于发送 form-data 的 HTTP 方法
autocomplete

on

off

规定是否启用表单的自动完成功能
name form_name 规定表单的名称

3 HTML <input>标签

 标签用于搜集用户信息

属性 描述
type button
checkbox
file
hidden
image
password
radio
reset
submit
text
规定 input 元素的类型
value value 规定 input 元素的值
placeholder text 规定帮助用户填写输入字段的提示

4  HTML<script> 标签

<script>标签既可以包含脚本语句,也可以通过 src 属性指向外部脚本文件

通常放置在一个 HTML 网页的头部标签 <head> 标签内

属性 描述 备注
type MIME-type 指示脚本的 MIME 类型。 如text/javascript等
src URL 规定外部脚本文件的 URL。  

参考链接1:https://www.w3school.com.cn/tags/html_ref_standardattributes.asp

参考链接2:https://www.w3school.com.cn/tags/tag_form.asp

参考链接3:https://www.w3school.com.cn/tags/tag_input.asp

end

发布了18 篇原创文章 · 获赞 0 · 访问量 570

猜你喜欢

转载自blog.csdn.net/zhsworld/article/details/103913707
今日推荐