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>