2012-09-06 85 views
4

我想用這個非常簡單的例子讓我的頭繞着金字塔遍歷。我還沒有完全掌握的是從數據庫中「注入」Article對象的位置。金字塔遍歷正在我的腦海裏

就這樣,/Article正確地找到並呈現article_view但這是相當無用的。我如何/何時/在哪裏使用URL的下一部分從數據庫中查詢特定的文章?例如。 /Article/5048230b2485d614ecec341d

任何線索都會很棒!

初始化的.py

from pyramid.config import Configurator 
from pyramid.events import subscriber 
from pyramid.events import NewRequest 
import pymongo 

from otk.resources import Root 

def main(global_config, **settings): 
    """ This function returns a WSGI application. 
    """ 
    config = Configurator(settings=settings, root_factory=Root) 
    config.add_static_view('static', 'otk:static') 
    # MongoDB 
    def add_mongo_db(event): 
     settings = event.request.registry.settings 
     url = settings['mongodb.url'] 
     db_name = settings['mongodb.db_name'] 
     db = settings['mongodb_conn'][db_name] 
     event.request.db = db 
    db_uri = settings['mongodb.url'] 
    MongoDB = pymongo.Connection 
    if 'pyramid_debugtoolbar' in set(settings.values()): 
     class MongoDB(pymongo.Connection): 
      def __html__(self): 
       return 'MongoDB: <b>{}></b>'.format(self) 
    conn = MongoDB(db_uri) 
    config.registry.settings['mongodb_conn'] = conn 
    config.add_subscriber(add_mongo_db, NewRequest) 
    config.include('pyramid_jinja2') 
    config.include('pyramid_debugtoolbar') 
    config.scan('otk') 
    return config.make_wsgi_app() 

resources.py

class Root(object): 
    __name__ = None 
    __parent__ = None 

    def __init__(self, request): 
     self.request = request 

    def __getitem__(self, key): 
     if key == 'Article': 
      return Article(self.request) 
     else: 
      raise KeyError 

class Article: 
    __name__ = '' 
    __parent__ = Root 

    def __init__(self, request): 
     self.reqeust = request 

    # so I guess in here I need to update the Article with 
    # with the document I get from the db. How? 

    def __getitem__(self, key): 
     raise KeyError 

views.py

from pyramid.view import view_config 
from otk.resources import * 
from pyramid.response import Response 

@view_config(context=Root, renderer='templates/index.jinja2') 
def index(request): 
    return {'project':'OTK'} 

@view_config(context=Article, renderer='templates/view/article.jinja2') 
def article_view(context, request): 
    # I end up with an instance of Article here as the context.. but 
    # at the moment, the Article is empty 
    return {} 

回答

7

你會通常從ID部分返回Article對象的URL遍歷。

遍歷會發生什麼情況是,對於URL路徑中的每個元素,都會查找一個對象,併爲下一個路徑元素查找創建新的當前對象。

所以對於Article,根對象被要求的東西相匹配的名稱,以及結果查找由新的「當前」對象,然後5048230b2485d614ecec341d被查找新的對象。

所以,你正在尋找的是一個調度員對象,一些看起來了基於更長的ID的文章你是過去了,回報您的Article實例:

class Root(object): 
    __name__ = None 
    __parent__ = None 

    def __init__(self, request): 
     self.request = request 

    def __getitem__(self, key): 
     if key == 'articles': 
      dispatch = ArticleDispatcher(self.request) 
      dispatch.__name__ = key 
      dispatch.__parent__ = self 
      return dispatch 
     raise KeyError(key) 

class ArticleDispatcher(object): 
    __name__ = None 
    __parent__ = None 

    def __init__(self, request): 
     self.request = request 

    def __getitem__(self, key): 
     # Get a hold of the database here: 
     db = findDatabase(self.request) 
     if db.exists(key):   
      data = db.load(key) 
      art = Article(data) 
      art.__name__ = key 
      art.__parent__ = self 
      return art 
     raise KeyError(key) 

class Article: 
    __name__ = None 
    __parent__ = None 

    def __init__(self, data): 
     self.data = data 

注意我如何返回一個ArticleDispatcher當您使用/articles URL路徑,以及我如何設置__name____parent__變量;你需要那些能夠爲這些實例生成URL。

返回的Article對象現在包含實際的文章數據,並且該視圖可以在呈現時訪問該信息。

你真的想去研究Pyramid Traversal tutorial,這更詳細地解釋了這一點。

+0

謝謝。你的例子並不完美,因爲你沒有將足夠的參數傳遞給調度器的'init',但是你給了我一個良好的開端。我一直在閱讀金字塔遍歷教程幾個小時,但它太複雜和充滿了可能不需要在那裏純粹演示遍歷的東西。所以我非常感謝你的回覆! – MFB

+0

@MFB:對不起,編輯以前版本的錯誤。 :-)更正了'__init__'簽名。 –

+0

非常好,謝謝你的伴侶 – MFB