第一次提问这里。
我目前正在挣扎于如何使用烧杯使用正确的瓶的微架构。 这里是有问题的程序:
#!/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')