2015-04-04 9 views
0

Как вы используете супапперы для бутылок с стаканами?Бутылка() w/Beaker Middleware?

bottlepy.org показывает примеры для обоих:

Sub-приложений http://bottlepy.org/docs/dev/tutorial.html#plugins-and-sub-applications

сеансы http://bottlepy.org/docs/dev/recipes.html#keeping-track-of-sessions

Комбинированные

from bottle import Bottle 
from beaker.middleware import SessionMiddleware 

session_opts = { 
    'session.type': 'file', 
    'session.cookie_expires': 300, 
    'session.data_dir': './data', 
    'session.auto': True 
} 

app = Bottle() 
app = SessionMiddleware(app, session_opts) 

@app.route('/') 
def hello(): 
    return 'Hello World' 

app.run() 

Это выгоняет следующее сообщение об ошибке:

Traceback (most recent call last): 
File "example.py", line 14, in <module> 
@app.route('/') 
AttributeError: 'SessionMiddleware' object has no attribute 'route' 
+0

Я должен был включить, что целью здесь является возможность подключать субпаппы .mount, сохраняя при этом поддержку сеанса через стакан. – Nite

ответ

0

вы пытались выполнить точно такой же код, как и в учебнике?

import bottle 
from beaker.middleware import SessionMiddleware 

session_opts = { 
    'session.type': 'file', 
    'session.cookie_expires': 300, 
    'session.data_dir': './data', 
    'session.auto': True 
} 
app = SessionMiddleware(bottle.app(), session_opts) 

@bottle.route('/test') 
def test(): 
    s = bottle.request.environ.get('beaker.session') 
    s['test'] = s.get('test',0) + 1 
    s.save() 
    return 'Test counter: %d' % s['test'] 

bottle.run(app=app) 
+0

Да, но тогда я не могу подключить subapps app.mount. Все, что я читал о сапапсах, указывает на наличие объекта Bottle() для возможности .mount. – Nite

0
import bottle 
from beaker.middleware import SessionMiddleware 

session = { 
    'session.type': 'file', 
    'session.cookie_expires': 300, 
    'session.data_dir': './data', 
    'session.auto': True 
} 
main_app = bottle.Bottle() 
sub_app = bottle.Bottle() 

app = SessionMiddleware(main_app, session) 

@main_app.route('/') 
def index(): 
    return 'This is app' 

@sub_app.route('/') 
def sub_app_index(): 
    return 'This is subapp' 

main_app.mount('/sub', sub_app) 

bottle.run(app=app) 

Также вы можете импортировать SubApp из отдельного модуля

0

Если есть только одна бутылка приложение в сценарии, вы можете использовать @route вместо от @app.route

1

поэтому небольшое предупреждение об использовании beaker.SessionMiddleware. он пишет весь сеанс по каждому запросу, который его читает. мы обнаружили это при использовании многопоточного сервера, поскольку его записи были потеряны (из-за очевидного состояния гонки). из-за этого мы записали замену замены (тот же API). он доступен здесь: https://github.com/keredson/drsession

+1

абсолютно и точно, что мне нужно. 1000 спасибо за это! –