ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python3开发--31--Django内置User实现用户注册与登录

2021-01-01 21:30:27  阅读:143  来源: 互联网

标签:username 登录 用户注册 -- 31 用户 Django User login


如果直接阅读本文,您可能有些不知所云,这是因为我用很多篇幅讲了一个事情,如果想知道上下文,那么建议您从本专栏第21章看起:Python3开发–21–了解Django框架

一、内置User实现注册登录

在本项目中,我们将用户注册和登录放在同一个界面中,如果用户不存在,则执行注册操作,反之则执行登录操作。

由于Django已经内置了用户管理功能,即Auth认证系统,而且具有灵活的扩展性,Auth认证系统内置模型User,它对应数据表auth_user,该模型一共定义了11个字段,各字段的含义说明如下:

字段说明
idint类型,数据表主键
passwordvarchar类型,代表用户密码
last_logindatetime类型,最近一次登录的时间
is_superusertinyint类型,表示该用户是否是超级管理员
usernamevarchar类型,代表用户账号
first_namevarchar类型,代表用户的名字
last_namevarchar类型,代表用户的姓氏
emailvarchar类型,代表用户的邮件
is_staff用来判断用户是否可以登录进入Admin后台系统
is_activetinyint类型,用来判断该用户的状态是否被激活
date_joineddatetime类型,账号的创建时间

用户注册与登录功能在shopper应用中已经定义了路由login,该路由对应的视图函数为loginView。

修改代码:shopper/views.py

from django.shortcuts import render, redirect
from django.contrib.auth import logout, login, authenticate
from django.contrib.auth.models import User
from django.shortcuts import reverse

def loginView(request):
    # 定义变量,用于设置共用模板base.html的模板变量
    title = '用户登录'
    classContent = 'logins'

    if request.method == 'POST':
        # 获取请求参数username和password
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')

        # 查询username的数据是否存在内置模型User
        if User.objects.filter(username=username):
            # 验证账号密码与模型User的账号密码是否一致
            user = authenticate(username=username, password=password)
            # 如果通过验证,则使用内置函数login执行用户登录
            # 登录成功后跳转到个人中心页面
            if user:
                login(request, user)
                return redirect(reverse('shopper:shopper'))
        # username的数据不存在内置模型User
        else:
            # 执行用户注册
            state = '注册成功'
            d = dict(username=username, password=password, is_staff=1, is_active=1)
            user = User.objects.create_user(**d)
            user.save()

    return render(request, 'login.html', locals())

def shopperView():
    pass

def logoutView():
    pass

def shopcartView():
    pass

由于视图函数使用模板文件login.html生成响应内容,那么就需要对模板文件login.html进行编写。

修改代码:templates/login.html

<!-- 调用模板文件base.html -->
{% extends 'base.html' %}
{% load static %}
<!-- 重写接口content -->
{% block content %}
    <div class="login-bg">
      <div class="login-cont w1200">
        <div class="form-box">
          <form class="layui-form" action="" method="post">
            {% csrf_token %}
            <legend>手机号注册登录</legend>
            <div class="layui-form-item">
              <div class="layui-inline iphone">
                <div class="layui-input-inline">
                  <i class="layui-icon layui-icon-cellphone iphone-icon"></i>
                  <input name="username" id="username" lay-verify="required|phone" placeholder="请输入手机号" class="layui-input">
                </div>
              </div>
              <div class="layui-inline iphone">
                <div class="layui-input-inline">
				  <i class="layui-icon layui-icon-password iphone-icon"></i>
                  <input id="password" type="password" name="password" lay-verify="required|password" placeholder="请输入密码" class="layui-input">
                </div>
              </div>
            </div>
            <p>{{ state }}</p>
            <div class="layui-form-item login-btn">
              <div class="layui-input-block">
                <button class="layui-btn" lay-submit="" lay-filter="demo1">注册/登录</button>
              </div>
            </div>
          </form>
        </div>
      </div>
    </div>
{% endblock content %}

<!-- 重写base.html定义的接口footer,该接口作用是生成首页的底部信息 -->
{% block footer %}
  <div class="footer">
    <div class="ng-promise-box">
      <div class="ng-promise w1200">
        <p class="text">
          <a class="icon1" href="javascript:;">7天无理由退换货</a>
          <a class="icon2" href="javascript:;">满99元全场免邮</a>
          <a class="icon3" style="margin-right: 0" href="javascript:;">100%品质保证</a>
        </p>
      </div>
    </div>
    <div class="mod_help w1200">
      <p>
        <a href="javascript:;">关于我们</a>
        <span>|</span>
        <a href="javascript:;">帮助中心</a>
        <span>|</span>
        <a href="javascript:;">售后服务</a>
        <span>|</span>
        <a href="javascript:;">母婴资讯</a>
        <span>|</span>
        <a href="javascript:;">关于货源</a>
      </p>
      <p class="coty">母婴商城版权所有 &copy; 2012-2020</p>
    </div>
  </div>
{% endblock footer %}

<!-- 重写base.html定义的接口script,该接口的作用是验证用户输入的用户名是否为手机号 -->
{% block script %}
   layui.config({
      base: '{% static 'js/' %}'
    }).use(['jquery','form'],function(){
          var $ = layui.$,form = layui.form;
        $("#find").click(function() {
            if(!/^1\d{10}$/.test($("#username").val())){
              layer.msg("请输入正确的手机号");
              return false;
            }
        })
    })
{% endblock script %}

二、Django的CSRF防护

Django在用户提交表单时,表单会自动加入csrfmiddlewaretoken隐藏控件,这个隐藏控件的值会与网站后台保存的csrfmiddlewaretoken进行匹配,只有匹配成功,网站才会处理表单数据。

Django的CSRF防护原理如下:

1、在用户访问网站时,Django在网页表单中生成一个隐藏控件csrfmiddlewaretoken,控件属性value的值是Django随机生成的。

2、当用户提交表单时,Django校验表单的csrfmiddlewaretoken是否与自己保存的csrfmiddlewaretoken一致,用来判断当前请求是否合法。

3、如果用户被CSRF攻击并从其他地方发送攻击请求,由于其他地方不可能知道隐藏控件csrfmiddlewaretoken的值,因此导致网站后台校验csrfmiddlewaretoken失败,攻击就被成功防御了。

三、总结

看看我们本节动过哪些代码文件

在这里插入图片描述

标签:username,登录,用户注册,--,31,用户,Django,User,login
来源: https://blog.csdn.net/wutianxu123/article/details/112065959

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有