【问题标题】:Can't get Pyramid to recognize Mongo无法让 Pyramid 识别 Mongo
【发布时间】:2018-10-12 03:48:31
【问题描述】:

我正在尝试让 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 调用之后。

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

【问题讨论】:

  • 只是古玩,但安装了 pymongopip freeze | grep pymogo 如果你能运行它。值得注意的是,这里的文档可以进行一些更新,并且 authenticate() 方法明显已被弃用,并且在连接到 MongoDB 3.6 或更高版本时以这种方式调用它产生后果。我将首先检查这里的各个阶段。看到settings 包含你认为它做了什么,然后每个连接阶段都在做预期的事情。
  • 感谢尼尔的建议。我在 pymongo 3.6.1 和 MongoDB 3.4.7 上。我尝试删除身份验证行,但我得到了同样的错误。
  • 这不仅仅是身份验证行(现在),因为如果至少urlparse 工作正常,代码目前不会到达那里。帮自己一个忙,以交互方式启动 python,并尝试至少先连接pymongo 驱动程序。这将排除任何一般的连接问题。您“应该”做的下一件事是尝试相同的“独立”指令尝试获取Confgurator 的实例,并查看它实际上是否正确读取了您提供的配置。这些是您可以自己完成的步骤,而无需等待其他人从头开始调试
  • 您的意思是代码可能无法进入视图吗?绝对是 - 如果我将 Mongo 代码完全从视图中取出并让它返回一个字典,那么我可以在我的模板中解析它。至于检查 Python 是否通过 PyMongo 连接到 Mongo,我在尝试与 Pyramid 集成之前就这样做了。我可以让它连接并使用基本的数据库写入数据库:c = MongoClient(host="localhost", port=27017)。所以我仍然很难过。我正在考虑尝试找到一个脚手架并重新创建我的项目,但我宁愿尝试修复这个问题,以便我可以了解缺少/不正确的内容。
  • 不,我只是指身份验证行,因为 url 中没有用户。您的问题是 db 未定义,因此连接过程中的某些内容失败了。要么是连接(并且您已经确认您已经调试过),要么就是没有正确读取配置。这是这里的两个失败点。因此,请确保正确读取配置。

标签: python python-3.x mongodb pymongo pyramid


【解决方案1】:

您不是指请求 - 您指的是对象本身(通常命名为 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}

【讨论】:

  • 感谢 MatsLindh。
猜你喜欢
  • 2014-09-02
  • 2017-03-16
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2017-07-16
相关资源
最近更新 更多