Django项目-资产管理系统(一)

1.创建项目

静态资源导入

2.表结构

下面这张图中的资产表里的tofields参数应该是tofield,在此纠正一下

外键到choice元组或者数据库表,一个是固定的一个是动态的。还有就是为了存储空间节省,可以使用choices来节省实际上占用的数据库空间。

depart = models.ForeignKey(
verbose_name="所属部门",
to="DepartMent",
to_field="id",
on_delete=models.CASCADE
)

其中to参数是要求关联的外表,写类的名字就行不用写真实表名例如,app01_DepartMent
to_field参数就是要求关联表的具体字段
其中这个外键名字depart看上去是depart其实是depart_id,也就是字段名创建一旦作为外键,就自动加上_id了
最后就是on_delete参数,因为这个表的depart字段和部门表的id相连,假如部门表id=7的行要删除,但是id=7的部门在资产表里没有还好,一旦有了,部门表id=7的行就不能删除,但是这个选项就会让删除部门id=7的行的同时,把所属部门id也是7的行一并删除。

ctrl+alt+l是格式化代码,ctrl+alt+r是调用快捷工具,更新数据库就不用打出完整的

python manage.py makemigrations 
python manage.py migrate

的命令了只需要:

makemigrations
migrate

3.用户登录

先打开管理员表,然后点击添加行,填写后点击提交按钮

urls.py
views.py
login.html文件
这三步依次操作,直接拿下登录页面

urls.py:

views.py:

login.html:(用作者之前文章写的就行)

以上程序其实有个bug,因为/depart/lists应该是登录验证后跳转的网址,但是没有登录过的用户,可以通过百度或者各种社工方法来得到我们系统的一个urls叫做/depart/lists,然后手动输入并进行跳转,所以存在一个安全性问题。

4.cookie与session

接下来需要了解cookie与session的存在,请查看这篇文章:一文彻底搞清session、cookie、token的区别 – 知乎 (zhihu.com)大佬讲的很详细

views.py里加入把登录信息保存到session的代码(同时记得a是一个对象集合,可以加上.first()来提取第一个对象):

重新运行,登录进入后跳转到部门列表网页时,按住F12进行检查,点击网络,点击全部,点击lists/,就可以看到我们有一个csrftoken,还有一个cookie,

在Django的数据库django_session表里有着三个字段,第一个是sessionid也就是浏览器存储那个随机字符串,第二个是加密后的我们视图里写的接收的user_info内容

在depart_lists里面加入获取session表对象的代码,并加入判断

这样就完美解决了登录的bug,因为假如你访问不带cookie,函数内部返回session对象的时候就会返回空值,就会重定向到登录页面。

想要测试的话,第一个方法就是就把session表那行删除再提交

刷新浏览器,因为你cookie带过来,但是服务端找不到了,他会自动让你跳转登录页面,然后你再登录浏览器就能重新建立session,获取正确的cookie并且访问了

第二个方法就是你把自己浏览器的cookie删除,刷新浏览器

刷新之后一样跳转登录页面,就此,测试完成

接下来代码复用部门管理的页面,写一个资产管理的大概,分别在urls.py和views.py里写入asset:

5.中间件

浏览器在访问服务器端时,请求不会直接到目标服务器的urls,而是会经过几个类,这就是中间件。

在django中也是相同的,中间件的列表是在setting.py中的MIDDLEWARE列表里,那么请求就会依次经过这些类。

上一个标题内容,我们通过session和cookie来解决了未登录可访问的安全性bug,但是这种在视图函数中创建验证cookie的代码的方法,太蠢了,不如放在中间件里来验证,所以我们就把下图红圈中的代码,放到中间件里,可以说是代码复用。

在项目根目录创建目录utils.py,其中添加一个md.py

我们的新添加的中间件就在md.py中编写

在setting.py中,ctrl+鼠标左键点击最后一个单词就可以进入类,我们发现这些类都继承了一个类叫做,MiddlewareMixin

那么只需要先注册中间件,再简单编写一下这个中间件就能简单利用输出文字测试一下是否调用

对于process_request函数:
无返回或者返回值是none,请求继续向后走
如果有返回值,return redirect、return HttpResponse、return render,不会继续往后走,直接执行process_response函数

我们理论形成,实战开始,首先想下,这中间件适合什么应用场景呢

1.权限验证和登录判断,也就是咱们现在把那三行验证cookie的代码添加到中间件的步骤能完成的效果,有权限返回空值让请求往后走,无权限直接拦下返回重定向或者固定文字响应或者固定页面
2.日志生成,我们可以获取访问者的ip和访问时间,来自动生成一个日志

那么我们先进行登录判断,在views.py和md.py里来进行代码改写,注释view.py原先的验证,在md.py里加入逻辑

那么这样是否就能进行登录了呢

发现重定向次数太多,原来我们第一次登录的时候,带着错误cookie或者没带cookie时,经过中间件,就算访问了按理说没登录也能访问的登录页面,也会被打回,并且重定向到登录页面,可是你还是会继续访问登录页面,然后再被打回,重定向,死循环。

那么在中间件收请求的地方写这个白名单,就完美了

三种取session里user_info值的方法:

第一种在中间件里把id和username赋值给request的变量,后端再调用
第二种容易报错,但是只要前面中间件写上了验证,那么能通过中间件流入后端的流量就说明user_info不为空,那么第二种方法就不会报错
第三种就是从会话里获取键值为user_info的字典

6.用户管理

实现用户管理加注销功能

urls.py:

views.py:

templates目录下创建depart_lists.html:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css' %}">
</head>
<body>
<!-- Navbar -->
<nav class="navbar navbar-expand-lg navbar-light bg-light" style="border-radius: 0;">
<div class="container">
<!-- Brand -->
<a class="navbar-brand" href="#">联通资产管理平台</a>
<!-- Toggler/collapsibe Button -->
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Navbar links -->
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link 1</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link 2</a>
</li>
<!-- Dropdown -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
Dropdown
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</li>
</ul>

<!-- Right-aligned links -->
<ul class="navbar-nav ml-auto">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown2" role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
{{ request.unicom_username }}
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown2">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/logout/">注销</a>
</div>
</li>
</ul>
</div>
</div>
</nav>

<!-- Scripts -->
<script src="{% static 'js/jquery-3.7.1.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap/js/bootstrap.js' %}"></script>

</body>
</html>

这个没啥好说的,就是一个注销功能

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