0

Я пытаюсь опубликовать следующий JSON и сохранить в базе данных MySQL на сервере Колба и Python 2.7, беспокойный рамки и SQLAlchemy с завитком:Python Колба SQLAlchemy JSON POST Error

curl -i -H "Accept: application/json" -X POST -d '{"attribute_id": "1", "product_id": "44","text":"Something","language":"1"}' http://seroney-pc:5000/api/attributes 

{ 
    "attribute_id": "1", 
    "product_id": "44", 
    "text": "Something", 
    "language": "1" 
} 

Мой код выглядит следует:

from flask import Flask,request,jsonify, abort 
from flask_sqlalchemy import SQLAlchemy 
import flask_restless 


app = Flask(__name__) 
db = SQLAlchemy(app) 
manager = flask_restless.APIManager(app) 

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:[email protected]:3306/test' 


class Attributes(db.Model): 
    __tablename__ = 'oc_product_attribute' 
    product_id = db.Column(db.Integer,primary_key=True) 
    attribute_id = db.Column(db.Integer,primary_key=True) 
    language_id = db.Column(db.Integer,primary_key=True) 
    text=db.Column(db.String) 

@app.route('/api/attributes/',methods=['GET']) 
def getProductAttributes(): 
    if request.method =='GET': 
     results = Attributes.query.limit(10).offset(0).all() 
     json_results = [] 
     for result in results: 
      d = { 
       'product_id':result.product_id, 
       'attribute_id':result.attribute_id, 
       'language_id':result.language_id, 
       'text':result.text 
      } 
      json_results.append(d) 

     return jsonify(items = json_results) 

@app.route('/api/attributes/', methods=['POST']) 

def postProductAttributes(): 
    product_id = request.json['product_id'] 
    attribute_id = request.json['attribute_id'] 
    language_id = request.json['language_id'] 
    text = request.json['text'] 
    if product_id is None or attribute_id is None or language_id is None or text is None: 
     return jsonify({"message": "Error."}), 400 
    new_attrib = (product_id,attribute_id,language_id,text) 
    db.session.add(new_attrib) 
    db.session.commit() 
    return jsonify({'message' :'Attribute Created successfully'}), 200 

if __name__ == '__main__': 
    app.run(debug=True) 

Когда я отправляю сообщение, я получаю сообщение об ошибке внутреннего сервера. Любая помощь высоко ценится.

отслеживающий является:

seroney-pc - - [23/Dec/2014 20:48:40] "POST /api/attributes HTTP/1.1" 500 - 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1453, in dispatch_request 
    self.raise_routing_exception(req) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1439, in raise_routing_exception 
    raise FormDataRoutingRedirect(request) 

Примечание: это исключение только поднятый в режиме отладки

+1

Внутренняя ошибка сервера 500 * зарегистрирована *. Что говорит ваша консоль? Там должен быть отпечаток, пожалуйста, включите это в свой пост. –

+0

Как вы отправляете данные JSON? Используете ли вы заголовок Content-Type для 'application/json'? –

+0

@MartijnPieters, я обновляю вопрос с информацией о трассировке и командой curl post. Спасибо. Любая помощь приветствуется – Seroney

ответ

1

Вы отправляете к URL без/ в конце, но вы определили маршрут с a trailing /. Когда вы это сделаете, Flask выдает перенаправление на «канонический» URL-адрес, с /.

Поскольку вы используете POST, почтовые данные будут потеряны, поэтому в режиме отладки вместо этого возникает исключение, чтобы сообщить вам, что вместо этого вы должны использовать конечную косую черту в своем сообщении.

Если бы вы смотрели на тело сообщения об ошибке, вы бы видели что-то вроде:

FormDataRoutingRedirect: A request was sent to this URL (http://seroney-pc:5000/api/attributes) but a redirect was issued automatically by the routing system to "http://seroney-pc:5000/api/attributes/". The URL was defined with a trailing slash so Flask will automatically redirect to the URL with the trailing slash if it was accessed without one. Make sure to directly send your POST-request to this URL since we can't make browsers or HTTP clients redirect with form data reliably or without user interaction.

Note: this exception is only raised in debug mode

Смотрите Rule Format documentation:

URL rules that end with a slash are branch URLs, others are leaves. If you have strict_slashes enabled (which is the default), all branch URLs that are visited without a trailing slash will trigger a redirect to the same URL with that slash appended.

Обратите внимание, что ваш curl POST использует неправильный заголовок; вам необходимо установить заголовок Content-Type. Ваше мнение ищет ключ language_id, но ваш пост содержит только language ключ, вы должны исправить это тоже:

curl -i -H "Content-Type: application/json" -X POST \ 
    -d '{"attribute_id": "1", "product_id": "44","text":"Something","language_id":"1"}' http://seroney-pc:5000/api/attributes/ 

Заголовок Accept может быть полезно тоже, но она используется для согласования типа содержимого ответа , и у вас есть свои жесткие коды, чтобы вернуть JSON.

Ваш код создает объект базы данных также неправильно, вы должны вызвать модель и передать аргументы как отдельные аргументы, а затем передать в результате к session.add():

new_attrib = Attributes(*new_attrib) 
db.session.add(new_attrib) 

но только повторное использование Объект JSON будет здесь проще:

db.session.add(Attributes(**request.json)) 
+0

Я добавил трейлинг/но я получаю новый трассировочный трассировка Traceback (последний последний вызов): raise ValueError (функция «Просмотр не возвращала ответ») ValueError: Функция просмотра не ответила – Seroney

+0

@Seroney: Вы уверены, что отправляете сообщение по правильному маршруту? Когда я тестирую свой код с исправленным POST, я получаю другую ошибку (потому что вы не устанавливаете правильный заголовок Content-Type). –

+0

@Seroney: с дополнительными исправлениями я могу заставить ваш код работать нормально. –

Смежные вопросы