簡單介紹
再搭建網站時經常會遇到用戶認證這種情況,而tornado在用戶認證這一塊的設計讓開發者用起來非常的便捷具體做法需要三步:
1.定義基類,獲得current_user的值
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
return self.get_secure_cookie("username")
2.保存內容到cookie
class LoginHandler(BaseHandler):
def get(self):
self.render('login.html')
def post(self):
self.set_secure_cookie("username", self.get_argument("username"))
self.redirect("/")
3.在應用的函數中添加@tornado.web.authenticated
class WelcomeHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
self.render('index.html', user=self.current_user)
整個工作的流程如下:
當調用應用WelcomeHandler時, @tornado.web.authenticated會檢查current_usr屬性的值,如果current_user值爲假(None、False、0、”“),任何GET或HEAD請求都將把訪客重定向到應用設置中login_url指定的URL。如果current_user的值存在,那麼就會進行get請求。
SAE tornado中出現的問題
ps:測試的tornado爲sae默認的2.1
<h4>出錯了<h4>
1.將如上代碼貼到sae,當用戶登錄後,會重定向到歡迎頁面,此時當我們不斷的刷新歡迎頁面,大概刷新幾次後頁面就會重定向到登錄頁面了。而此時瀏覽器中的cookie也保存了username。
2.好奇怪,爲什麼刷新了幾次後又識別不了呢?然後我們不登錄,再去請求歡迎頁面。這時候奇怪的事情又出現了。這下子又可以請求了。
3.然後不斷的重複刷新歡迎頁面,刷新幾次後又重定向到登錄頁面了,再多次請求歡迎頁面,終會成功的請求。
分析:
首先我們的代碼沒問題,放到本地運行好好的放到SAE就有問題了,難道是我用錯方式了.因爲sae有兩種搭建tornado應用的方式,即tornado worke 和WSGI。因爲SAE 中有說tornado worket 不穩定,要冒險使用。於是我又換成WSGI試了一遍。
然後我們只能懷疑SAE的問題了。於是乎我把上面例子中的set_secure_cookie ,get_secure_cookie 全部換成了get_cookie,set_cookie。然後再去重複上面的操作,這下就不會重定向了。
然後問了sae PYTHON 的版主,得到了如下答覆:
原來是sae的的問題。
好吧,這個我們就沒辦法了。。。
後記
cookie是基於session的,即打開瀏覽器設置cookie後,只要不關閉瀏覽器cookie會一直保存,關閉瀏覽器後cookie刪除,其實就是保存在瀏覽器運行進程的那塊內存中。secure_cookie是保存在硬盤中的cookie,過期時間爲一個月,所以一旦設置secure_cookie後,不論瀏覽器關閉與否,只要不清空cookie,這個值就一直保存直到cookie過期失效。
如果這樣的華用set_cookie 保存cookie 那麼用戶不是要經常請求登錄麼?
我在sae上換個tornado3.1試試怎麼樣?結果還是一樣! 希望再sae上用tornado的人們能看到這篇文章,大家少走彎路就好。