- 用戶登錄,輸入用戶名和密碼與數據庫的用戶名和密碼做對比,正確的話登錄成功,否則提示用戶名和密碼錯誤
- 保持會話cookie保證已經實現、數據庫的操作已經實現好session會話
- 用戶登入驗證,我們希望用戶只需要在第一次登錄的時候輸入用戶名和密碼,之後可以自動登錄,不需要再次輸入用戶名和密碼,也就是說在用戶第二次訪問的時候,服務器能夠自動的驗證用戶登錄信息,那麼如何實現自動驗證的功能呢?
- 第一步:導入裝飾器
from tornado.web import authenticated
- 第二步:聲明 BaseHandler,重寫get_current_user()方法
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
current_user = self.get_secure_cookie('username')
if current_user:
return current_user
return None
- 第三步:配置登錄路由
def make_app():
return tornado.web.Application(
handlers = [
(r"/main", MainHandler),
(r"/cook_set", Set_cookieHandler),
(r"/cook_get", get_cookieHandler),
(r"/buy", BuyHandler),
],
template_path = 'templates',
debug= True,
login_url = '/main', #主要是這段代碼
cookie_secret = 'aasdafsafsdfjfk',
)
- 第四步:裝飾需要驗證的請求
class BuyHandler(BaseHandler):
@authenticated #裝飾器authenticated
def get(self):
self.write('BuyHandler')
具體代碼
- login.py
import tornado.ioloop
import tornado.web
import tornado.options #讓模塊有自定義的模塊
from tornado.options import define,options
import tornado.httpserver #啓動單線程的http服務
import time
from user_modules import User
from tornado.web import authenticated
define('port',default=8080, help='run port', type=int) #help
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
current_user = self.get_secure_cookie('username')
if current_user:
return current_user
return None
class Set_cookieHandler(tornado.web.RequestHandler):
def get(self):
self.set_cookie('cook1','this_is_cook1')
self.set_cookie('cook2','this_is_cook2',expires_days=1)
self.set_cookie('cook3','this_is_cook3',expires=time.time()+(30))
self.set_secure_cookie('cook6','this_is_secure_cook6')
self.write('cook test')
class get_cookieHandler(tornado.web.RequestHandler):
def get(self):
c1 = self.get_cookie('cook1')
self.write(c1)
self.write('<br>')
c2 = self.get_cookie('cook2')
self.write(str(c2))
c6 = self.get_secure_cookie('cook6')
self.write('<br>')
self.write('cook6')
class MainHandler(tornado.web.RequestHandler):
def get(self):
next = self.get_argument('next','None')
print(next)
self.render('test.html',nextname = next ,error=None)
def post(self, *args, **kwargs):
name = self.get_argument('name', 'OK')
# user = session.query(User).filter(User.username==name).first() #第一種方式
user = User.by_name(name)
passwd = self.get_argument('password', 'None')
next = self.get_argument('next','None')
if user and passwd==user.password:
self.set_secure_cookie('username',name)
# self.render('07base.html',
# username = name
# )
self.redirect(next)
else:
# self.write('用戶名或者密碼錯誤')
self.render('test.html',next='/main',error='用戶名或者密碼錯誤,請重新登入')
class BuyHandler(BaseHandler):
@authenticated
def get(self):
self.write('BuyHandler')
def make_app():
return tornado.web.Application(
handlers = [
(r"/main", MainHandler),
(r"/cook_set", Set_cookieHandler),
(r"/cook_get", get_cookieHandler),
(r"/buy", BuyHandler),
],
template_path = 'templates',
debug= True,
login_url = '/main',
cookie_secret = 'aasdafsafsdfjfk',
)
if __name__=='__main__':
tornado.options.parse_command_line() #sys.argv
app = make_app()
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
- test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>tornado</title>
</head>
<body>
{% if error %}
{{ error }}
{% end %}
測試
<form method="post" action="/main?next={{ nextname }}">
<p>用戶名<br><input type="text" name="name"></p>
<p>密碼<br><input type="password" name="password"></p>
<input type="submit">
</form>
</body>
</html>
orm 操作補充:
session.query(User.username).filter(User.username!=’budong’).all() 先用 all 查看所有的數據
session.query(User.username).filter(User.username!=’budong’).limit(2).all() limit 查看前兩條數據
session.query(User.username).filter(User.username!=’budong’).offset(1).all() offset 偏移一條記錄
session.query(User.username).filter(User.username!=’budong’).slice(1,3).all()
slice 對查詢出來的數據進行切片取值
session.query(User.username).filter(User.username==’tuple’).one() one 查詢一條數據,如果存在多條則報錯