首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Tornado登录示例/教程

Tornado登录示例/教程
EN

Stack Overflow用户
提问于 2011-06-29 09:13:54
回答 2查看 27.4K关注 0票数 20

我想知道是否有人知道在Tornado中实现登录/注册页面的示例代码或教程?我看过它附带的示例,但它们似乎非常以facebook/oauth为中心。

EN

回答 2

Stack Overflow用户

发布于 2011-06-29 17:33:06

下面是一个简单的示例处理程序,它需要一个包含用户名/密码表单的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)
票数 33
EN

Stack Overflow用户

发布于 2012-04-19 01:21:03

我开始使用Cole的例子,但意识到我正在创建一个用于访问数据库的帐户,这可能与我们的was应用程序的帐户不是一回事。

我已经将上面的示例更改为使用bcrpyt。现在,用户到我们的webapp的连接不同于我们的webapp到数据库的连接。My sample app on github

注意: bcrpyt计算量很大,会阻塞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")
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6514783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档