authencated认证登录
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#coding:utf-8 import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web import time from tornado.options import define,options from data.sqlalchemy08 import User,session from tornado.web import authenticated define('port',default=8000,help='run port',type=int) define('version',default='0.0.1',help='version 0.0.1',type=str) def auth(fun): def wrapper(self,*agrs,**kwargs): id=self.get_secure_cookie('ID') if id: return fun(self,*args,**kwargs) else: self.redirect('/login') return auth class BaseHandeler(tornado.web.RequestHandler): def get_current_user(self): current_user=self.get_secure_cookie('ID') if current_user: return current_user else: return None class IndexHandler(BaseHandeler): #用auth装饰,可省去大量重复代码,在需要登录的地方调用就可以 # @auth #从写认证方法中的current_user # def get_current_user(self): # current_user = self.get_secure_cookie('ID') # if current_user: # return current_user # else: # return None #用tornado自带的认证,需在底部app设置加上登录界面login_url,否则报错,为了再次复用,写个父类 @authenticated # @tornado.web.authenticated def get(self): # id=self.get_secure_cookie('ID') # if id: # self.write('登录成功') # else: # self.redirect('/login') self.write('登录成功') class LoginHandler(BaseHandeler): def get(self): #self.render('08login.html', error=None) nextname=self.get_argument('next','') self.render('11authencated.html',nextname=nextname) def post(self): nextname = self.get_argument('next', '') username = User.by_name(self.get_argument('name', '')) passwd = self.get_argument('passwd', '') if username and username[0].passwd == passwd: self.set_secure_cookie('ID',username[0].username,max_age=100) self.write('登录成功-----') time.sleep(3) self.redirect(nextname) else: self.redirect('/login') if __name__ == "__main__": tornado.options.parse_command_line() # print(options.port) app=tornado.web.Application( handlers=[ (r'/index',IndexHandler), (r'/login',LoginHandler), ], template_path='templates', static_path='static', login_url='/login', debug=True, cookie_secret='aaa5555sssss' #autoescape=None, #关闭自动转义 全局的 ) #固定写法: http_server=tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form method="post" action="/login?next={{ nextname }}" >
用户名</br>
<input type="text" name="name" /><br>
<input type="text" name="passwd" /><br>
<input type="submit" value="提交">
</form>
</body>
</html>