簡體   English   中英

與燒杯的Bottle.py會話

[英]Bottle.py session with Beaker

這是第一次提問者。

我目前正在努力如何使用Bottle微框架正確使用Beaker。 這是有問題的程序:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# filename: server.py

import bottle as app
from beaker.middleware import SessionMiddleware

session_options = {
    'session.type': 'file',
    'session.data_dir': './session/',
    'session.auto': True,
}
app_middlware = SessionMiddleware(app.app(), session_options)
app_session = app.request.environ.get('beaker.session')

@app.route('/login')
def login():
    app_session = app.request.environ.get('beaker.session')
    app_session['logged_in'] = True

@app.route('/logout')
def logout():
    app_session = app.request.environ.get('beaker.session')
    if app_session.get('logged_in'):
        app_session['logged_in'] = False
        return 'You are logged out'
    app.redirect('/login')

@app.route('/dashboard')
def dashboard():
    app_session = app.request.environ.get('beaker.session')
    if app_session.get('logged_in'):
        return 'You are logged in'
    app.redirect('/login')

app.debug(True)
app.run(app=app_middlware, reloader=True)

如果您注意到,我會繼續在每個def塊上調用app_session = app.request.environ.get('beaker.session') ,這樣就不會返回如下錯誤: TypeError: 'NoneType' object does not support item assignment - - 似乎Python無法識別其功能之外的變量(如果我錯了,請糾正我)。

以下是問題:

  1. 我應該怎么做只有一個app_session = app.request.environ.get('beaker.session')實例,所以它可以用於每個def塊(我真的需要一個實例,因為它是相同的會話要檢查和用過的)。
  2. 如果這是唯一的方法(雖然它很丑陋),那么我應該只需要組合所有需要會話的路由,這樣我就可以實現app_session的單個實例嗎?

就像是:

@app.route('/<path:re:(login|dashboard|logout)\/?>')
def url(path):
    app_session = app.request.environ.get('beaker.session')
    if 'login' in path:
        app_session['logged_in'] = True
    elif 'logout' in path:
        if app_session.get('logged_in'):
            # app_session.delete() it doesn't seem to work?
            app_session['logged_in'] = False
            return 'You are logged out'
        app.redirect('/login')
    elif 'dashboard' in path:
        if app_session.get('logged_in'):
            return 'You are logged in'
        app.redirect('/login')

bottle使用beaker很容易。 首先,設置您的Bottle應用:

import bottle
from bottle import request, route, hook
import beaker.middleware

session_opts = {
    'session.type': 'file',
    'session.data_dir': './session/',
    'session.auto': True,
}

app = beaker.middleware.SessionMiddleware(bottle.app(), session_opts)

后來:

bottle.run(app=app)

有了這個,每次收到請求時,您的Beaker會話都將作為request.environ['beaker_session'] 為方便起見,我通常會這樣做:

@hook('before_request')
def setup_request():
    request.session = request.environ['beaker.session']

這安排在處理任何請求之前運行setup_request ; 我們正在使用bottle.request變量(參見前面的import語句),它是一個線程局部變量,包含有關當前請求的信息。 從這一點開始,我可以隨時在需要時引用request.session ,例如:

@route('/')
def index():
    if 'something' in request.session:
       return 'It worked!'

    request.session['something'] = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM