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>