如何将用户属性传递给python函数/路由 - Flask

时间:2017-11-07 06:42:25

标签: python flask flask-security

所以我正在创建一个简单的网站,允许两种类型的用户。管理员和普通用户。我有一个名为" 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)

3 个答案:

答案 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错误。

以下是我使用过某个项目的示例错误页面:

error_404_demo

答案 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。这个代码段未经过测试,可能包含一些错误,但您已经有了这个想法,对吧?