Bottle.py сессия со стаканом
впервые спрашиваю здесь.
В настоящее время я борюсь за то, как правильно использовать Beaker с помощью микро-фреймворка Bottle. Вот проблемная программа:
#!/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 не распознает переменные, которые находятся за пределами его функции (поправьте меня, если я ошибаюсь).
И вот вопросы:
Что я должен сделать, чтобы иметь только один экземплярapp_session = app.request.environ.get('beaker.session')
так что это может быть доступно каждомуdef
блоки (мне действительно нужен один экземпляр, так как это тот же сеанс, который будет проверен и использован).Если это единственный способ (хотя это и некрасиво), тогда я должен просто объединить все маршруты, для которых требуется сеанс, чтобы я мог достичь единственного экземпляра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')