0

我计划让我的结构类似于这样:

appname/libs/user
            /football
            /tax

图书馆用户将拥有用户模型、显示 REST JSON API 和视图的控制器。

我目前面临的问题可以分为两个主要问题,主要源于使用 Django 一段时间。我对 CherryPy 和 SqlAlchemy 还很陌生。

  1. 如何在每个库中定义模型?我面临的问题是我必须在每个模型中继承 Base Declarative 和 Engine 并将其作为独立应用程序运行以生成其模型。是否有一种机制可以让我插入库并且数据库应该提取所有模型并创建它?(Django 所做的事情。)

  2. 如何定义路由/api?(一个urls.py)

4

1 回答 1

1

如何在每个库中定义声明性基础(sqlalchemy)并appname/db/__init__.py从以下库导入基础:appnameappname/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()

这只是构建应用程序的一种方式,还有一个包含樱桃配方的存储库,非常有用。

于 2013-09-20T08:20:31.640 回答