15 -Flask构建弹幕微电影网站-基于角色的访问控制

news/2024/5/9 13:18:30/文章来源:https://blog.csdn.net/weixin_34161032/article/details/89659064

本章内容: 基于角色的访问控制
已上线演示地址: http://movie.mtianyan.cn
项目源码地址:https://github.com/mtianyan/movie_project

基于角色的访问控制

角色的访问控制:

将职责和功能划分一个角色,比如电影管理员,预告管理员。

  1. 模型: Auth
  2. 表单: AuthForm
  3. 请求方法: GET POST
  4. 访问控制: @admin_login_req

首先定义authform

class AuthForm(FlaskForm):name = StringField(label="权限名称",validators=[DataRequired("权限名称不能为空!")],description="权限名称",render_kw={"class": "form-control","placeholder": "请输入权限名称!"})url = StringField(label="权限地址",validators=[DataRequired("权限地址不能为空!")],description="权限地址",render_kw={"class": "form-control","placeholder": "请输入权限地址!"})submit = SubmitField('编辑',render_kw={"class": "btn btn-primary",})

views中定义auth_add

权限添加

@admin.route("/auth/add/", methods=["GET", "POST"])
@admin_login_req
def auth_add():"""添加权限"""form = AuthForm()if form.validate_on_submit():data = form.dataauth = 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)

将form传递到表单中,然后开始在模板中替换字段

mark
mark

记得自行加上表单令牌

为字段添加错误信息:

mark
mark

添加form表单的methods

mark
mark

添加flash消息闪现的显示

mark
mark

添加添加标签的权限

mark
mark
mark
mark

权限列表

views中

@admin.route("/auth/list/<int:page>/", methods=["GET"])
@admin_login_req
def auth_list(page=None):"""权限列表"""if page is None:page = 1page_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)

取出所有的数据然后进行时间排序。

pagedata传递到了模板,进行字段填充,import pg 然后调用page方法。

mark
mark
mark
mark
mark
mark

grid中为跳转list的url添加page参数。

mark
mark

编辑与删除功能实现

@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))@admin.route("/auth/edit/<int:id>/", methods=["GET", "POST"])
@admin_login_req
def auth_edit(id=None):"""编辑权限"""form = AuthForm()auth = Auth.query.get_or_404(id)if form.validate_on_submit():data = form.dataauth.url = data["url"]auth.name = data["name"]db.session.add(auth)db.session.commit()flash("修改权限成功!", "ok")redirect(url_for('admin.auth_edit', id=id))return render_template("admin/auth_edit.html", form=form, auth=auth)

为编辑和删除按钮添加url

mark
mark

新建auth_edit.html复制auth_add的代码修改其中汉字部分以及填充值。

mark
mark
mark
mark

权限列表中添加展示消息闪现的部分。

mark
mark

角色管理

  1. 模型: Role
  2. 表单: RoleForm
  3. 请求方法: GET POST
  4. 访问控制: @admin_login_req

角色权限列表中存入id的字符串。

首先创建一个form Roleform

class RoleForm(FlaskForm):name = StringField(label="角色名称",validators=[DataRequired("角色名称不能为空!")],description="角色名称",render_kw={"class": "form-control","placeholder": "请输入角色名称!"})# 多选框auths = SelectMultipleField(label="权限列表",validators=[DataRequired("权限列表不能为空!")],# 动态数据填充选择栏:列表生成器coerce=int,choices=[(v.id, v.name) for v in Auth.query.all()],description="权限列表",render_kw={"class": "form-control",})submit = SubmitField('编辑',render_kw={"class": "btn btn-primary",})

在views中进行对于表单的校验以及传递到模板中。

@admin.route("/role/add/", methods=["GET", "POST"])
@admin_login_req
def role_add():"""角色添加"""form = RoleForm()if form.validate_on_submit():data = form.datarole = Role(name=data["name"],auths=",".join(map(lambda v: str(v), data["auths"])))db.session.add(role)db.session.commit()flash("添加角色成功!", "ok")return render_template("admin/role_add.html", form=form)

此时前往form中进行字段的填充。为模板中form添加post方法

mark
mark
mark
mark

添加提示的flash信息块。

mark
mark

添加字段校验:

mark
mark

