當然今天講的驗證,不只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')
