0

每个公司的每个分支机构都有自己的仪表板。用户访问其分支的仪表板(但/dashboard/<company>/<branch>/login如果他们未登录,则会被重定向到)。

这意味着我将有很多处理程序,其中包含<company>/<branch>例如:

_auth_routes = [
    RedirectRoute('/dashboard/<company>/<branch>/signup', SignupHandler, name="user-signup", strict_slash=True),
    RedirectRoute('/dashboard/<company>/<branch>/<type:v|p>/<user_id:\d+>-<signup_token:.+>',
                  handler=VerificationHandler, name='verification', strict_slash=True),
    RedirectRoute('/dashboard/<company>/<branch>/password', SetPasswordHandler),
    RedirectRoute('/dashboard/<company>/<branch>/login', LoginHandler, name='login'),
    RedirectRoute('/dashboard/<company>/<branch>/logout', LogoutHandler, name='logout'),
    RedirectRoute('/dashboard/<company>/<branch>/forgot', ForgotPasswordHandler, name='forgot'),
    RedirectRoute('/dashboard/<company>/<branch>/authenticated', AuthenticatedHandler, name='authenticated')
]

然后每个处理程序都需要 get(company, branch, ..) 和 post(company, branch, ..)

此外,大多数方法都需要使用以下装饰器进行装饰。

def user_and_company_and_branch_required(handler):
    def check_company(self, company, branch, *args, **kwargs):
        auth = self.auth
        if not auth.get_user_by_session():
            self.redirect(self.uri_for('login', company=company,
                                               branch=branch), abort=True)
        elif company != self.user_info['company_name']:
            self.redirect(self.uri_for('login', company=company,
                                        branch=branch), abort=True)
        elif branch != self.user_info['branch_name']:
            self.redirect(self.uri_for('login', company=company,
                                        branch=branch), abort=True)
        else:
            return handler(self, company, *args, **kwargs)

    return check_company

最后,每次我使用 self.uri_for 时,我都需要添加公司和分支机构。

我想抽象出公司和分支机构,这样我就不必到处打字了。

我正在考虑制作第二个 basehandler:

class BaseHandler2(BaseHandler):
    def get(self,company, branch):
        #sget meaning secure_get
        sget = user_and_company_and_branch_required(self.sget)
        sget(self)
    def post(self,company, branch):
        spost = user_and_company_and_branch_required(self.spost)
        spost(self)

用法:

class LoginHandler(BaseHandler2):
     def get():
         self.render_template("login_form.html")

class SecureDashboardHanlder(BaseHandler2):
     def sget():
         self.render_template("this is the secure page
                               for your company & username &branch")

这会是解决此类问题的推荐架构吗?

其他选项可能是以某种方式使用 app.yaml 正则表达式,或自定义路由器类?

请注意,用户在 user_attributes 下有一个 company_name 和 branch_name:

config = {
    'webapp2_extras.auth': {
        'user_model': 'dashboard_auth_models.User',
        'user_attributes': ['name', 'company_name']
    },
    'webapp2_extras.sessions': {
        'secret_key': 'f02fajgt9a309ga30gfbnxz252mn3b459082'
    }
}

或者也许在任何地方都使用装饰器会更好?并在每个处理程序的 get 和 post 方法的参数中包含公司、分支

4

0 回答 0