2012-10-19 22 views
16

Tôi gặp sự cố khi tải ứng dụng Hello World đơn giản để sử dụng Flask, MongoDB và Python. Ứng dụng đang ném bom khi cố gắng nhập từ mô-đun bson. Tất cả các module được cài đặt thành công qua pip và tôi đang chạy trong một virtualenv, vì vậy tôi không chắc chắn lý do tại sao tôi nhận được lỗi: ImportError: cannot import name BSONFlask ImportError với bson trên OS X

Đây là mã ứng dụng mẫu của tôi:

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) 

tôi 'không chắc chắn làm thế nào để đi về gỡ lỗi này hoặc nếu có một cái gì đó tôi đang thiếu ở đây.

Edit: kết quả của 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 Removed và pymongo, reran pip install pymongo. Toàn bộ dấu vết tại:

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ó điều gì đó sai trái với _virtualenv_ của bạn. Ví dụ của bạn chạy mà không có bất kỳ vấn đề nào trên _virtualenv_ Tôi vừa tạo với _pymongo_ và _flask_. Bạn đang sử dụng phiên bản Python nào? –

+0

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

Trả lời

61

Hãy thử gỡ bỏ cài đặt bsonpymongo gói và sau đó cài đặt lại gói pymongo. pymongo cài đặt gói bson của riêng mình và tôi nghĩ bạn đã ghi đè gói này bằng cài đặt gói bson khác và đó có thể là nguyên nhân gây ra lỗi nhập của bạn.

+0

Bây giờ nó là một lỗi khác: 'TypeError: 'list' đối tượng không thể gọi được trong' ... venv/lib/python2.7/site-packages/flask/app.py ", dòng 1701, trong __call__ –

+0

Bạn có thể đăng bài trả lại hoàn chỉnh không? –

+0

Chắc chắn. Xem Chỉnh sửa 2. –

5

Bạn đang trả lại một danh sách trong hello(). Bạn cần trả về một chuỗi hoặc một đối tượng Response, xem Flask docs. Ví dụ. chuyển đổi danh sách thành chuỗi trước khi trở về:

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

Điều đó đã giải quyết được vấn đề cuối cùng! Đã đưa ra giải pháp ban đầu cho Pedro và một upvote cho bạn. Cảm ơn Rob! –

2

Tôi đã gặp phải vấn đề tương tự. Tôi nghĩ lý do là tôi cài đặt pymongo và sau đó cài đặt bson. Sau đó, tôi gỡ cài đặt bson. Sau đó, tôi đã nhận được vấn đề này.

pip freeze pymongo yêu cầu Không có gì.

Vì vậy, có thể nó có gói bson riêng.

Những gì tôi giải quyết vấn đề này:

pip uninstall pymongo

pip uninstall bson

và sau đó cài đặt lại pymongo

pip install pymongo