python写简单的注册登录,用python写注册登录界面

大家好,本文将围绕python注册用户名和密码登录展开说明,python写简单的注册登录是一个很多人都想弄明白的事情,想搞清楚用python写注册登录界面需要先了解以下几个事情。

如果直接阅读本文,您可能有些不知所云,这是因为我用很多篇幅讲了一个事情,如果想知道上下文,那么建议您从本专栏第22章看起:Python3开发–22–了解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学c+之前要学python吗

修改代码: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="java:;">7天无理由退换货</a>
          <a class="icon2" href="java:;">满99元全场免邮</a>
          <a class="icon3" style="margin-right: 0" href="java:;">100%品质保证</a>
        </p>
      </div>
    </div>
    <div class="mod_help w1200">
      <p>
        <a href="java:;">关于我们</a>
        <span>|</span>
        <a href="java:;">帮助中心</a>
        <span>|</span>
        <a href="java:;">售后服务</a>
        <span>|</span>
        <a href="java:;">母婴资讯</a>
        <span>|</span>
        <a href="java:;">关于货源</a>
      </p>
      <p class="coty">母婴商城版权所有 &copy; 2012-2020</p>
    </div>
  </div>
{% endblock footer %}

<!-- 重写base.html定义的接口,该接口的作用是验证用户输入的用户名是否为手机号 -->
{% block  %}
   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  %}

二、Django的CSRF防护

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

Django的CSRF防护原理如下:

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

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

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

三、总结

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

在这里插入图片描述

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值