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

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

作者: 啃饼小白 | 来源:发表于2018-09-14 07:34 被阅读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对应第十一篇。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/xwrugftx.html