用户组的Flask Route Prefix

时间:2014-09-18 15:13:15

标签: python flask

我有一个具有多个用户角色的烧瓶应用程序。所有角色都需要访问“索引”页面,但每个角色的页面都不同。为了实现这一点,我认为最好的解决方案是为某些用户角色添加前缀。例如,管理员角色将转到http://admin.myapp.com/index,合作伙伴将转到http://partner.myapp.com/

我已经看到了一些关于如何为所有视图添加路由前缀的信息,但我只希望它基于用户的角色。实现这一目标的最佳方法是什么?任何人都能帮我推动正确的方向吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我的建议是

您不必担心域名前缀来解决此问题。

显然,您将拥有useruser相关字段的模型。添加role作为user model

的字段之一

models.py

中的用户模型
class User(db.Model):
      ..........
      ..........
      role = db.Column(db.String(50)) #admin, customer, agent etc..

views.py

@app.route('/index' methods=('GET','POST'))
@login_required
def index_view():
   #get the current logged in user object
   user = current_user or g.user #based on your way of implementation
   if user.role == 'admin':
       return render_to_response('admin_index.html',{'data':'This is admin page'})
   elif user.role == 'agent':
       return render_to_response('agent_index.html',{'data':'This is agent page'})
   else:
       return render_to_response('default_index.html',{'data':'This is default page'})

在这里,您应该添加login_required装饰器,以确保在访问此user之前登录view method

其他信息:

如果您希望将此view method限制为特定user roles,则可以编写@roles_required装饰器,其输入为allowed_roles并基于此返回

roles_required装饰器实施概述

def roles_required(func):
    def wrapper(*args, **kwargs):
        for i in args:
            user = current_user #get user object
            if user.role == i:
                return func()
    return wrapper

在您实施roles_required后,在为view

添加@login_required时添加相应的def index_view()方法
@roles_required('admin','agent')