我在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