tornado用戶登錄和認證


1.認證和安全

import tornado.ioloop
import tornado.web  # web應用api
from pycket.session import SessionMixin


class BaseHandler(tornado.web.RequestHandler, SessionMixin):
    '''
    實現用戶認證, 重寫 get_current_user() 方法來判斷當前用戶,比如可以基於cookie的值
    '''
    def get_current_user(self):
        return self.session.get('t_cookie')


class MainHandler(BaseHandler):
    '''
    如果存在cookie才會執行這個get請求,不存在就會跳轉到登錄頁面
    '''
    @tornado.web.authenticated
    def get(self):
        user = self.session.get('t_cookie')
        return self.write('歡迎{}'.format(user))


class FormsHandler(BaseHandler):
    def get(self):
        # user = self.get_cookie('t_cookie')
        # user = self.get_secure_cookie('t_cookie')
        user = self.session.get('t_cookie')
        return self.render('forms.html', user=user, e='')

    def post(self):
        username = self.get_argument('username', '')
        password = self.get_argument('password', '')
        if username and password:
            if username == '123' and password == '456':
                # self.set_cookie('t_cookie', username)  # 設置普通的cookie,鍵為t_cookie,值為username
                # self.set_secure_cookie('t_cookie', username)  # 設置加密的cookie,需要指定一個名為 cookie_secret 的密鑰
                self.session.set('t_cookie', username)  # 設置用戶session,保存到redis數據庫
                next = self.get_argument('next', '/')  # 獲取需登錄前一個頁面路由
                return self.redirect(next)  # 重定向到登錄前一個頁面

            else:
                return self.render('forms.html', e='用戶名或密碼錯誤', user='')

        else:
            return self.render('forms.html', e='用戶名或密碼不能為空', user='')


def make_app():
    return tornado.web.Application([  # tornado配置,靜態文件等
        (r"/", MainHandler),  # 配置路由
        (r"/f", FormsHandler),  # 配置路由

    ],
        debug=True,
        cookie_secret='sadhdjh',  # 設置cookie密鑰,隨便設置
        xsrf_cookies=True,  # 內置XSRF保護.
        pycket={
                'engine': 'redis',
                'storage': {
                    'host': '127.0.0.1',
                    'port': 6379,
                    'db_sessions': 10,
                    'max_connections': 2 ** 31,
                },
                'cookies': {
                    # 設置過期時間
                    'expires_days': 2,
                    # 'expires':None, #秒
                },
            },
        login_url='/f',  # 如果用戶沒有登錄, 用戶將會被重定向到這個頁面
        static_path='../static',  # 配置靜態文件路徑
        template_path='../template',  # 配置模板路徑
    )


if __name__ == "__main__":  # 只有在當前文件運行的時候才會執行
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()  # 開啟tornado服務
    

2.HTML頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄</title>
</head>
<body>
{% if e %}
<h3>{{ e }}</h3>
{% end %}
<br>

{% if user %}
    <h2>歡迎{{ user }}</h2>
{% else %}
    <form action="" method="post">
        {% module xsrf_form_html() %}   <!-- 跨站請求偽造(防護) -->
        賬號:<input type="text" name="username"><br>
        密碼:<input type="password" name="password"><br>
        <button type="submit">登錄</button>
    </form>

{% end %}

</body>
</html>

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM