tonrnado之用戶登錄驗證

  • 用戶登錄,輸入用戶名和密碼與數據庫的用戶名和密碼做對比,正確的話登錄成功,否則提示用戶名和密碼錯誤
  • 保持會話cookie保證已經實現、數據庫的操作已經實現好session會話
  • 用戶登入驗證,我們希望用戶只需要在第一次登錄的時候輸入用戶名和密碼,之後可以自動登錄,不需要再次輸入用戶名和密碼,也就是說在用戶第二次訪問的時候,服務器能夠自動的驗證用戶登錄信息,那麼如何實現自動驗證的功能呢?
  • 第一步:導入裝飾器
 from tornado.web import authenticated
  • 第二步:聲明 BaseHandler,重寫get_current_user()方法
class BaseHandler(tornado.web.RequestHandler):
    def get_current_user(self):
        current_user = self.get_secure_cookie('username')
        if current_user:
            return current_user
        return None
  • 第三步:配置登錄路由
def make_app():
    return tornado.web.Application(
        handlers = [
        (r"/main", MainHandler),
        (r"/cook_set", Set_cookieHandler),
        (r"/cook_get", get_cookieHandler),
        (r"/buy", BuyHandler),
    ],
    template_path = 'templates',
    debug= True,
    login_url = '/main',        #主要是這段代碼
    cookie_secret = 'aasdafsafsdfjfk',
    )
  • 第四步:裝飾需要驗證的請求
class BuyHandler(BaseHandler):
    @authenticated      #裝飾器authenticated 
    def get(self):
        self.write('BuyHandler')

具體代碼
- login.py

import  tornado.ioloop
import  tornado.web
import tornado.options   #讓模塊有自定義的模塊
from tornado.options import define,options
import tornado.httpserver  #啓動單線程的http服務
import time
from user_modules import User
from tornado.web import authenticated


define('port',default=8080, help='run port', type=int)  #help

class BaseHandler(tornado.web.RequestHandler):
    def get_current_user(self):
        current_user = self.get_secure_cookie('username')
        if current_user:
            return current_user
        return None

class Set_cookieHandler(tornado.web.RequestHandler):
    def get(self):
        self.set_cookie('cook1','this_is_cook1')
        self.set_cookie('cook2','this_is_cook2',expires_days=1)
        self.set_cookie('cook3','this_is_cook3',expires=time.time()+(30))
        self.set_secure_cookie('cook6','this_is_secure_cook6')
        self.write('cook test')


class get_cookieHandler(tornado.web.RequestHandler):
    def get(self):
        c1 = self.get_cookie('cook1')
        self.write(c1)
        self.write('<br>')
        c2 = self.get_cookie('cook2')
        self.write(str(c2))
        c6 = self.get_secure_cookie('cook6')
        self.write('<br>')
        self.write('cook6')



class MainHandler(tornado.web.RequestHandler):
    def get(self):
        next = self.get_argument('next','None')
        print(next)
        self.render('test.html',nextname = next ,error=None)

    def post(self, *args, **kwargs):
        name = self.get_argument('name', 'OK')
        # user = session.query(User).filter(User.username==name).first()   #第一種方式
        user = User.by_name(name)
        passwd = self.get_argument('password', 'None')
        next = self.get_argument('next','None')

        if user and passwd==user.password:
            self.set_secure_cookie('username',name)

            # self.render('07base.html',
            #             username = name
            #             )
            self.redirect(next)
        else:
            # self.write('用戶名或者密碼錯誤')
            self.render('test.html',next='/main',error='用戶名或者密碼錯誤,請重新登入')

class BuyHandler(BaseHandler):
    @authenticated
    def get(self):
        self.write('BuyHandler')

def make_app():
    return tornado.web.Application(
        handlers = [
        (r"/main", MainHandler),
        (r"/cook_set", Set_cookieHandler),
        (r"/cook_get", get_cookieHandler),
        (r"/buy", BuyHandler),
    ],
    template_path = 'templates',
    debug= True,
    login_url = '/main',
    cookie_secret = 'aasdafsafsdfjfk',
    )

if __name__=='__main__':
    tornado.options.parse_command_line()   #sys.argv
    app = make_app()
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()
  • test.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>tornado</title>
</head>
<body>
{% if error %}
    {{ error }}
{% end %}
測試
<form method="post" action="/main?next={{ nextname }}">
    <p>用戶名<br><input  type="text" name="name"></p>
    <p>密碼<br><input  type="password" name="password"></p>
    <input type="submit">
</form>
</body>
</html>

orm 操作補充:
session.query(User.username).filter(User.username!=’budong’).all() 先用 all 查看所有的數據

session.query(User.username).filter(User.username!=’budong’).limit(2).all() limit 查看前兩條數據

session.query(User.username).filter(User.username!=’budong’).offset(1).all() offset 偏移一條記錄

session.query(User.username).filter(User.username!=’budong’).slice(1,3).all()
slice 對查詢出來的數據進行切片取值

session.query(User.username).filter(User.username==’tuple’).one() one 查詢一條數據,如果存在多條則報錯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章