解析器列表在本地完成,但在heroku服务器中失败

时间:2017-06-11 04:48:25

标签: python mongodb flask mongoengine

我在heroku有一个应用程序,包括订单,客户,良好和订单功能。我用的是mlab数据库。当我运行本地时,后期订单功能做得很好,但在heroku应用程序中部署失败。我发现解析列表在本地和heroku中有不同的返回结果。但我不知道如何解决它。听到是我的项目。

客户类:

from mongoengine import *
import mlab
from model.customer import *


class Customer(Document):
    username = StringField()
    password = StringField()

好班级:

from mongo
engine import *
import mlab 


class Good(Document):
    goodname = StringField()
    price = FloatField() 

订单类:

from mongoengine import *
from model.good import Good
import mlab
from model.customer import *


class SingleOrder(EmbeddedDocument):
    good = ReferenceField("Good")
    count = IntField()

    def get_json(self):
        return {
            "good":Good.objects().with_id(self.good.id).get_json(),
            "count":self.count
        }

class Order(Document):
    items = ListField(EmbeddedDocumentField("SingleOrder"))
    customer = ReferenceField("Customer")
    totalspend = FloatField()

订单回复:

from flask_restful import Resource, reqparse
from model.good import *
from model.customer import Customer
import mlab
from model.order import Order, SingleOrder


class OrderRes(Resource):
    def get(self):
        orders = Order.objects()
        return mlab.list2json(orders)
    def post(self):
        parser = reqparse.RequestParser()  
        parser.add_argument(name="items", type=list, location="json")
        parser.add_argument(name="user_id", type=str, location="json")
        parser.add_argument(name="id", type=str, location="form")
        parser.add_argument(name="count", type=int, location="form")
        body = parser.parse_args()
        items = body["items"]
        user_id = body.user_id
        total_spend = 0
        order_item = []
        for item in items:
           good_id = item["id"]
           count = item["count"]
           good = Good.objects().with_id(good_id)
           price = good.price
           print("good_id:", good_id,";count: ",count,"price: ",price)
           total_spend += price*count
           singleOrder = SingleOrder(good = good, count = count)
           order_item.append(singleOrder)
        customer = Customer.objects().with_id(user_id)
        print(mlab.item2json(order_item[0]))
        print("order_item0:",mlab.item2json(order_item[0]),"order_item1:",order_item[1])
        order = Order(items = order_item,customer = customer,
                      totalspend = total_spend)
        order.save()
        add_order = Order.objects().with_id(order.id)
        return mlab.item2json(add_order)

mlab文件:

import mongoengine

host = "dsxxxxxx.mlab.com"
port = xxxxx
db_name = "xxxxx"
username = "xxxxx"
password = "xxxxx"
def connect():
    mongoengine.connect(db_name, host=host, port=port, username=username,password=password)
def list2json(l):
    import json
    return [json.loads(item.to_json()) for item in l]
def item2json(item):
    import json
    return json.loads(item.to_json())

我将它部署到heroku应用程序并发布新订单后,它是500内部服务器错误。但在当地它还可以。

我发布新订单:

{
    "items":[
        {
            "id":"593c103b4dabd9000b85b0e5",
            "count":2
        },
        {
            "id":"593c10684dabd9000b85b0e6",
            "count":3
        }
        ],
    "user_id":"593c0d5373c2132880b8a5f3"
}

Heroku app log:

2017-06-11T05:16:56.724170+00:00 app[web.1]: [2017-06-11 05:16:56,722] ERROR in app: Exception on /api/order [POST]
2017-06-11T05:16:56.724203+00:00 app[web.1]: Traceback (most recent call last):
2017-06-11T05:16:56.724204+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
2017-06-11T05:16:56.724205+00:00 app[web.1]:     response = self.full_dispatch_request()
2017-06-11T05:16:56.724206+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1615, in full_dispatch_request
2017-06-11T05:16:56.724206+00:00 app[web.1]:     return self.finalize_request(rv)
2017-06-11T05:16:56.724207+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1630, in finalize_request
2017-06-11T05:16:56.724208+00:00 app[web.1]:     response = self.make_response(rv)
2017-06-11T05:16:56.724208+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1740, in make_response
2017-06-11T05:16:56.724209+00:00 app[web.1]:     rv = self.response_class.force_type(rv, request.environ)
2017-06-11T05:16:56.724210+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/werkzeug/wrappers.py", line 885, in force_type
2017-06-11T05:16:56.724211+00:00 app[web.1]:     response = BaseResponse(*_run_wsgi_app(response, environ))
2017-06-11T05:16:56.724211+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/werkzeug/wrappers.py", line 57, in _run_wsgi_app
2017-06-11T05:16:56.724212+00:00 app[web.1]:     return _run_wsgi_app(*args)
2017-06-11T05:16:56.724213+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/werkzeug/test.py", line 884, in run_wsgi_app
2017-06-11T05:16:56.724214+00:00 app[web.1]:     app_rv = app(environ, start_response)
2017-06-11T05:16:56.724219+00:00 app[web.1]: TypeError: 'TypeError' object is not callable

我通过返回项进行调试,我看到解析器中的本地项参数是json类型,如下所示:

        {
            "id":"593c103b4dabd9000b85b0e5",
            "count":2
        },
        {
            "id":"593c10684dabd9000b85b0e6",
            "count":3
        }

但在服务器中它只返回列表["id","count"]。我怎么能解决它?

我的git repo:https://github.com/phamdinhkhanh/goodorder

0 个答案:

没有答案