初めての質問者です。
私は現在、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 は関数の外にある変数を認識しないようです (間違っていたら訂正してください)。
そして、ここに質問があります:
app_session = app.request.environ.get('beaker.session')
のインスタンスを 1 つだけにして、すべてのブロックで使用できるようにするにはどうすればよいですdef
か (同じセッションをチェックして使用するため、実際には 1 つのインスタンスが必要です)。- これが唯一の方法である場合 (醜いですが)、セッションを必要とするすべてのルートを組み合わせて、単一のインスタンスを達成できるようにする必要があり
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')