Python3项目初始化9-->用户登录和用户管理和密码加密

26、用户登录页面修改
使用用户登录现成的模板。
鼠标右键查看页面原代码,直接复制粘贴:https://v3.bootcss.com/examples/signin/
调整login.html代码,
{% load static %}
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>用户登录</title>
<!--<link href="../../static/bootstrap-3.4.1-dist/css/bootstrap.min.css" rel="stylesheet">-->
<link href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}" rel="stylesheet">
<link href="../../static/signin.css" rel="stylesheet">

</head>
<body>
<div class="container">
<form class="form-signin" action="{% url 'user:login' %}" method="POST">
<h2 class="form-signin-heading">用户登录</h2>
{% if errors %}
{% for key, error in errors.items %}
<div class="alert alert-danger" role="alert">{{ error }}</div>
{% endfor %}
{% endif %}
{% csrf_token %}
<label for="name" class="sr-only">用户名</label>
<input type="name" id="name" class="form-control" placeholder="用户名" name="name" value="{{ name }}">
<label for="password" class="sr-only">密码</label>
<input type="password" id="password" class="form-control" name="password" placeholder="密码">
<button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
</form>

</div>
</body>
</html>

配置sginin.css静态文件。
body {
padding-top: 40px;
padding-bottom: 40px;
background-color: #eee;
}

.form-signin {
max-width: 330px;
padding: 15px;
margin: 0 auto;
}
.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
}
.form-signin .checkbox {
font-weight: 400;
}
.form-signin .form-control {
position: relative;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
height: auto;
padding: 10px;
font-size: 16px;
}
.form-signin .form-control:focus {
z-index: 2;
}
.form-signin input[type="email"] {
margin-bottom: -1px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.form-signin input[type="password"] {
margin-bottom: 10px;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
验证,可以正常登录后,看到用户管理列表。
此处需要强调前端静态文件的使用方法。复制文件的时候,可能css加载不全,需要自建文件,如下截图操作展示,

 

 

27、用户管理页面
选择模板:https://v3.bootcss.com/examples/navbar-fixed-top/
用户管理index
{% load static %}
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>用户管理</title>
<link href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}" rel="stylesheet">
<link href="../../static/navbar-fixed-top.css" rel="stylesheet">
</head>

<body>

<!-- Fixed navbar -->
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">CMDB</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="{% url 'user:index' %}">用户管理</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a>当前登录用户是:{{ request.session.user.name }}</a></li>
<li class="active"><a href="/user/logout/">退出登录</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>

<div class="container">
<a class="btn btn-primary" href="{% url 'user:create' %}">创建</a><br/><br/>
<table class="table table-stripe table-bordered table-hover table-condensed">
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>联系方式</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for user in users %}
<tr>
<td>{{ user.name }}</td>
<td>{{ user.age }}</td>
<td>
{% if user.sex == 0 %}

{% else %}

{% endif %}
</td>
<td>{{ user.tel }}</td>
<td>
<a class="btn btn-success btn-xs" href="{% url 'user:view' %}?uid={{ user.id }}">编辑</a>
{% if request.session.user.id != user.id %}
<a class="btn btn-danger btn-xs" href="{% url 'user:delete' %}?uid={{ user.id }}">删除</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div> <!-- /container -->
</body>
</html>
静态文件,../../static/navbar-fixed-top.css"
body {
min-height: 2000px;
padding-top: 70px;
}
登录访问,可以正常到用户管理页面。相关截图如下,

28、登录密码做成密文的
以上用户密码都是使用密文登录的。现在需要做成密文的。
使用Python 里面hashlib实现。
加盐:如果使用同一个密码登录,那么解密后都一样,加盐就是加上自己的特定字符串跟密码拼接,字符串需要存储在数据库。
需要修改model和validators.py文件。
修改model文件,
import hashlib
def encrypt_password(password):
if not isinstance(password, bytes):
password = str(password).encode()
md5 = hashlib.md5()
md5.update(password)
return md5.hexdigest()
有限文件validators.py处理
登录和创建函数需要修改为encrypt_password(password)
## 登录
from .models import User, encrypt_password
if user is None:
return None

if user.password == encrypt_password(password):
return user
###创建
user.password = params.get('password', '').strip()

if user.password == '' or params.get('other_password') != user.password:
is_valid = False
errors['password'] = '密码不能为空, 且两次输入密码必须相同'
else:
user.password = encrypt_password(user.password)
创建一个新用户,退出后,老账户密码由于没有加密,不能登录了。达到了预期效果。以下截图看效果。备份cmdb-8-23.rar

>>> import hashlib
>>> md5 = hashlib.md5()
>>> md5.update(b'123')
>>> dir(md5)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__has
h__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__'
, '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'block_size', 'copy', 'digest', 'digest_size', 'hexdigest',
'name', 'update']
>>> md5.hexdigest()
'202cb962ac59075b964b07152d234b70'

posted @ 2022-08-23 21:48  wang_wei123  阅读(247)  评论(0编辑  收藏  举报