Как интегрировать Pyramid 1.1 и Mongo DB - как можно меньше строк - PullRequest
2 голосов
/ 26 августа 2011

Цель : Я пытаюсь интегрировать Mongo DB с базовым приложением Pyramid 1.1.

Фон : Приложение создано книгой (https://docs.pylonsproject.org/projects/pyramid/1.1/narr/project.html#creating-the-project) с помощью базовой команды "paste create -t ​​pyramid_starter"

Я следовал этой статье поваренной книги: https://docs.pylonsproject.org/projects/pyramid_cookbook/dev/mongo.html

Проблема : Кажется, что когда я добавляю соединение MongoDB в запрос, я получаю «Внутреннюю ошибку сервера» с

Я пробовал несколько статей, и мне кажется, что я должен начатьОтладка системы больше? Кто-нибудь нашел простое решение для этого?

Исключение, если это поможет какой-то эксперт

Exception happened during processing of request from ('127.0.0.1', 53697)
Traceback (most recent call last):
    File "virtualenv\lib\site-packages\paste-1.7.5.1-py2.7.egg\paste\httpserver.py", line 1068, in process_request_in_thread
self.finish_request(request, client_address)
    File "C:\Python27\Lib\SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
    File "C:\Python27\Lib\SocketServer.py", line 639, in __init__
    self.handle()
    File "virtualenv\lib\site-packages\paste-1.7.5.1-py2.7.egg\paste\httpserver.py", line 442, in handle
    BaseHTTPRequestHandler.handle(self)
    File "C:\Python27\Lib\BaseHTTPServer.py", line 343, in handle
    self.handle_one_request()
...
    File "C:\Python27\lib\site-packages\pyramid_debugtoolbar-0.8-py2.7.egg\pyramid_debugtoolbar\panels\__init__.py", line 24, in render
    return render(template_name, vars, request=request)
    File "virtualenv\lib\site-packages\pyramid-1.2a1-py2.7.egg\pyramid\renderers.py", line 69, in render
    return helper.render(value, None, request=request)
    File "virtualenv\lib\site-packages\pyramid-1.2a1-py2.7.egg\pyramid\renderers.py", line 418, in render
    result = renderer(value, system_values)
    File "C:\Python27\lib\site-packages\pyramid_jinja2-1.1-py2.7.egg\pyramid_jinja2\__init__.py", line 277, in __call__
    return self.template.render(system)
    File "C:\Python27\lib\site-packages\jinja2-2.6-py2.7.egg\jinja2\environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
    File "C:\Python27\lib\site-packages\pyramid_debugtoolbar-0.8-py2.7.egg\pyramid_debugtoolbar\panels\templates\request_vars.jinja2", line 110, in top-level template code
    <td>{{ value|escape }}</td>
    File "virtualenv\lib\site-packages\markupsafe-0.15-py2.7.egg\markupsafe\_native.py", line 20, in escape
    return s.__html__()
    File "virtualenv\lib\site-packages\pymongo-2.0.1-py2.7-win-amd64.egg\pymongo\collection.py", line 1156, in __call__
    self.__name)
   TypeError: 'Collection' object is not callable. If you meant to call the '__html__' method on a 'Database' object it is failing because no such method exists.

Ответы [ 3 ]

2 голосов
/ 19 сентября 2011

Другое возможное решение - использовать параметр debugtoolbar.panels в вашем конфигурационном файле, чтобы отключить панель request_vars (что и вызывает проблему):

[app:main]
.. other stuff ...
debugtoolbar.panels =
    pyramid_debugtoolbar.panels.versions.VersionDebugPanel
    pyramid_debugtoolbar.panels.settings.SettingsDebugPanel
    pyramid_debugtoolbar.panels.headers.HeaderDebugPanel
#    pyramid_debugtoolbar.panels.request_vars.RequestVarsDebugPanel
    pyramid_debugtoolbar.panels.renderings.RenderingsDebugPanel
    pyramid_debugtoolbar.panels.logger.LoggingPanel
    pyramid_debugtoolbar.panels.performance.PerformanceDebugPanel
    pyramid_debugtoolbar.panels.routes.RoutesDebugPanel
    pyramid_debugtoolbar.panels.sqla.SQLADebugPanel
0 голосов
/ 26 августа 2011

Объекты Pymongo Database и Collection отвечают на __getattr__, чтобы обеспечить более приятный интерфейс и позволить вам написать код, подобный:

db.foo.bar.find(...)

Любой вызов __getattr__ будет успешным, но, к сожалению, это сбивает с толку некоторые библиотеки, которые ожидают, что определенные атрибуты могут быть вызваны (объект Pymongo Collection не вызывается, кроме как для вызова этого исключения, которое вы видите выше).

В проектах Pyramid я использовал только базу данных из ресурсов, чтобы ссылки на базу данных или коллекции не появлялись на уровне модуля в представлениях или другом коде. Как дополнительное преимущество, это становится хорошим способом принудительного разделения задач, чтобы ресурсы обрабатывали манипуляции с базой данных, а представления только переводили это для отображения в шаблонах.

0 голосов
/ 26 августа 2011

Эта ошибка означает, что вы пытаетесь вызвать метод ( html ), которого нет в экземпляре базы данных.

>>> conn = Connection()
>>> db = conn.mydb
>>> col = db.mycoll
>>> col = db.mycoll()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/virtualenvs/myenv/lib/python2.7/site-packages/pymongo-2.0-py2.7-macosx-10.6-x86_64.egg/pymongo/collection.py", line 1156, in __call__
self.__name)
TypeError: 'Collection' object is not callable. If you meant to call the 'mycoll' method on a 'Database' object it is failing because no such method exists.

Если вы не изменили код, возможно, это ошибка в markupsafe, которая пытается вызвать html () в экземпляре базы данных

s.__html__()
...