5

初めての質問者です。

私は現在、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)

お気づきかもしれませんが、私app_session = app.request.environ.get('beaker.session')はすべてのdefブロックで呼び出しを続けているので、次のようなエラーは返されませTypeError: 'NoneType' object does not support item assignmentん: --- Python は関数の外にある変数を認識しないようです (間違っていたら訂正してください)。

そして、ここに質問があります:

  1. app_session = app.request.environ.get('beaker.session')のインスタンスを 1 つだけにして、すべてのブロックで使用できるようにするにはどうすればよいですdefか (同じセッションをチェックして使用するため、実際には 1 つのインスタンスが必要です)。
  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')
4

1 に答える 1

26

beakerアプリケーションでの使用bottleは簡単です。まず、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ます (以前のインポート ステートメントを参照)。これは、現在の要求に関する情報を含むスレッド ローカル変数です。この時点から、request.session必要なときにいつでも参照できます。たとえば、次のようになります。

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

    request.session['something'] = 1
于 2012-12-06T01:35:09.577 に答える