2016-11-09 6 views
0

この質問はよく聞かれましたが、質問はtxtファイルやフォームのデータを使用することと関係しています。 jsonファイルを使用しているときにcurlを使用してデータをPOSTすることはできますが、データを手動でcurlステートメントに追加することでどのように処理できるかを知りたいと思います。私もcurlステートメントでPUTを使ってみましたが、うまく動作するようにはできませんでした。私は多くの質問を見ていましたが、IDや何かのように使うのがほとんどで、私は3つの事柄でPOSTとPUTしようとしています。また、私は、ステートメント内のデータを少し変更しようとしましたが、ブラケットの置き換えのような違うエラーを与え続けました。この初心者のためのPlzヘルプU_Ucurlを使用して複数のデータをPOSTして更新する

データベースに投稿するための私のカールの文はです。

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/ 

このエラーは、私は変更を加えようとしましたが、同じエラーが表示されます。

<!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> 

私のカール文をPUT使用して、私は基本的に私は、POSTのために取得し、同じエラーを取得し

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 

です。

マイコードです。

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

フラスコ報告にはどのような誤りがありますか?ログをチェックしたか、デバッグモードを有効にしてアプリケーションを実行しようとしましたか? – dirn

+0

あなたは窓にいますか?あなたの 'curl' json文字列が正しくエスケープされていない可能性があります。ウィンドウ上で – Doobeh

+0

うん。 –

答えて

0

400 Bad Requestsは通常、あなたがそこにないリクエストからいくつかのデータにアクセスしようとしているときに見られています。

Flaskがあなたのjsonを正しく解読できなかったので、あなたの要求からrequest.json["todo_ID"]を最初に読み込もうとすると、おそらく失敗するでしょう。

ここで、curlはjsonの作業に苦労するかもしれません(この件に関する他のSOの質問をチェックしてください)。 curl -H "Content-Type: application/json" -X POST -d @example.json http://127.0.0.1:5000/

あなたの問題が消えるはず実行することにより、文字列自体を扱うのではなく、そのファイルを使用するようにcurlコマンドを調整後

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

:テストする最も簡単な方法は、内容のexample.jsonテキストファイルを作成することです。

+0

私はjsonファイルからデータを書き込むためにカールを使用する瞬間、何らかの理由でpycharmでこのエラーが発生します。それはユニークな制約が失敗したと言いますが、私はデータベースをチェックするときに新しいデータがそこにあります。何故かあなたはなぜ知っている?また、jsonファイルのデータをputステートメントで使用するとうまくいくでしょうか? –

+0

'dev.UserID = Todo(request.json [" UserID "])'を実行したときにあなたが誤って 'update'ルートを実行したとします。' dev.UserID =あなたが更新したい場合は、request.json ["UserID"] 'また、 'db.session.update(dev)'は必要ありません。コミットすると、自動的に 'dev'オブジェクトへの変更が保存されます。 – Doobeh

+0

これは私のPOSTです。それは動作しますが、ユニークなid制約があります。 –

関連する問題