2011-06-29 16 views
18

मैं सोच रहा था कि अगर किसी को टोरनाडो में लॉगिन/साइनअप पेज को लागू करने के लिए किसी भी उदाहरण कोड या ट्यूटोरियल के बारे में पता है? मैंने उन उदाहरणों को देखा जो इसके साथ आते हैं, लेकिन वे बहुत फेसबुक/ओथ केंद्रित लगते हैं।टोरनाडो लॉगिन उदाहरण/ट्यूटोरियल

उत्तर

31

यहां एक साधारण उदाहरण हैडलर है, जिसे एक login.html टेम्पलेट की आवश्यकता है जिसमें उपयोगकर्ता नाम/पासवर्ड फॉर्म है। मेरे पास साइन अप उदाहरण नहीं है, लेकिन यह काफी समान है, पोस्ट पर आप इनपुट को मान्य करते हैं और प्रमाणीकरण के बजाए उपयोगकर्ता रिकॉर्ड डालते हैं।

class BaseHandler(tornado.web.RequestHandler): 

    def get_login_url(self): 
     return u"/login" 

    def get_current_user(self): 
     user_json = self.get_secure_cookie("user") 
     if user_json: 
      return tornado.escape.json_decode(user_json) 
     else: 
      return None 

class LoginHandler(BaseHandler): 

    def get(self): 
     self.render("login.html", next=self.get_argument("next","/")) 

    def post(self): 
     username = self.get_argument("username", "") 
     password = self.get_argument("password", "") 
     # The authenticate method should match a username and password 
     # to a username and password hash in the database users table. 
     # Implementation left as an exercise for the reader. 
     auth = self.db.authenticate(username, password) 
     if auth: 
      self.set_current_user(username) 
      self.redirect(self.get_argument("next", u"/")) 
     else: 
      error_msg = u"?error=" + tornado.escape.url_escape("Login incorrect.") 
      self.redirect(u"/login" + error_msg) 

    def set_current_user(self, user): 
     if user: 
      self.set_secure_cookie("user", tornado.escape.json_encode(user)) 
     else: 
      self.clear_cookie("user") 

class LogoutHandler(BaseHandler): 

    def get(self): 
     self.clear_cookie("user") 
     self.redirect(u"/login) 
11

मैं कोल उदाहरण का उपयोग शुरू किया, लेकिन महसूस किया कि मैं डेटाबेस है जो हमारे webapp के लिए एक खाते के रूप में एक ही बात नहीं हो सकता है तक पहुँचने के लिए एक खाता बनाने गया था।

मैंने उपरोक्त उदाहरण को bcrpyt का उपयोग करने के लिए बदल दिया है। अब हमारे वेबपैप का उपयोगकर्ता का कनेक्शन डेटाबेस के हमारे वेबैप के कनेक्शन से अलग है। My sample app on github

नोट: bcrpyt computationally भारी है और आईओ पाश

class BaseHandler(tornado.web.RequestHandler): 

    def get_login_url(self): 
    return u"/login" 

    def get_current_user(self): 
    user_json = self.get_secure_cookie("user") 
    if user_json: 
     return tornado.escape.json_decode(user_json) 
    else: 
     return None 


class LoginHandler(BaseHandler): 

    def get(self): 
    self.render("login.html", next=self.get_argument("next","/"), message=self.get_argument("error","")) 

    def post(self): 
    email = self.get_argument("email", "") 
    password = self.get_argument("password", "") 

    user = self.application.syncdb['users'].find_one({ 'user': email }) 

    if user and user['password'] and bcrypt.hashpw(password, user['password']) == user['password']: 
     self.set_current_user(email) 
     self.redirect("hello") 
    else: 
     error_msg = u"?error=" + tornado.escape.url_escape("Login incorrect.") 
     self.redirect(u"/login" + error_msg) 

    def set_current_user(self, user): 
    print "setting "+user 
    if user: 
     self.set_secure_cookie("user", tornado.escape.json_encode(user)) 
    else: 
     self.clear_cookie("user") 


class RegisterHandler(LoginHandler): 

    def get(self): 
    self.render( "register.html", next=self.get_argument("next","/")) 

    def post(self): 
    email = self.get_argument("email", "") 

    already_taken = self.application.syncdb['users'].find_one({ 'user': email }) 
    if already_taken: 
     error_msg = u"?error=" + tornado.escape.url_escape("Login name already taken") 
     self.redirect(u"/login" + error_msg) 


    password = self.get_argument("password", "") 
    hashed_pass = bcrypt.hashpw(password, bcrypt.gensalt(8)) 

    user = {} 
    user['user'] = email 
    user['password'] = hashed_pass 

    auth = self.application.syncdb['users'].save(user) 
    self.set_current_user(email) 

    self.redirect("hello") 
+0

हम्म अवरुद्ध कर देगा धन्यवाद unclearness वहाँ उनका कहना है के लिए .. मेरी उदाहरण में प्रमाणित विधि उन तालिका में एक उपयोगकर्ता देखने के लिए माना जाता है , और यदि पासवर्ड संग्रहीत हैश से मेल खाता है तो उपयोगकर्ता को वापस कर दें। मैं निश्चित रूप से एक नया डेटाबेस कनेक्शन स्थापित करने का मतलब नहीं था, जो पागल हो जाएगा। स्पष्टता के लिए अब अपडेट किया गया। –

+0

आपका यूआरएल "गिट हब पर मेरा नमूना ऐप" पृष्ठ देने में त्रुटि नहीं मिली ... क्या आप इसे अपडेट कर सकते हैं ...? – Shiva

+0

लिंक अपडेट किया गया। https://github.com/bootandy/tornado_sample –

संबंधित मुद्दे