當然今天講的驗證,不只Tornado會用,以后用到web框架都會用到,最常見的場景就是只有用戶登陸了才能執行某些操作,所以在執行這些操作前要先做登陸狀態的驗證。
比如:點贊,發布,評論等需要驗證,都需要用到if self.session【‘is_login’】進行判斷,你可能覺得,這代碼也不多啊,不過一旦網站大了,場景多了,可以寫到你手抽筋,其實我們可以在執行post方法或get方法之前進行登陸狀態的驗證,用裝飾器進行這么一個功能擴充就可以了
decrator.py
#處理刷新頁面的請求 def auth_login_redirect(func): def inner(self,*args,**kwargs): if not self.session['is_login']: #沒登錄,就讓跳到登陸頁面 self.redirect(config.LOGIN_URL) return #執行post方法或get方法 func(self,*args,**kwargs) return inner #處理ajax請求,往往需要返回一段json字符串 def auth_login_json(func): def inner(self,*args,**kwargs): if not self.session['is_login']: #當is_login為False時,沒登錄 rep = BaseResponse() #前端根據這個信息,來確定是否彈出登錄注冊框 rep.summary = 'auth failed' self.write(json.dumps(rep.__dict__)) return #執行post方法或get方法 func(self,*args,**kwargs) return inner
對於auth_login_redirect方法,只要針對刷新頁面的請求,因為有些網站登錄注冊是一個頁面(比如京東),而且跳轉頁面鏈接定義在配置文件config里,以便修改(LOGIN_URL=‘/login’)
對auth_login_json方法針對偷偷發請求的,比如抽屜的登陸注冊是以彈出框的形式
后台對ajax請求是不能做跳轉處理的,即self.redirect對於ajax是無效的,只能前端js調用location.href,而self.redirect只普通請求(刷新頁面)才有效,比如form表單提交
應用:
class ManagerHandler(BaseRequestHandler): @decrator.auth_login_redirect def get(self): self.write('ok')