如何在Python的Bottle框架中使用Session

最近用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文件依然存在。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章