【问题标题】:Pyramid traversal is doing my head in金字塔遍历是我的头
【发布时间】:2013-01-17 17:50:23
【问题描述】:

我试图通过这个非常简单的示例来了解金字塔遍历。我还没有完全掌握的是从数据库中“注入”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 {}

【问题讨论】:

    标签: python pyramid traversal


    【解决方案1】:

    您通常会从 URL 遍历的 id 部分返回一个 Article 对象。

    遍历会发生什么,对于 URL 路径中的每个元素,都会查找一个对象,并为 next 路径元素查找创建新的当前对象。

    所以对于Article,根对象被要求提供与该名称匹配的东西,并且该查找的结果 成为新的“当前”对象,然后查找5048230b2485d614ecec341d在那个新对象上。

    所以,您正在寻找的是一个调度程序对象,它根据您传递的较长 id 查找文章,that 返回您的 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
    

    注意当您使用/articles URL 路径时我​​如何返回ArticleDispatcher,以及我如何设置__name__ 和__parent__ 变量;您需要那些能够为这些实例生成 URL。

    返回的Article 对象现在包含实际的文章数据,并且视图可以在呈现时访问该信息。

    你真的很想去研究Pyramid Traversal tutorial,它更详细地解释了这一切。

    【讨论】:

    • 谢谢。您的示例不太有效,因为您没有将足够的参数传递给调度程序的init,但是您给了我一个良好的开端。我已经阅读 Pyramid Traversal 教程好几个小时了,但它太复杂了,而且充满了可能不需要纯粹演示 Traversal 的东西。所以非常感谢您的回复!
    • @MFB:是的,抱歉,之前版本的编辑错误。 :-) 为您更正了 __init__ 签名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2019-07-19
    • 1970-01-01
    相关资源
    最近更新 更多