大家好,本文将围绕python注册用户名和密码登录展开说明,python写简单的注册登录是一个很多人都想弄明白的事情,想搞清楚用python写注册登录界面需要先了解以下几个事情。
如果直接阅读本文,您可能有些不知所云,这是因为我用很多篇幅讲了一个事情,如果想知道上下文,那么建议您从本专栏第22章看起:Python3开发–22–了解Django框架
一、内置User实现注册登录
在本项目中,我们将用户注册和登录放在同一个界面中,如果用户不存在,则执行注册操作,反之则执行登录操作。
由于Django已经内置了用户管理功能,即Auth认证系统,而且具有灵活的扩展性,Auth认证系统内置模型User,它对应数据表auth_user,该模型一共定义了11个字段,各字段的含义说明如下:
字段 | 说明 |
---|---|
id | int类型,数据表主键 |
password | varchar类型,代表用户密码 |
last_login | datetime类型,最近一次登录的时间 |
is_superuser | tinyint类型,表示该用户是否是超级管理员 |
username | varchar类型,代表用户账号 |
first_name | varchar类型,代表用户的名字 |
last_name | varchar类型,代表用户的姓氏 |
varchar类型,代表用户的邮件 | |
is_staff | 用来判断用户是否可以登录进入Admin后台系统 |
is_active | tinyint类型,用来判断该用户的状态是否被激活 |
date_joined | datetime类型,账号的创建时间 |
用户注册与登录功能在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">母婴商城版权所有 © 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
失败,攻击就被成功防御了。
三、总结
看看我们本节动过哪些代码文件