0
在龍捲風中使用get_secure_cookie()重定向時遇到問題。Tornado get_secure_cookie()間歇性返回值
似乎get_current_user()方法被多次調用,並通過self.get_secure_cookie("userid")
間歇性地找到可用數據。
下面的代碼讓我們我參觀登錄後保護的頁面,但不會正確重定向:
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
username, self._user_perms = database.get_user_info(int(self.get_secure_cookie("userid") or 0))
log.warning("WE HAVE A USERID %r and username: %r", self.get_secure_cookie("userid"), username)
if self._user_perms: return username # If perms==0, the user has been banned, and should be treated as not-logged-in.
,並在輸出日誌:
2015-02-24 14:37:36,399:WARNING:__main__:WE HAVE A USERID None and username: None
2015-02-24 14:37:36,412:WARNING:__main__:WE HAVE A USERID None and username: None
2015-02-24 14:37:36,412:WARNING:__main__:WE GO: u'/submit' AS None
2015-02-24 14:37:36,413:WARNING:__main__:WE HAVE A USERID None and username: None
2015-02-24 14:37:36,425:WARNING:__main__:WE HAVE A USERID None and username: None
2015-02-24 14:37:38,723:WARNING:__main__:WE HAVE A USERID '2' and username: u'My Name'
登錄等級如下表所示:
class Login(BaseHandler):
def get(self):
form = UserForm()
username = self.get_current_user()
if self.get_current_user():
self.redirect(self.get_argument('next', '/')) # Change this line
return
else:
self.write(templates.load("login.html").generate(compiled=compiled, form=form, \
errormessage=errormessage, user_name=self.current_user))
def post(self):
form = UserForm(self.request.arguments)
if form.validate():
user_id = database.verify_user(self.get_argument('email'),\
self.get_argument('password'))
if user_id:
user_name, perms = database.get_user_info(user_id)
if perms: self.set_secure_cookie("userid", str(user_id))
self.redirect(self.get_argument("next", "/"))
else:
notice = "LOGIN FAILED. PLEASE TRY AGAIN."
self.write(templates.load("login.html").generate(compiled=compiled, form=form, \
notice=notice, user_name=self.current_user))
else:
self.set_status(400)
self.write(form.errors)
我想也許這需要一些時間讓secure_cookie成爲accessi並嘗試在相同的(更慢)結果中扔出time.sleep(2)
。
我還沒有看到什麼?
UPDATE:
如下所述,什麼落得這樣做的伎倆是:
在templates/login.html
:
<input type="hidden" name="next" value="{{ next }}" />
在tornado app
:
#within the Login(BaseHandler) class
self.write(templates.load("login.html").generate(compiled=compiled, form=form, next=self.get_argument('next', "/"),
errormessage=errormessage, user_name=self.current_user, notice=notice))