Bottle.py-Sitzung mit Becher

Zum ersten Mal Fragesteller hier.

Ich arbeite gerade an der richtigen Verwendung von Beaker mit dem Bottle-Mikro-Framework. Hier ist das problematische Programm:

#!/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)

Wenn Sie es bemerkt haben, rufe ich weiter anapp_session = app.request.environ.get('beaker.session') auf jedemdef block so einfach es wird keinen Fehler zurückgeben wie:TypeError: 'NoneType' object does not support item assignment --- Es scheint, dass Python keine Variablen erkennt, die außerhalb seiner Funktion liegen (korrigieren Sie mich, wenn ich falsch liege).

Und hier sind die Fragen:

Was soll ich tun, um nur eine Instanz von zu haben?app_session = app.request.environ.get('beaker.session') so kann es jedem zur Verfügung stehendef Blöcke (Ich brauche wirklich eine Instanz, da es die gleiche Sitzung ist, die geprüft und verwendet werden soll).Wenn dies der einzige Weg ist (es ist allerdings hässlich), sollte ich einfach alle Routen kombinieren, die eine Sitzung erfordern, damit ich die einzige Instanz von erreichen kannapp_session?

So etwas wie:

@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')

Antworten auf die Frage(1)

Ihre Antwort auf die Frage