各会社の各ブランチには、独自のダッシュボードがあります。ユーザーがブランチのダッシュボードにアクセスします (ただし、/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 を使用するたびに、会社と支店を追加する必要があります。
会社と支店を抽象化して、どこにでも入力する必要がないようにしたいと考えています。
2番目のベースハンドラーを作成することを検討しています:
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 メソッドへの引数に会社、分岐を含めます。