首页 > 解决方案 > 无法让 Pyramid 识别 Mongo

问题描述

我正在尝试让 Pyramid Web 框架使用 Mongo 处理请求,但我对两者都是相对新手。我无法让我的视图识别附加到请求的数据库。

development.ini

###
# configure mongodb
###
mongo_uri = mongodb://localhost:27017/nomad

__init__.py导入和main功能:

# imports for Mongodb
from urllib.parse import urlparse
from gridfs import GridFS
from pymongo import MongoClient


def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(settings=settings)
    init_includes(config)
    init_routing(config)

    db_url = urlparse(settings['mongo_uri'])
    config.registry.db = MongoClient(
        host=db_url.hostname,
        port=db_url.port,
    )

    def add_db(request):
        db = config.registry.db[db_url.path[1:]]
        if db_url.username and db_url.password:
            db.authenticate(db_url.username, db_url.password)
        return db

    def add_fs(request):
        return GridFS(request.db)

    config.add_request_method(add_db, 'db', reify=True)
    config.add_request_method(add_fs, 'fs', reify=True)
    config.scan()
    return config.make_wsgi_app()

jobscontroller.py中,这是发出请求的处理程序视图:

import pyramid_handlers

from nomad.controllers.base_controller import BaseController

class JobsController(BaseController):

    @pyramid_handlers.action(renderer='templates/jobs/index.pt')
    def index(request):
        all_jobs = request.db['jobs'].find()
        return {'all_jobs': all_jobs}

我收到一个错误:

all_jobs = request.db['jobs'].find()
AttributeError: 'JobsController' object has no attribute 'db'

我正在使用 Pyramid 处理程序来管理路由和视图,我知道所有这些都有效,因为我的所有路由都解析并交付网页。只有作业控制器很时髦,而且只有在我尝试添加 request.db 调用之后。

有人可以帮我理解发生了什么吗?

标签: pythonpython-3.xmongodbpymongopyramid

解决方案


您不是指请求 - 您指的是对象本身(通常命名为self,但您已命名它request- 如果它只是一个函数而不是对象上的方法,这将起作用)。由于您位于类的对象中,因此第一个参数始终是对象本身:

class JobsController(BaseController):
    @pyramid_handlers.action(renderer='templates/jobs/index.pt')
    def index(self, request):
        all_jobs = request.db['jobs'].find()
        return {'all_jobs': all_jobs}

推荐阅读