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