利用Flask搭建微电影视频网站

利用Flask搭建微电影视频网站(十一):日志管理和权限管理

2018-09-14  本文已影响23人  啃饼小白

关于博主

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

                  微信公众号:  啃饼思录
                   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 datetimefrom 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对应第十一篇。

上一篇下一篇

猜你喜欢

热点阅读