如何在每个库中定义声明性基础(sqlalchemy)并appname/db/__init__.py
从以下库导入基础: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,也许这篇文章可以给您更多的视角,这是来自我的博客,它在没有任何基础处理程序的情况下模拟 github api。
有一种替代方法可以通过RoutesDispatcher使用更多类似 django 的路由,但是您将失去工具的很多功能。
为了向您展示一个使用 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()
这只是构建应用程序的一种方式,还有一个包含樱桃配方的存储库,非常有用。