2016-11-09 63 views
0

我見過這個問題很多,但問題與使用txt文件或表單中的數據有關。 使用json文件時,我可以使用curl來POST數據,但我想知道如何通過手動將數據添加到curl語句中來實現。我也嘗試在curl語句中使用PUT,但無法使其工作。我看了很多問題,但大多數只使用像ID或東西,我試圖POST和PUT 3件事情。我還試着對陳述中的數據做一些小的改動,但他們不斷給我提供像托架錯位這樣的不同錯誤。 Plz幫助這個初學者U_U使用curl POST和更新多個數據

我的curl語句在數據庫中發佈是。

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> 

使用時把我的捲髮聲明

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 

我基本上得到,我得到了POST同樣的錯誤。

我的代碼是。

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

Flask報告有什麼錯誤?您是否檢查過日誌或嘗試在啓用調試模式的情況下運行應用程序? – dirn

+0

你在窗戶上嗎?很可能你的'curl' json字符串沒有正確轉義。 – Doobeh

+0

在窗口上。 –

回答

0

400 Bad Requests通常被視爲當你試圖從那個是不是有請求訪問某些數據。

在你的情況下,當你第一次嘗試從你的請求中讀取request.json["todo_ID"]時可能會失敗,因爲Flask無法正確解碼你的json。

現在,使用json處理curl可能有點痛苦(請查看其他關於此主題的SO問題)。測試最簡單的方法是創建內容的example.json文本文件:通過運行curl -H "Content-Type: application/json" -X POST -d @example.json http://127.0.0.1:5000/

你的問題應該消失

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

然後調整curl命令,而不是使用處理字符串本身文件, 。

+0

因爲某些原因,我在使用curl從json文件中發佈數據的時候,在pycharm中得到了這個錯誤。它說獨特的約束失敗,但當我檢查數據庫中的新數據在那裏。你知道爲什麼嗎?如果我也用json文件中的數據使用put語句,它也可以工作嗎? –

+0

我假設這是現在當你運行'update'路由 - 當你做'dev.UserID = Todo(request.json [「UserID」])時你犯了一個錯誤''你應該做'dev.UserID = request.json [「UserID」]'如果你希望它更新。你也不需要'db.session.update(dev)',當你提交時,它會自動保存對'dev'對象的修改。 – Doobeh

+0

這是用於我的POST。它的作品,但說唯一的ID約束。 –