我试图通过这个非常简单的例子来了解 Pyramid 遍历。我还没有完全掌握的是从数据库中“注入(inject)”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()
资源.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
View .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 {}
最佳答案
您通常会返回 Article
来自 URL 遍历的 id 部分的对象。
遍历发生的是,对于 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
返回的对象现在包含实际的文章数据, View 可以在呈现时访问该信息。
你真的很想去研究Pyramid Traversal tutorial这更详细地解释了这一切。
关于python - Pyramid 遍历正在做我的头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12295699/