cookie
在上节课,我们简单了解了登录过程,但是很明显,每次都需要登录,但是在平常逛网站的只需要登录一次,那么网站是如何记录登录信息的呢?
有没有什么办法可以让浏览器记住登录信息,下次再次打开的时候,可以自动登录呢?
设置cookie与获取cookie
import sys import time import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options from tornado.web import RequestHandler from tornado.options import define,options import util.ui_modules import util.ui_methods # import time from data.connect import session from data.user_modules import UserDetails, User define('port',default=8080,help='run server',type=int) class MainHandler(RequestHandler): def get(self): self.write('cookie') self.set_cookie('cookie_test','aqweqwas') self.set_cookie('cookie_test2','aqweqwas2',expires=time.time()+60) #设置过期时间 self.set_cookie('cookie_test3','aqweqwas3',expires_days=1) #设置过期天数 self.set_cookie('cookie_test4','aqweqwas4',path='/') #设置cookie路径 self.set_cookie('cookie_test5','aqweqwas5',httponly=True) #设置后js代码获取不到此cookie值 self.set_cookie('cookie_test6','aqweqwas6',max_age=120,expires=time.time()+60) #设置过期时间max_age的优先级大于expires self.set_secure_cookie('cookie_test7','aqweqwas7',max_age=120,expires=time.time()+60) #设置加密cookies class GetHandler(RequestHandler): def get(self): self.write('get_cookie') self.write('<br>') cookie_name = self.get_cookie('cookie_test4') cookie_name2 = self.get_secure_cookie('cookie_test7') self.write(cookie_name) self.write('<br>') self.write(cookie_name2) application = tornado.web.Application( handlers=[ (r'/',MainHandler), (r'/get',GetHandler), ], debug=True, template_path = 'templates', static_path='static', # autoescape = None, #全局取消转义 ui_methods=util.ui_methods, ui_modules=util.ui_modules, cookie_secret ='qwe123', #cookie加盐 ) if __name__ == '__main__': tornado.options.parse_command_line() http_server = tornado.httpserver.HTTPServer(application) http_server.listen(options.port) tornado.ioloop.IOLoop.current().start()
登录验证:
第一步:导入装饰器
from tornado.web import authenticated
第二步:声明 BaseHandler
class BaseHandler(RequestHandler): def get_current_user(self): current_user = self.get_secure_cookie('user_ID') if current_user: return current_user return None
第三步:配置登录路由
login_url = '/login'
第四步:装饰需要验证的请求
class BuyHandler(BaseHandler): @authenticated def get(self): self.write('嗨,小可爱!')
在完成登录之后,再来看看,我们从一个路由跳转到登录页面之后,再完成登录之后,该如何跳转到之前的页面呢?
第一步:获取之前路由
class LoginHandler(BaseHandler): def get(self): next_name = self.get_argument('next','') self.render('in_out.html',nextname=next_name)
在使用 authenticated 之后,如果验证不成功,会自动跳转到登录路由,并且在 URL 后面加上 next 参数,next 参数的参数值就是之前的路由
第二步:修改模板文件
<form method="post" action="/login?next={{ nextname }}">
在模板中添加 next 参数,并且参数值为之前的路由
第三步:修改post方法
def post(self): '''验证逻辑''' user = self.get_argument('name',None) password = self.get_argument('password',None) next_name = self.get_argument('next','') print(next_name) # username = session.query(User).filter(User.username == user).first() username = User.get_name(user) print(username) if username and password == username.password: #如果判断用户可以登录,我们设置这样一个加密的cookie进去 self.set_secure_cookie('user_ID',user) self.redirect(next_name) else: self.write('登录失败')
获取之前的页面的路由
当登录验证通过之后,设置加密的 cookie ,并跳转到之前的路由
完整的python代码与模板html代码如下:
import sys import time import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options from tornado.web import RequestHandler,authenticated from tornado.options import define,options import util.ui_modules import util.ui_methods # import time from data.connect import session from data.user_modules import UserDetails, User define('port',default=8080,help='run server',type=int) class BaseHandler(RequestHandler): def get_current_user(self): current_user = self.get_secure_cookie('user_ID') if current_user: return current_user return None class BuyHandler(BaseHandler): @authenticated def get(self): self.write('嗨,小可爱!') #第一,如果有参数next,肯定是没登录的时候 #没登录,会跳转到/login,app里面设置的 #在login里面,form表单没提交之前,get里面获取一下这个值 #在获取出来之后,吧这个值传到post请求里面 #post获取这个值,此值就是一个url #直接跳转到此url class LoginHandler(BaseHandler): def get(self): next_name = self.get_argument('next','') self.render('in_out.html',nextname=next_name) def post(self): '''验证逻辑''' user = self.get_argument('name',None) password = self.get_argument('password',None) next_name = self.get_argument('next','') print(next_name) # username = session.query(User).filter(User.username == user).first() username = User.get_name(user) print(username) if username and password == username.password: #如果判断用户可以登录,我们设置这样一个加密的cookie进去 self.set_secure_cookie('user_ID',user) self.redirect(next_name) else: self.write('登录失败') application = tornado.web.Application( handlers=[ (r'/buy',BuyHandler), (r'/login',LoginHandler), ], debug=True, template_path = 'templates', static_path='static', # autoescape = None, #全局取消转义 ui_methods=util.ui_methods, ui_modules=util.ui_modules, cookie_secret ='qwe123', #cookie加盐 login_url = '/login' ) if __name__ == '__main__': tornado.options.parse_command_line() http_server = tornado.httpserver.HTTPServer(application) http_server.listen(options.port) tornado.ioloop.IOLoop.current().start()
in_out.html代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>tornado</title> </head> <body> <form method="post" action="/login?next={{ nextname }}"> <p>用户名<input type="text" name="name"></p> <p>密码<input type="password" name="password"></p> <input type="submit"> </form> </body> </html>