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>

 

 

 

posted @ 2020-05-10 23:13  不会飞的鲨鱼  阅读(931)  评论(0编辑  收藏  举报