python login tornado login-script

python - Tornado login Ejemplos/Tutoriales



login-script (2)

Aquí hay un controlador de ejemplo simple, que necesita una plantilla login.html que contenga un formulario de nombre de usuario / contraseña. No tengo un ejemplo de registro, pero es bastante similar, en la publicación usted valida la entrada e inserta el registro de usuario en lugar de la autenticación.

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)

Me preguntaba si alguien conoce algún código de ejemplo o tutoriales sobre cómo implementar una página de inicio de sesión / registro en Tornado? He visto los ejemplos que vienen con él, pero parecen muy centrados en facebook / oauth.


Comencé a usar el ejemplo de Cole, pero me di cuenta de que estaba creando una cuenta para acceder a la base de datos, lo que podría no ser lo mismo que una cuenta para nuestra aplicación web.

He cambiado el ejemplo anterior para usar bcrpyt. Ahora, la conexión de un usuario a nuestra aplicación web es diferente de la conexión de nuestra aplicación web a la base de datos. Mi aplicación de muestra en github

Nota: bcrpyt es computacionalmente pesado y bloqueará el bucle IO

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")