2012-10-19 28 views
16

Ho problemi a far funzionare una semplice applicazione Hello World utilizzando Flask, MongoDB e Python. L'app sta bombardando quando si tenta di importare dal modulo bson. Tutti i moduli sono stati installati con successo via pip e sto correndo in un virtualenv, quindi non sono sicuro perché sto ottenendo l'errore: ImportError: cannot import name BSONFlask ImportError con bson su OS X

Ecco il mio esempio di codice app:

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 Non sono sicuro di come procedere nel debug di questo o se c'è qualcosa che mi manca qui.

Modifica: risultati di 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: BSON rimosso e pymongo, nuovamente eseguita pip install pymongo. tratto completo ora:

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

C'è qualcosa di sbagliato con il tuo _virtualenv_. Il tuo esempio funziona senza problemi su un _virtualenv_ che ho appena creato con _pymongo_ e _flask_. Quale versione di Python stai usando? –

+0

'Python 2.7.2 - CUSTOM' secondo' python --version' –

risposta

61

provare a disinstallare i pacchetti bson e pymongo e reinstallando il pacchetto pymongo. pymongo installa il proprio pacchetto bson e penso che lo abbia sovrascritto con l'altra installazione del pacchetto bson e questo è probabilmente ciò che sta causando il tuo errore di importazione.

+0

Bene, ora è un errore diverso: 'TypeError: 'list' object non è callable' in' ... venv/lib/python2.7/site-packages/flask/app.py ", riga 1701, in __call__ –

+0

Puoi postare il traceback completo? –

+0

Certo. Vedi Modifica 2. –

5

Si sta restituendo un elenco in hello(). È necessario restituire una stringa o un oggetto Response, vedere Flask docs. Per esempio. convertire la lista in una stringa prima di restituire:

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

Questo ha risolto il problema finale! Ha dato la soluzione originale a Pedro e un upvote a voi. Grazie Rob! –

2

Ho incontrato lo stesso problema. Penso che il motivo è installare pymongo e quindi installare bson. Quindi disinstallo Bson. Poi ho avuto questo problema.

pip freeze pymongo non richiede nulla.

Quindi forse ha il proprio pacchetto bson.

Cosa posso risolvere questo problema:

pip uninstall pymongo

pip uninstall bson

e quindi reinstallare pymongo

pip install pymongo