所以我正在创建一个简单的网站,允许两种类型的用户。管理员和普通用户。我有一个名为" User"它有一个属性" isUser"。然后我有一个路线呼叫" addMovie"它接受一个参数" isUser"检查当前用户是否有权添加电影。我该如何检查?截至目前,我的用户将该属性设置为"是"仍然可以添加电影。
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(120))
last_name = db.Column(db.String(120))
email = db.Column(db.String(180), unique=True)
password = db.Column(db.String(255))
isUser = db.Column(db.String(10))
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,backref=db.backref('users', lazy='dynamic'))
@app.route('/addMovie/<isUser>', methods=['GET', 'POST'])
@login_required
def addMovie(isUser):
error = None
if(isUser == "Yes"):
error = "You must have Admin Privaledges to add a Movie/TV Show"
return redirect(url_for('index'))
else:
return render_template('addMovie.html', error=error)
答案 0 :(得分:2)
我假设你正在使用Flask-Login
。你试过current_user吗?
然后您可以检查当前登录的用户是否是管理员。最后调用此方法,其中需要管理功能。
from flask_login import current_user, login_required, LoginManager
@login_manager.user_loader
def load_user(id):
return User.query.get(int(id))
def require_admin():
if current_user.isUser:
abort(403)
@app.errorhandler(403)
def error_access_forbidden(error):
error_code = 403
error_message = "Sorry, access denied or forbidden!"
return render_template('4xx.html',
error_code = error_code,
error_message=error_message), 403
@app.route('/addMovie', methods=['GET', 'POST'])
@login_required
def addMovie():
require_admin()
error = None
return render_template('addMovie.html', error=error)
4xx.html
模板可能会显示错误代码,错误消息和重定向链接。这是处理HTTP错误的正确方法。您也可以实现其他HTTP错误。
以下是我使用过某个项目的示例错误页面:
答案 1 :(得分:0)
一旦你重新考虑你的Model类就会很好......
class User(db.Model, UserMixin)
is_admin = db.Column(db.Boolean(default=False))
不知何故,您必须在视图函数中获取user
对象。如果您正在使用Flask-login
from flask_login import current_user
if current_user.is_admin:
return render_template('addMovie.html')
else:
flash('You must have Admin Privaledges to add a Movie/TV Show')
return redirect(url_for('index')
或者只是获取对象ID
@app.route('/addMovie/<userid>', methods=['GET', 'POST'])
@login_required
def addMovie(userid):
user = User.query.filter(id=userid).first()
答案 2 :(得分:0)
以下是一些需要改变以使其更加pythonic的事情:
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(120))
last_name = db.Column(db.String(120))
email = db.Column(db.String(180), unique=True)
password = db.Column(db.String(255))
is_admin = db.Column(db.Boolean(), default=False)
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,backref=db.backref('users', lazy='dynamic'))
@app.route('/addMovie/<user_id:int>', methods=['GET', 'POST'])
@admin_required
@login_required
def addMovie(user_id):
user = db.session.query(User).get(user_id)
return render_template('addMovie.html', user=user)
def admin_required(f):
def decorated(*args, **kwargs):
if not g.user.is_admin:
return redirect(url_for('index'))
return f(*args, **kwargs)
return decorated
当您使用Flask的loging_required
装饰器时,您可以编写自己的admin_required
并用它包装您的视图。它应检查您的用户是否有权添加文件,如果没有,则将其重定向到index
页面。另外,我已将您的数据库字段更改为Boolean
类型,因为它更方便。
P.S。这个代码段未经过测试,可能包含一些错误,但您已经有了这个想法,对吧?