2016-11-09 1 views
0

Je l'ai vu cette question posée beaucoup mais les questions ont à voir avec l'utilisation des fichiers txt ou les données de formulaires. Je peux utiliser curl pour les données POST lors de l'utilisation d'un fichier json, mais je veux savoir comment je peux le faire en ajoutant manuellement des données dans l'instruction curl. J'ai également essayé d'utiliser PUT dans une déclaration curl, mais je ne pouvais pas le faire fonctionner aussi bien. J'ai regardé beaucoup de questions mais la plupart seulement utilisaient comme l'identification ou quelque chose et j'essaye de POSTER et METTRE dans 3 choses. J'ai aussi essayé de faire de petits changements dans les données de la déclaration, mais ils ont continué à me donner des erreurs différentes comme le mauvais placement des parenthèses. Plz aider à ce débutant U_UUtiliser curl pour POST et mettre à jour plusieurs données

Ma déclaration boucle pour l'affichage dans la base de données.

curl -X POST -d '{"todo_ID":18,"UserID":6,"details":"Stop putting in the same things"}' -H "Content-Type:application/ 
json" http://127.0.0.1:5000/ 

Il dit cette erreur et j'ai essayé de faire des changements, mais toujours obtenir la même erreur.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
<title>400 Bad Request</title> 
<h1>Bad Request</h1> 
<p>The browser (or proxy) sent a request that this server could not understand.< 
/p> 

Lorsque vous utilisez PUT ma déclaration boucle est

curl -X PUT -H "Content-Type:applicat 
ion/json" -d {"todo_ID":1,"UserID": 3,"details":"hi let it go"} http://127.0.0.1 
:5000/update/1 

je reçois essentiellement la même erreur que je reçois pour POST.

Mon code est.

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

app = Flask(__name__) 
app.config.from_pyfile('Config.py') 
db = SQLAlchemy(app) 

class JsonModel(object): #Class for making objects JSON serializable 
    def as_dict(self): 
     return {c.name: getattr(self, c.name) for c in self.__table__.columns} 

class User(db.Model, JsonModel): #Class which is a model for the User table in the database 
    User_ID = db.Column(db.Integer, primary_key = True) 
    FirstName = db.Column(db.String(20)) 
    LastName = db.Column(db.String(20)) 

    def __init__(self,User_ID,FirstName, LastName): 
     self.User_ID = User_ID 
     self.FirstName = FirstName 
     self.LastName = LastName 

class Todo(db.Model, JsonModel): #Class which is a model for the Todo table in the database 
    todo_ID = db.Column(db.Integer, primary_key = True) 
    UserID = db.Column(db.Integer, db.ForeignKey("user.User_ID")) 
    details = db.Column(db.String(30)) 

    def __init__(self,todo_ID, UserID,details): 
     self.todo_ID = todo_ID 
     self.UserID = UserID 
     self.details = details 

@app.route('/', methods = ['POST']) #Uses POST method with same URL as GET method to add new information to Todo table. 
def create_dev(): 
    dev = Todo(request.json["todo_ID"], request.json["UserID"], request.json["details"]) 
    db.session.add(dev) 
    db.session.commit() 
    return json.dumps([{'dev': dev}]), 201 

@app.route('/update/<int:todo_ID>', methods = ['PUT']) 
def update_todo(todo_ID): 
    dev = Todo.query.get(todo_ID) 
    dev.UserID = Todo(request.json["UserID"]) 
    dev.details = Todo(request.json["details"]) 
    db.session.update(dev) 
    db.session.commit() 
    return jsonify({ 'dev': dev}) 

@app.before_first_request #Creates everything before the first request. 
def startup(): 
    db.create_all() 

if __name__ == '__main__': 
    app.run() 
+0

Quelle est l'erreur rapport Flask? Avez-vous vérifié les journaux ou essayé d'exécuter votre application avec le mode de débogage activé? – dirn

+0

Êtes-vous sur Windows? Il est probable que votre chaîne 'curl' json ne soit pas correctement échappée. – Doobeh

+0

yup im sur les fenêtres. –

Répondre

0

400 Bad Requests sont généralement vus lorsque vous essayez d'accéder à certaines données de la demande qui ne sont pas là.

Dans votre cas, il échoue probablement lorsque vous essayez d'abord de lire request.json["todo_ID"] à votre demande car Flask n'a pas pu décoder correctement votre fichier json.

Maintenant, boucle peut être un peu d'une douleur pour se travailler avec JSON (vérifier d'autres SO questions sur le sujet). La meilleure façon de tester est de créer un fichier texte example.json avec le contenu:

{ 
    "todo_ID":18, 
    "UserID":6, 
    "details":"Stop putting in the same things" 
} 

Ensuite, modifiez votre commande curl pour utiliser ce fichier au lieu de gérer la chaîne elle-même, en exécutant curl -H "Content-Type: application/json" -X POST -d @example.json http://127.0.0.1:5000/

Votre problème devrait disparaître .

+0

pour une raison quelconque, je reçois cette erreur dans pycharm le moment où j'utilise curl pour publier les données du fichier json. il dit que la contrainte unique a échoué mais quand je vérifie la base de données, les nouvelles données sont là. Avez-vous une chance de savoir pourquoi? aussi cela fonctionnerait-il si j'utilise l'instruction put avec des données dans le fichier json aussi? –

+0

Je suppose que c'est maintenant quand vous lancez la route 'update' - vous faites une erreur quand vous faites' dev.UserID = Todo (request.json ["UserID"]) 'vous devriez juste faire' dev.UserID = request.json ["UserID"] 'si vous souhaitez le mettre à jour. Vous n'avez pas non plus besoin de 'db.session.update (dev)', lorsque vous validerez, les modifications seront automatiquement sauvegardées dans l'objet 'dev'. – Doobeh

+0

c'est pour mon POST. cela fonctionne mais dit une contrainte d'identifiant unique. –