备用: 制作多选框checkbox 用widgets.ListWidget 包裹 widgets.CheckboxInput()自己做一个多选.然后choices=[(v.id, v.name) for v in Auth.query.all(). 这样传回来的也是[1,2,3]

角色列表的展示

@admin.route("/role/list/<int:page>/", methods=["GET"])
@admin_login_req
def role_list(page=None):"""角色列表"""if page is None:page = 1page_data = Role.query.order_by(Role.addtime.desc()).paginate(page=page, per_page=2)return render_template("admin/role_list.html", page_data=page_data)

views中定义角色列表,然后将pagedata进行填充,以及import pg与调用page方法进行分页。

mark
mark
mark
mark
mark
mark

grid中的url添加page参数

mark
mark

因为会有删除功能添加flash信息显示

mark
mark

删除角色功能

@admin.route("/role/del/<int:id>/", methods=["GET"])
@admin_login_req
def role_del(id=None):"""删除角色"""role = Role.query.filter_by(id=id).first_or_404()db.session.delete(role)db.session.commit()flash("删除角色成功!", "ok")return redirect(url_for('admin.role_list', page=1))

为list中的删除按钮添加对应的url

mark
mark

编辑角色功能实现

views中对于edit的处理

@admin.route("/role/edit/<int:id>/", methods=["GET", "POST"])
@admin_login_req
def role_edit(id=None):"""编辑角色"""form = RoleForm()role = Role.query.get_or_404(id)# get时进行赋值。应对无法模板中赋初值if request.method == "GET":auths = role.authsform.auths.data = list(map(lambda v: int(v), auths.split(",")))if form.validate_on_submit():data = form.datarole.name = data["name"]role.auths = ",".join(map(lambda v: str(v), data["auths"]))db.session.add(role)db.session.commit()flash("修改角色成功!", "ok")return render_template("admin/role_edit.html", form=form, role=role)

新建一个role_edit.html 把add中的内容粘贴过来,修改汉字。以及填充值

mark
mark

在list中修改指向编辑的链接。

管理员管理

  1. 模型: Admin
  2. 表单: AdminForm
  3. 请求方法: GET POST
  4. 访问控制: @admin_login_req

定义管理员的表单模型

class AdminForm(FlaskForm):name = StringField(label="管理员名称",validators=[DataRequired("管理员名称不能为空!")],description="管理员名称",render_kw={"class": "form-control","placeholder": "请输入管理员名称!",})pwd = PasswordField(label="管理员密码",validators=[DataRequired("管理员密码不能为空!")],description="管理员密码",render_kw={"class": "form-control","placeholder": "请输入管理员密码!",})repwd = PasswordField(label="管理员重复密码",validators=[DataRequired("管理员重复密码不能为空!"),EqualTo('pwd', message="两次密码不一致!")],description="管理员重复密码",render_kw={"class": "form-control","placeholder": "请输入管理员重复密码!",})role_id = SelectField(label="所属角色",coerce=int,choices=[(v.id, v.name) for v in Role.query.all()],render_kw={"class": "form-control",})submit = SubmitField('编辑',render_kw={"class": "btn btn-primary",})

views中实例化form 并将form 传递到前台的模板中
将数据存入数据库

@admin.route("/admin/add/", methods=["GET", "POST"])
@admin_login_req
def admin_add():"""添加管理员"""form = AdminForm()from werkzeug.security import generate_password_hashif form.validate_on_submit():data = form.dataadmin = Admin(name=data["name"],pwd=generate_password_hash(data["pwd"]),role_id=data["role_id"],is_super=1)db.session.add(admin)db.session.commit()flash("添加管理员成功!", "ok")return render_template("admin/admin_add.html", form=form)
mark
mark
mark
mark

添加flash消息显示和错误提示。(自行)注意为模板中form添加post方法。

管理员列表显示

views中添加管理员列表显示

@admin.route("/admin/list/<int:page>/", methods=["GET"])
@admin_login_req
def admin_list(page=None):"""管理员列表"""if page is None:page = 1page_data = Admin.query.join(Role).filter(Role.id == Admin.role_id).order_by(Admin.addtime.desc()).paginate(page=page, per_page=1)return render_template("admin/admin_list.html", page_data=page_data)

前往admin_list中填充pagedata 以及pg的import以及调用page方法进行分页。

mark
mark
mark
mark
mark
mark

grid中修改调转到list的url参数,添加上page=1

mark
mark

访问权限控制

def admin_auth(f):@wraps(f)def decorate_function(*args, **kwargs):# 权限查询abort(404)return f(*args, **kwargs)return decorate_function
# 调用权限装饰器
@admin_auth

通过一个权限装饰器进行访问的控制,在装饰器里面进行一个查询,拿出session中保存的管理员的id,查询出对应的角色。同过角色查询出角色所对应的列表。列表是一个id的列表,id列表中去权限表中查询出我们能够访问的路由规则。根据路由规则进行匹配,得出我们能不能访问该页面。

print(request.script_root);print(request.url_rule)
from flask import abort
def admin_auth(f):"""权限控制装饰器"""@wraps(f)def decorated_function(*args, **kwargs):admin = Admin.query.join(Role).filter(Role.id == Admin.role_id,Admin.id == session["admin_id"]).first()auths = admin.role.auths# 将原本存储的权限字符串转换为列表auths = list(map(lambda v: int(v), auths.split(",")))auth_list = Auth.query.all()urls = [v.url for v in auth_list for val in auths if val == v.id]rule = request.url_ruleif str(rule) not in urls:abort(404)return f(*args, **kwargs)return decorated_function

接下来为除过登录和后台首页都加上。然后测试是否可用。

登录我们的标签管理员。

进阶: 后台菜单动态显示,这个可以设计一个菜单数据表,分配可访问的菜单到用户权限中即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_701442.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

菜鸟站长应该如何防止网站被恶意攻击

随着互联网的发展&#xff0c;很多人都已经有了自己的网站。无论是企业&#xff0c;商家还是个人。以前&#xff0c;做一个网站都得在上千上万元。如今&#xff0c;网站建设的的价格也不再那么贵了&#xff0c;几百块钱就可以做一个网站。而且&#xff0c;这些几百块钱的网络公…

漫画:为什么一到年底,部分网站就会出现日期混乱?

作者 | 漫话编程本文经授权转载自漫话编程&#xff08;ID&#xff1a;mhcoding&#xff09;2019年最后一天&#xff0c;在家里看着跨年晚会&#xff0c;享受着这一年最后一天的闲暇时光&#xff0c;女朋友在旁边玩手机。看了一会之后她突然问我一些很奇怪的问题。于是我拿过他的…

百度或者Google---SEO优化

google和百度的技术差别: 1.百度还认不清哪个是原创的 2.google蜘蛛不够百度快 4.google排名结果随时变化 流量、权重、权威、内容、用户体验、用户关注度等等细节的排名&#xff0c;已表达了SEO的算法。 重要搜索引擎的网站登录入口地址: http://www.webmasterhome.cn/seo/add…

_网站建站基础第十一课(域名解析服务器环境linux安装宝塔)

在服务器&#xff0c;域名(国内备案)购买好之后&#xff0c;就可以开始搭建网站了&#xff0c;建站要为服务器解析好域名&#xff0c;然后配置好服务器环境&#xff0c;服务器环境就以linux系统宝塔面板为例给大家演示&#xff1a;域名备案成功后&#xff0c;进入服务器商的控制…

御用导航官方网站提醒提示页_电脑上使用便签记录工作计划如何设置闹钟定时提醒?...

平常工作日程事务比较多时&#xff0c;就很容易忘掉一些工作&#xff0c;这个时候很多工作族会选择经常使用的电脑工具来记录每日的工作计划&#xff0c;电脑如何设置闹钟定时提醒工作计划呢&#xff1f;电脑便签可以用来记录工作计划闹钟定时提醒的软件&#xff0c;建议使用敬…

关于大型网站技术演进的思考(七)--存储的瓶颈(7)

本文开篇提个问题给大家&#xff0c;关系数据库的瓶颈有哪些&#xff1f;我想有些朋友看到这个问题肯定会说出自己平时开发中碰到了一个跟数据库有关的什么什么问题&#xff0c;然后如何解决的等等&#xff0c;这样的答案没问题&#xff0c;但是却没有代表性&#xff0c;如果出…

高并发网站解决方案

2019独角兽企业重金招聘Python工程师标准>>> 一个小型的网站&#xff0c;可以使用最简单的html静态页面就实现了&#xff0c;配合一些图片达到美化效果&#xff0c;所有的页面均存放在一个目录下&#xff0c;这样的网站对系统架构、性能的要求都很简单。随着互联网业…

服务器安装织梦网站数据库,DedeCMS数据库及服务器空间更换教程

网站空间不稳定会影响SEO优化的效果&#xff0c;因为会降低搜索引擎对于网站的信任度判断&#xff0c;特别是最近使用香港空间的网站&#xff0c;会经常性遇到网站无法打开&#xff0c;或者打开速度非常慢&#xff0c;为了彻底解决稳定问题&#xff0c;唯有更换服务器空间&…

jar 工程我怎么在网页上url访问某一个方法_url及url参数与seo网站优化的关系

短视频&#xff0c;自媒体&#xff0c;达人种草一站服务首先我还是援引下百度百科关于url的定义。统一资源定位符(Uniform Resource Locator&#xff0c;缩写为URL)是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示&#xff0c;是互联网上标准资源的地址。互联网…

网博士自助建站系统_自助建站的优缺点介绍

自助建站我想大家都不陌生了&#xff0c;如果还不知道自助建站是什么的同学可以去小编之前的文章看看&#xff0c;有简单的介绍。话说回来&#xff0c;虽然自助建站越来越普及了&#xff0c;但是很多企业的老板并不知道自助建站到底和传统建站有什么区别&#xff1f;目前为止&a…

说说建站那些事

建站的初衷 我之前一直在CSDN上写博客(CSDN博客主页)&#xff0c;写了四年。后来认为一个热爱写作的程序猿应该要有一个自己独立站点&#xff0c;于是就有了自己建站的想法。由于建立个人博客站点有下面优点&#xff1a; 能很多其它地了解站点在互联网上执行的主要过程。自定义…

seo说_百度指数看世间沉浮_如何快速排名-互点快速排名_网站关键词排名常见问题 - 搜狗快速排名...

超级排名系统&#xff0c;网站关键词快速排名优化&#xff0c;7-15天关键词排名到首页&#xff0c;PC端和移动端都可以优化&#xff0c;支持百度、搜狗、360、神马等主流搜索引擎。作为SEO人员,当我们在做SEO优化过程中经常会遇到很多问题&#xff0c;需要我们注意的细节也有很…

手机b站封面提取网站_手机b站封面自定义图片大全及获取bilibili视频封面提取网站网址...

B站的封面一直是每个玩B站的up主都十分重视的一环&#xff0c;可是这些封面都是需要自己进行设计的&#xff0c;如果你没有这方面的能力&#xff0c;那么就很难设计出具有美感或者吸引力的封面来了&#xff0c;既然这种方式不行&#xff0c;那么我们就只能采用拿来主义&#xf…

查看JAVA源码的网站

为什么80%的码农都做不了架构师&#xff1f;>>> http://grepcode.com/search?queryUncategorized&start0&entitytype&n 转载于:https://my.oschina.net/monroe/blog/913057

当程序员去相亲网站...... | 每日趣闻

程序员说&#xff1a;“我去交友网站找女朋友去了。”朋友问&#xff1a;“找到了么&#xff1f;”程序员说&#xff1a;“找到了他们网站上的一个Bug……”《原力计划【第二季】- 学习力挑战》正式开始即日起至 3月21日千万流量支持原创作者更有专属【勋章】等你来挑战热 文 推…

Internet Explorer7.0仿冒网站筛选功能的使用

作者:许本新现在是信息时代&#xff0c;互联网是现今人们不可缺少的一种通信和办公工具&#xff0c;但同时互联网上又充满了风险&#xff0c;不仅有名目繁多的病毒、蠕虫和木马程序&#xff0c;还有大量用于窃取个人信息的钓鱼网站和恶意网站。通过各种媒体的长期宣传&#xff…

1、常用资源网站

2019独角兽企业重金招聘Python工程师标准>>> 1、CoreData/SQLite资料http://www.cnblogs.com/kenshincui/p/4077833.html#CoreData 2、ShareSDK各社交平台申请APPkey 的网址及申请流程汇总http://bbs.mob.com/forum.php?modviewthread&tid275&page1&ex…

Slog42_支配vue框架初阶项目之博客网站-单页-默认头像的布局和定位

ArthurSlogSLog-42Year1GuangzhouChinaAug 19th 2018GitHub掘金主页简书主页segmentfault从业之路不同 机缘也不同 人生轨迹由机缘组成 想要有什么样的机缘 也就明白了自己要走的路 开发环境MacOS(High Sierra 10.13.5) 需要的信息和信息源&#xff1a; css 元素框的类型HTML D…

分析手机网站的优势思维结构图_写了100多篇原创文章,我常用的在线工具网站推荐给大家...

摘要不知不觉写博客已经一年多了&#xff0c;累计写了100多篇原创文章&#xff0c;今天给大家分享下我经常使用的在线工具网站&#xff0c;希望对大家有所帮助&#xff01;Markdown Nice支持自定义样式的在线Markdown编辑器&#xff0c;编辑完成后可以一键复制富文本到微信公众…

文科出身敲出 Instagram,被小札“挤”走,建新冠追踪网站,这个程序员有点牛!...

作者 | 年素清责编 | 伍杏玲出品 | 程序人生&#xff08;ID&#xff1a;coder_life&#xff09; Instagram以滤镜和图片质量为核心&#xff0c;是全球最火的在线图片及视频分享的社交应用软件之一&#xff0c;而Instagram也是硅谷的一个传奇。说起来你可能不信&#xff0c;这个…