Не могу заставить Пирамиду распознать Монго - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь заставить веб-инфраструктуру Pyramid обрабатывать запросы с использованием 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.

Может кто-нибудь помочь мне понять, что происходит?

1 Ответ

0 голосов
/ 07 мая 2018

Вы не ссылаетесь на запрос - вы ссылаетесь на сам объект (обычно называемый 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}
...