最近用Python的bottle框架搭建了一個小的網站,想給網站加入一個登陸頁面,突然發現竟然沒有考慮不同用戶的問題。。。。。。畢竟這個東西不是我一個人用,查了一些資料發現session,cookie能滿足這個需求。簡單點說session和cookie是一種保持會話狀態的機制,說明瀏覽器和服務器建立了會話連接。cookie是用於瀏覽器一側的,將用戶信息保存在cookie文件中,session是用於服務器一側的,將用戶信息保存在session文件中。實際上這兩種方式,任選一種都可以實現用戶信息驗證,考慮到下面幾個問題,最後決定使用session的方式來實現這個功能。
bottle本身不包含session功能,可以使用第三方插件beaker,下面說一下bottle中session的實現,在網上搜索到的資料基本都是下面的方式(親測有些問題):
參考網站:http://www.linuxyw.com/630.html
from bottle import route, run, redirect, request, default_app
from beaker.middleware import SessionMiddleware
import copy
# 設置session參數
session_opts = {
'session.type': 'file', # 以文件的方式保存session
'session.cookie_expires': 3600, # session過期時間爲3600秒
'session.data_dir': 'sessions', # session存放路徑
'session.auto': True
}
@route('/login')
def login():
return '''
<html>
<head>
</head>
<body>
<form action="/login" method="post">
Username: <input name="username" type="text" />
Password: <input name="password" type="password" />
<input value="Login" type="submit" />
</form>
</body>
</html>
'''
@route('/login', method='POST')
def do_login():
username = request.forms.get('username')
password = request.forms.get('password')
if username == 'name' and password == 'password':
'''
如果帳號密碼正確,則獲取環境變量中的beaker.session對象,
並賦值給s,然後我們就可以用字典的方式,往s裏面添加一些我們要存進去的數據,
如帳號名,帳號id,權限等等
'''
s = request.environ.get('beaker.session')
print(s)
s['user'] = username
s.save()
return redirect('/')
@route('/')
def index():
s = request.environ.get('beaker.session') # 獲取session
username = s.get('user', None) # 從session中獲取Key爲user的值,是上面登陸的時候保存進來的
print(s)
if not username:
return redirect('/login')
return "歡迎你:%s" % username
app = default_app()
app = SessionMiddleware(app, session_opts)
run(app=app, host='0.0.0.0', port=8180, debug=True)
親測發現有些問題:
1、session一直存在,並沒有失效。
又嘗試了很多方法,搜索了很多資料,最後發現在session的配置參數中有一個參數timeout,如果我們使用session的方式,從描述上來看,我們使用timeout參數更加合理。嘗試將配置'session.cookie_expires': 30,修改爲'session.timeout': 30,session在30秒後失效,說明這裏應該使用timeout參數。
2、session文件並沒有刪除。
大部分博客中都將session.cookie_expires這個參數描述爲可以在設定時間後刪除session文件,但經過反覆的實際測試發現根本不是那麼回事,查詢了下官方手冊發現Beaker壓根就沒有這個功能,需要用戶自己實現。
還有些博客中介紹可以使用delete()方法,這個方法可以刪除session中的內容但是並不能刪除生成的session文件。所以在實際應用的時候文件的刪除還需要用戶單獨管理。
運行delete方法雖然刪除了session中的內容但是session文件依然存在。