2015-02-24 84 views
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)) 

回答

1

它看起來像'next'參數沒有通過t他形成。您需要將其傳遞給login.html表單,然後將其傳回,例如使用隱藏的輸入元素。然後它將在POST端點中可用。