利用Flask搭建微电影视频网站(十一):日志管理和权限管理
关于博主
努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!
微信公众号: 啃饼思录
QQ: 2810706745(啃饼小白)
写在前面
本篇笔记,我们介绍日志管理和权限管理,其中日志管理包括操作日志列表,管理员登录日志列表,会员登录日志列表,这个和前面介绍的标签,电影,预告管理也是差不多,所以我就加快速度,话不多说,开始学习吧。
本篇笔记对应上传的仓库为:https://github.com/licheetools/movie对应第十一篇。
日志管理
操作日志列表
使用到的内容
我们将使用到的内容有:
模型:Oplog ,Userlog ,Adminlog
表单: 无 (这个不涉及到表单的提交)
请求方法: GET
访问控制: @admin_login_req
上下文应用处理器
这里我们需要引入上下文应用处理器的概念,它是可以封装全局变量并把全局变量展现到模板里面,我们前面在个人中心里面没有对操作时间进行配置,因为操作时间就是需要用到上下文处理器。我们打开views.py文件,新定义下面的函数:
import datetime
# 上下文处理器
@admin.context_processor
def tpl_extra():
data = dict(
online_time=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
)
return data
接着用我们这里定义的online_time
,去填充我们的admin.html页面里面的操作时间:
然后刷新一下我们的页面,发现操作时间就可以正常显示了。
注意一下,import datetime
和from datetime import datetime
是不同的,你可以点击这里区别!
记录增删改查操作
打开views.py文件,我们需要把登录时用户的id一块记录下来,修改登录函数:
session["admin_id"] = admin.id
session.pop("admin_id", None)
然后继续完善我们的视views.py,我们这里以添加标签为例,进行操作的记录演示:
from app.models import OpLog, UserLog, AdminLog
oplog = OpLog(
admin_id=session["admin_id"],
ip=request.remote_addr,
reason="添加标签%s" % data["name"]
)
db.session.add(oplog)
db.session.commit()
就是这样:
flask中获取ip地址使用request.remote_addr
,可以点击这里了解一下:
python使用Flask框架获取用户IP地址的方法
接下来你可以去添加几个标签,然后查询一下数据库,看是不是有了相应的记录!
然后发现数据库里面有了日志,但是我们还需要把它们给显示出来。
操作日志页面显示
打开views.py文件,我们修改日志列表函数:
# 操作日志列表
@admin.route('/oploglist/<int:page>/', methods=["GET"])
@admin_login_req
def oplog_list(page=None):
if page is None:
page = 1
# 查询的时候关联标签,采用join来加进去,多表关联用filter,过滤用filter_by
page_data = OpLog.query.join(
Admin
).filter(
Admin.id == OpLog.admin_id
).order_by(
OpLog.addtime.desc()
).paginate(page=page, per_page=10)
return render_template("admin/oplog_list.html", page_data=page_data)
然后打开oplog_list.html页面,开始for循环的遍历:
然后就是分页功能了,做了很多遍了:删除html页面的分页代码,我们在开头导入刚才的admin_page.html文件,然后开始调用:
{% import "ui/admin_page.html" as pg %}
将下面的代码填充你刚才删除的那段的位置:
{{ pg.page(page_data, "admin.oplog_list") }}
最后别忘了去grid.html页面,添加page=1
:
<a href="{{ url_for('admin.oplog_list', page=1) }}">
<i class="fa fa-circle-o"></i> 操作日志列表
</a>
至此,关于操作日志列表的介绍就到此为止了!接下来是管理员登录日志列表!
管理员登录日志列表
管理员登录日志列表是处理与管理员登录有关的列表,自然而的我们就要修改我们的登录函数了:
adminlog = AdminLog(
admin_id=session["admin_id"],
ip=request.remote_addr,
)
db.session.add(adminlog)
db.session.commit()
接下来你可以重新登录或退出,然后查询一下数据库,看是不是有了相应的记录!
然后发现数据库里面有了日志,但是我们还需要把它们给显示出来。
管理员登录日志页面显示
打开views.py文件,我们修改管理员登录日志列表函数:
# 管理员登录日志列表
@admin.route('/adminloginlog/list/<int:page>/', methods=["GET"])
@admin_login_req
def adminloginlog_list(page=None):
if page is None:
page = 1
# 查询的时候关联标签,采用join来加进去,多表关联用filter,过滤用filter_by
page_data = AdminLog.query.join(
Admin
).filter(
Admin.id == AdminLog.admin_id
).order_by(
AdminLog.addtime.desc()
).paginate(page=page, per_page=10)
return render_template("admin/adminloginlog_list.html", page_data=page_data)
然后打开adminloginlog_list.html页面,开始for循环的遍历:
然后就是分页功能了,做了很多遍了:删除html页面的分页代码,我们在开头导入刚才的admin_page.html文件,然后开始调用:
{% import "ui/admin_page.html" as pg %}
将下面的代码填充你刚才删除的那段的位置:
{{ pg.page(page_data, "admin.adminloginlog_list") }}
最后别忘了去grid.html页面,添加page=1:
<a href="{{ url_for('admin.adminloginlog_list', page=1) }}">
<i class="fa fa-circle-o"></i> 管理员登录日志列表
</a>
至此,关于管理员登录日志列表的介绍就到此为止了!接下来是会员登录日志列表!
会员登录日志列表
为了后续开发的必要,我们来在数据库里,插入一些数据:在终端输入cmd,然后输入mysql -uroot -proot后回车,接着use movie; 然后查询一下userlog的信息:select * from userlog;接着复制粘贴下面的代码:
insert into userlog(user_id,ip,addtime) values(1,"192.188.8.1",now());
insert into userlog(user_id,ip,addtime) values(2,"192.188.8.2",now());
insert into userlog(user_id,ip,addtime) values(3,"192.188.8.3",now());
insert into userlog(user_id,ip,addtime) values(4,"192.188.8.4",now());
insert into userlog(user_id,ip,addtime) values(5,"192.188.8.5",now());
insert into userlog(user_id,ip,addtime) values(6,"192.188.8.6",now());
insert into userlog(user_id,ip,addtime) values(7,"192.188.8.7",now());
insert into userlog(user_id,ip,addtime) values(8,"192.188.8.8",now());
insert into userlog(user_id,ip,addtime) values(8,"192.188.8.9",now());
之后回车,然后再次查询一下我们的数据库:select * from userlog;,看是不是这样的信息:
mysql> select * from userlog;
+----+---------+-------------+---------------------+
| id | user_id | ip | addtime |
+----+---------+-------------+---------------------+
| 1 | 1 | 192.188.8.1 | 2018-08-11 18:24:37 |
| 2 | 2 | 192.188.8.2 | 2018-08-11 18:24:38 |
| 3 | 3 | 192.188.8.3 | 2018-08-11 18:24:38 |
| 4 | 4 | 192.188.8.4 | 2018-08-11 18:24:38 |
| 5 | 5 | 192.188.8.5 | 2018-08-11 18:24:38 |
| 6 | 6 | 192.188.8.6 | 2018-08-11 18:24:38 |
| 7 | 7 | 192.188.8.7 | 2018-08-11 18:24:38 |
| 8 | 8 | 192.188.8.8 | 2018-08-11 18:24:38 |
| 9 | 8 | 192.188.8.9 | 2018-08-11 18:24:38 |
+----+---------+-------------+---------------------+
9 rows in set (0.19 sec)
mysql>
接着打开views.py文件,我们修改会员登录日志列表函数(仿照之前的管理员登录列表):
# 会员登录日志列表
@admin.route('/userloginlog/list/<int:page>/', methods=["GET"])
@admin_login_req
def userloginlog_list(page=None):
if page is None:
page = 1
# 查询的时候关联标签,采用join来加进去,多表关联用filter,过滤用filter_by
page_data = UserLog.query.join(
User
).filter(
User.id == UserLog.user_id
).order_by(
UserLog.addtime.desc()
).paginate(page=page, per_page=10)
return render_template("admin/userloginlog_list.html", page_data=page_data)
然后打开userloginlog_list.html页面,开始for循环的遍历:
然后就是分页功能了,做了很多遍了:删除html页面的分页代码,我们在开头导入刚才的admin_page.html文件,然后开始调用:
{% import "ui/admin_page.html" as pg %}
将下面的代码填充你刚才删除的那段的位置:
{{ pg.page(page_data, "admin.userloginlog_list") }}
最后别忘了去grid.html页面,添加page=1:
<a href="{{ url_for('admin.userloginlog_list', page=1) }}">
<i class="fa fa-circle-o"></i> 会员登录日志列表
</a>
至此,关于会员登录日志列表的介绍就到此为止了,接下来便是权限管理的介绍了!
权限管理
使用到的内容
我们将使用到的内容有:
模型:Auth
表单: AuthForm
请求方法: GET,POST
访问控制: @admin_login_req
1、添加表单验证字段
打开forms.py,我们定义Form字段,注意因为是权限管理模块,所以对应的html页面就是auth_add.html
,而且我们在forms.py里面定义的字段必须与auth_add.html
里面的保持一致!(如果觉得不是很容易看出来,可以运行项目,直接访问auth_add.html页面,这样明显多了!)
# 添加权限
class AuthForm(FlaskForm):
name = StringField(
label="权限名称",
validators=[
DataRequired("权限名称不能为空")
],
description="权限名称",
render_kw={
"class": "form-control",
"id": "input_name",
"placeholder": "请输入权限名称!"
}
)
url = StringField(
label="权限地址",
validators=[
DataRequired("权限地址不能为空")
],
description="权限地址",
render_kw={
"class": "form-control",
"id": "input_url",
"placeholder": "请输入权限地址!"
}
)
submit = SubmitField(
'修改',
render_kw={
"class": "btn btn-primary",
}
)
2、准备页面渲染字段
打开admin/views.py文件,我们修改auth_add
函数:
from app.admin.forms import AuthForm
from app.models import Auth
# 添加权限
@admin.route('/auth/add', methods=["GET", "POST"])
@admin_login_req
def auth_add():
form = AuthForm()
return render_template("admin/auth_add.html", form=form)
3、后台页面传值显示以及操作信息提示
可以仿照前面的movie_add.html来修改auth_add.html:
记得在submit的上面添加{{ form.csrf_token }},还有form提交的方法:
<form role="form" method="post" >
4、后台页面错误信息提示
打开auth_add.html页面,我们同样可以仿照movie_add.html来进行修改:(里面的title需要按照我们数据库里字段的要求进行修改)
{% for err in form.title.errors %}
<div class="col-md-12">
<p style="color:red">{{ err }}</p>
</div>
{% endfor %}
5、修改权限添加函数
# 添加权限
@admin.route('/auth/add', methods=["GET", "POST"])
@admin_login_req
def auth_add():
form = AuthForm()
if form.validate_on_submit():
data = form.data
auth = Auth(
name=data["name"],
url=data["url"]
)
db.session.add(auth)
db.session.commit()
flash("添加权限成功!", "ok")
return render_template("admin/auth_add.html", form=form)
然后运行一下我们的manage.py文件,就可以去后台添加我们的权限了:
查询一下数据库,发现这样的信息就说明权限添加成功了:
mysql> select * from auth;
+----+--------------------+-----------------------------+---------------------+
| id | name | url | addtime |
+----+--------------------+-----------------------------+---------------------+
| 1 | 添加标签权限 | /admin/tag/add | 2018-08-12 14:42:30 |
| 2 | 编辑标签权限 | /admin/tag/edit/<int:id>/ | 2018-08-12 14:44:07 |
| 3 | 标签列表权限 | /admin/tag/list/<int:page>/ | 2018-08-12 14:45:00 |
| 5 | 删除标签权限 | /admin/tag/del/<int:id>/ | 2018-08-12 14:46:02 |
+----+--------------------+-----------------------------+---------------------+
4 rows in set (0.10 sec)
mysql>
权限列表的配置
打开我们的views.py文件,我们参考之前的标签列表的配置,对权限列表进行配置:
# 权限列表
@admin.route('/auth/list/<int:page>', methods=["GET"])
@admin_login_req
def auth_list(page=None):
if page is None:
page = 1
# 查询的时候关联标签,采用join来加进去,多表关联用filter,过滤用filter_by
page_data = Auth.query.order_by(
Auth.addtime.desc()
).paginate(page=page, per_page=2)
return render_template("admin/auth_list.html", page_data=page_data)
接着去我们的grid.html页面添加page参数(page=1),记住所以的列表都要有一个初始页,也就是说肯定有一个页面去显示,就算没有数据也要有页面,否则就是404嘛,这既然不是404,就得有个页面,空的页面也是可以的:
然后我们打开auth_list.html页面,进行for循环的填充:
然后就是分页功能了,我们参考之前在标签列表页面的配置,打开auth_list.html,删除那个<ul class="pagination pagination-sm no-margin pull-right"> ....... </ul>
标签里的内容,我们在开头导入刚才的admin_page.html文件,然后开始调用:
{% import "ui/admin_page.html" as pg %}
将下面的代码填充你刚才删除的那段的位置:
{{ pg.page(page_data, "admin.auth_list") }}
至此,关于权限列表的介绍就到此为止了!接下来是权限的删除!
权限的删除
打开views.py文件,我们新定义auth_del函数:(仿照会员删除的函数)
# 权限删除
@admin.route('/auth/del/<int:id>', methods=["GET"])
@admin_login_req
def auth_del(id=None):
auth = Auth.query.filter_by(id=id).first_or_404()
db.session.delete(auth)
db.session.commit()
flash("权限删除成功!", "ok")
return redirect(url_for("admin.auth_list", page=1))
然后打开auth_list.html页面,我们添加删除成功的flash提示(同样可以复制我们的preview_list.html页面的那一部分):
最后别忘了在auth_list.html页面添加删除跳转链接:
<a href="{{ url_for('admin.auth_del', id=v.id) }}" class="label label-danger">删除</a>
然后去测试一下我们的项目,看一看权限删除功能是否已经实现了呢,接下来进行权限的编辑功能的实现!
权限的编辑
打开views.py文件,我们在权限列表的下面新增以下代码:
# 权限编辑
@admin.route('/auth/edit/<int:id>', methods=["GET", "POST"])
@admin_login_req
def auth_edit(id=None):
form = AuthForm() # 实例化一个TagForm,然后将form传递到前端页面去。
auth = Auth.query.get_or_404(id)
if form.validate_on_submit():
data = form.data
auth.url = data["url"]
auth.name = data["name"]
db.session.add(auth)
db.session.commit()
flash("修改权限成功!", "ok")
return redirect(url_for("admin.auth_edit", id=id))
return render_template("admin/auth_edit.html", form=form, auth=auth)
接着在admin下面新建auth_edit.html页面,将auth_add.html页面全部添加进去,然后开始修改:将所有的添加字段改为编辑。并且给那些需要编辑的字段赋初值:
然后在auth_list里面修改页面的跳转:
<a href="{{ url_for('admin.auth_edit', id =v.id) }}" class="label label-success">编辑</a>
刷新一下,看看关于权限这一功能我们的项目是不是都能使用了!
至此,本篇关于日志管理和权限管理的介绍就到此为止了,感谢你的赏阅!
本篇笔记对应上传的仓库为:https://github.com/licheetools/movie对应第十一篇。