Как об определении декларативной базы (SQLAlchemy) в appname/db/__init__.py
и для каждого из LIBS импортировать базу из appname
в appname/libs/NAME/models.py
:
import appname.db
Base = appname.db.Base
class MyUser(Base):
...
Чтобы получить сеанс базы данных например, использовать сессию с ограниченным охватом, это может быть основной контент для appname/db/__init__.py
(или просто db.py
, если вы не хотите определять дополнительные базовые модели в appname/db/models.py
)
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy import engine_from_config
__all__ = ['session', 'ses']
ses = session = scoped_session(sessionmaker())
def load_engine(config):
engine = engine_from_config(config, prefix='')
session.configure(bind=engine)
Затем установите инструмент для удаления сеанса с резьбовыми местных жителей, когда запрос закончилась:
import cherrypy
from appname import db
def remove_db_session():
db.session.remove()
cherrypy.tools.removedbs = cherrypy.Tool('on_end_request', remove_db_session)
с этого момента просто использовать сессию в нормальном режиме из любой части приложения, например:
from appname import db
from appname.libs.user import models
class User:
exposed = True
def GET(self, id):
db.ses.query(models.User).filter_by(id=id)
# and let the tool to remove the session
# when the request finish
Кстати, чтобы включить эту removedbs
инструмент, просто убедитесь, что вы выполняете где-то, что cherrypy.tools.removedbs = ....
я обычно ставлю что: appname/cptools/tool
, а затем в словаре конфигурации или набор файлов tools.removedbs.on
в True
Работа с cherrypy означает, что вы создадите дерево приложений, нет лишней магии, вам нужно иметь центральное место для построения полного дерева, если вы хотите использовать MethodDispatcher или DefaultDispatcher.
В этом случае я рекомендую вам MethodDispatcher и, возможно, this post can give you a little more perspective и this is from my blog emulating the github api without any base handler.
Существует альтернатива использовать больше django-подобных маршрутов с помощью RoutesDispatcher, но вы потеряете много функциональности из инструментов.
Чтобы показать пример с MethodDispatcher и создать свой собственный объект дерева, от текущей структуры вы можете иметь функцию сборки на appname/builder.py
и сделать что-то вроде этого:
from appname.views import Main
from appname.libs import user, football
appmap = {'user': user,
'footbal': football}
def build_app(*apps):
root = Main()
for app in apps:
appmodule = appmap[app]
appmodule.attach(root)
return root
А внутри appname/libs/user/__init__.py
from appname.libs.user import views
def build_tree():
root = views.Main()
root.management = views.Management()
return root
def attach(root):
root.user = build_tree()
Это всего лишь способ структурирования приложения, есть также репозиторий с cherrypy recipes, которые очень полезны.