每个公司的每个分支机构都有自己的仪表板。用户访问其分支的仪表板(但/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 方法的参数中包含公司、分支