2012-10-19 11 views
16

Mam problem z uzyskaniem prostej aplikacji Hello World do pracy za pomocą Flask, MongoDB i Python. Aplikacja jest bombardowana podczas próby importowania z modułu bson. Wszystkie moduły zostały pomyślnie zainstalowane poprzez pip i biegnę w virtualenv, więc nie jestem pewien, dlaczego ja dostaję błąd: ImportError: cannot import name BSONFlask ImportError z bsonem na OS X

Oto mój przykładowy kod aplikacji:

import os 
from flask import Flask 
from flask import g 
from flask import jsonify 
from flask import json 
from flask import request 
from flask import url_for 
from flask import redirect 
from flask import render_template 
from flask import make_response 
import pymongo 
from pymongo import Connection 
from bson import BSON 
from bson import json_util 

app = Flask(__name__) 

@app.route('/') 
def hello(): 

    connection = Connection() 
    # Get your DB 
    db = connection.my_database 
    # Get your collection 
    cars = db.cars 
    # Create some objects 
    import datetime 
    car = {"brand": "Ford", 
      "model": "Mustang", 
      "date": datetime.datetime.utcnow()} 
    # Insert it 
    cars.insert(car) 
    json_docs = [json.dumps(doc, default=json_util.default) for doc in cars.find()] 

    return json_docs 


if __name__ == '__main__': 
    # Bind to PORT if defined, otherwise default to 5000. 
    port = int(os.environ.get('PORT', 5000)) 
    app.debug = True 
    app.run(host='0.0.0.0', port=port) 

I nie jestem pewien, jak rozwiązać ten problem lub jeśli czegoś tu brakuje.

EDIT: Wyniki pip freeze:

Flask==0.9 
Jinja2==2.6 
WTForms==1.0.2 
Werkzeug==0.8.3 
bson==0.3.3 
distribute==0.6.28 
mongo==0.2.0 
pymongo==2.3 
pytz==2012g 
wsgiref==0.1.2 

Edit2: usunięto bson i pymongo, reran pip install pymongo. Kompletna ślad teraz:

Traceback (most recent call last): 
18:21:20 web.1 | File ".../venv/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__ 
18:21:20 web.1 |  return self.wsgi_app(environ, start_response) 
18:21:20 web.1 | File ".../venv/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app 
18:21:20 web.1 |  response = self.make_response(self.handle_exception(e)) 
18:21:20 web.1 | File ".../venv/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app 
18:21:20 web.1 |  response = self.full_dispatch_request() 
18:21:20 web.1 | File ".../venv/lib/python2.7/site-packages/flask/app.py", line 1361, in full_dispatch_request 
18:21:20 web.1 |  response = self.make_response(rv) 
18:21:20 web.1 | File ".../venv/lib/python2.7/site-packages/flask/app.py", line 1450, in make_response 
18:21:20 web.1 |  rv = self.response_class.force_type(rv, request.environ) 
18:21:20 web.1 | File ".../venv/lib/python2.7/site-packages/werkzeug/wrappers.py", line 711, in force_type 
18:21:20 web.1 |  response = BaseResponse(*_run_wsgi_app(response, environ)) 
18:21:20 web.1 | File ".../venv/lib/python2.7/site-packages/werkzeug/test.py", line 818, in run_wsgi_app 
18:21:20 web.1 |  app_iter = app(environ, start_response) 
18:21:20 web.1 | TypeError: 'list' object is not callable 
+0

Jest coś nie tak z _virtualenv_. Twój przykład działa bezproblemowo na _virtualenv_, który właśnie utworzyłem z _pymongo_ i _flask_. Którą wersję Pythona używasz? –

+0

'Python 2.7.2 - NIESTANDARDOWY' według' python --version' –

Odpowiedz

61

odinstaluj pakiety bson i pymongo a następnie ponownie zainstalować pakiet pymongo. pymongo instaluje swój własny pakiet bson i myślę, że zastąpiłeś go inną instalacją pakietu bson i prawdopodobnie jest to przyczyną błędu importu.

+0

Cóż, teraz jest inny błąd: 'TypeError: 'lista' obiektu nie jest wywoływana' w '... venv/lib/python2.7/site-packages/kolba/app.py”, linia 1701, w __call__ –

+0

można zaksięgować kompletny traceback? –

+0

pewien. Patrz Edycja 2. –

5

Wracasz listę w hello(). Musisz zwrócić ciąg znaków lub obiekt odpowiedzi, patrz Flask docs. Na przykład. przekonwertuj listę na ciąg przed powrotem:

return '\n'.join(json_docs) 
+0

To rozwiązało ostatni problem! Dostarczył oryginalne rozwiązanie dla Pedro i przekazał ci rozwiązanie. Dzięki Rob! –

2

Spotkałem ten sam problem. Myślę, że powodem jest zainstalowanie pymongo, a następnie zainstalowanie bson. Następnie odinstalowuję banderę. Wtedy dostałem ten problem.

pip freeze pymongo wymaga niczego.

Więc może ma swój własny pakiet bson.

Co mogę rozwiązać ten problem:

pip uninstall pymongo

pip uninstall bson

a następnie ponownie zainstalować pymongo

pip install pymongo