2013-09-19 4 views
0

я планировал для моей структуры, чтобы быть что-то похожее на это:Как создать приложение CherryPy в архитектуре MVC?

appname/libs/user 
      /football 
      /tax 

Если пользователь библиотеки, будут иметь модели для пользователя, контроллер, который будет отображаться в API REST JSON и мнения.

Проблемы, с которыми я сталкиваюсь в настоящее время, можно разделить на два основных вопроса и которые в основном связаны с использованием Django на некоторое время. Я довольно новичок в CherryPy и SqlAlchemy.

  1. Как определить моды в каждой из этих библиотек? Проблема, с которой я сталкиваюсь, заключается в том, что я должен наследовать Base Declarative и Engine в каждой модели и запускать ее как автономное приложение для создания своих моделей. Есть ли механизм, в котором я могу подключать библиотеки, и база данных должна вытащить все модели и создать их? (Что-то, что делает Django.)

  2. Как определить маршруты/apis? (А urls.py)

ответ

1

Как об определении декларативной базы (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, которые очень полезны.

Смежные вопросы