用戶驗證
用戶驗證是指在收到用戶請求後進行處理前先判斷用戶的認證狀態(如登陸狀態),若通過驗證則正常處理,否則強制用戶跳轉至認證頁面(如登陸頁面)。
authenticated裝飾器
爲了使用Tornado的認證功能,我們需要對登錄用戶標記具體的處理函數。我們可以使用@tornado.web.authenticated裝飾器完成它。當我們使用這個裝飾器包裹一個處理方法時,Tornado將確保這個方法的主體只有在合法的用戶被發現時纔會調用。
class ProfileHandler(RequestHandler):
@tornado.web.authenticated
def get(self):
self.write("這是我的個人主頁。")
get_current_user()方法
裝飾器@tornado.web.authenticated的判斷執行依賴於請求處理類中的self.current_user屬性,如果current_user值爲假(None、False、0、""等),任何GET或HEAD請求都將把訪客重定向到應用設置中login_url指定的URL,而非法用戶的POST請求將返回一個帶有403(Forbidden)狀態的HTTP響應。
在獲取self.current_user屬性的時候,tornado會調用get_current_user()方法來返回current_user的值。也就是說,我們驗證用戶的邏輯應寫在get_current_user()方法中,若該方法返回非假值則驗證通過,否則驗證失敗。
class ProfileHandler(RequestHandler):
def get_current_user(self):
"""在此完成用戶的認證邏輯"""
user_name = self.get_argument("name", None)
return user_name
@tornado.web.authenticated
def get(self):
self.write("這是我的個人主頁。")
login_url設置
當用戶驗證失敗時,將用戶重定向到login_url上,所以我們還需要在Application中配置login_url。
class LoginHandler(RequestHandler):
def get(self):
"""在此返回登陸頁面"""
self.write("登陸頁面")
app = tornado.web.Application(
[
(r"/", IndexHandler),
(r"/profile", ProfileHandler),
(r"/login", LoginHandler),
],
"login_url":"/login"
)
想一想,完成登陸操作後應該進入哪個頁面?
在login_url後面補充的next參數就是記錄的跳轉至登錄頁面前的所在位置,所以我們可以使用next參數來完成登陸後的跳轉。
修改登陸邏輯:
class LoginHandler(RequestHandler):
def get(self):
"""登陸處理,完成登陸後跳轉回前一頁面"""
next = self.get_argument("next", "/")
self.redirect(next+"?name=logined")
用戶訪問的網址順序: