【问题标题】:using curl to use POST using Python RESTful API使用 curl 使用 POST 使用 Python RESTful API
【发布时间】:2016-11-02 22:26:02
【问题描述】:

当我尝试将一些信息发布到数据库中时,我无法弄清楚如何让 curl 工作。我在说它无法读取 txt 文件之前收到一个错误,但是我输入了完整路径,现在它说“发送了一个服务器无法理解的请求”Tbh 我不确定如何正确使用 curl 并且不要如果我不使用 txt 文件,知道在 url 中输入什么。

我的卷发是这样的

C:\Windows>curl -X POST -d "C:/Users/Muba/PycharmProjects/API practise/todo.txt"
 http://127.0.0.1:5000/ --header "Content-Type:application/json"

我的 todo.txt 文件包含

todo_ID, 12
User_ID, 8
details, "Get rid of all the flies in the house."

这是我的代码。

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

import requests


app = Flask(__name__)
app.config.from_pyfile('Config.py')
db = SQLAlchemy(app)
db.create_all()
class JsonModel(object):
    def as_dict(self):
        return {c.name: getattr(self, c.name) for c in self.__table__.columns}

class User(db.Model, JsonModel):
    User_ID = db.Column(db.Integer, primary_key = True)
    FirstName = db.Column(db.String(20))
    LastName = db.Column(db.String(20))

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

class Todo(db.Model, JsonModel):
    todo_ID = db.Column(db.Integer, primary_key = True)
    UserID = db.Column(db.Integer, db.ForeignKey('User_ID'))
    details = db.Column(db.String(30))

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

@app.route('/', methods = ['GET'])
def index():
    return json.dumps([u.as_dict() for u in User.query.all()+Todo.query.all()])


@app.route('/', methods = ['POST'])
def create_dev():
    if not request.json or not 'name' in request.json:
        abort(400)
    dev = Todo(request.json.todo_ID, request.json.get('todo_ID',''), request.json.UserID, request.json.get('UserID',''),
               request.json.details,request.json.get('details',''))
    db.session.add(dev)
    db.session.commit()
    return json.dumps([{'dev': dev}]), 201

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

【问题讨论】:

  • Umm...--header "Content-Type:application/json"...你知道 JSON 是什么样的吗,因为你发布的是 CSV 文件
  • 不,我是菜鸟 :( 我会是:文本"
  • 如果您希望request.json 正常工作,请不要这样做。您需要将text.txt 完全重写为实际上是JSON
  • 啊,伙计...我会尝试弄清楚如何做到这一点
  • 我不能把所有的都保存为 .json 吗?

标签: python rest curl flask


【解决方案1】:

首先,我不建议初学者使用 cURL,例如使用 Postman,或者寻找其他一些您选择的 HTTP 测试工具。

其次,您的数据实际上需要是 JSON

todo.json

{
    "todo_ID": 12,
    "User_ID": 8,
    "details": "Get rid of all the flies in the house."
}

以这个非常简单的 Flask 应用为例。

from flask import Flask, request
app = Flask(__name__)

@app.route('/', methods = ['POST'])
def sample():
    if request.method == 'POST':
        print("POST'd", request.json)
    return "handled"

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

还有cURL它(替换为你的文件路径)

curl -XPOST -d \
  @/path/to/todo.json \
  -H "Content-Type:application/json" \
  http://path.to.flask:port/

我看到请求的输出是handled,在服务器日志中我看到了

POST'd {'User_ID': 8, 'todo_ID': 12, 'details': 'Get rid of all the flies in the house.'}

现在,如果您正在处理 JSON 文档,大多数情况下,最好不要使用任何 SQL 之类的面向列的关系数据库(因为将 JSON“翻译”为列很烦人,尤其是嵌套对象和列表)。例如,请查看 Couchbase 或 MongoDB。

【讨论】:

  • 呃,我尝试了你为 curl 设置的内容,但它不起作用 C:\Windows>curl -X POST -d todo.json -H "Content-Type:application/json" http:/ /1 27.0.0.1:5000/ 表示服务器无法理解请求
  • 文件名上需要@ 符号。还需要完整路径或首先导航到与文件相同的目录。我不认为您的文件位于C:\Windows。或者...就像我说的,根本不要使用 cURL
  • 啊我想学习 curl 如何使用 curl。我在我的 json 文件中犯了一些错误,它应该是 UserID。
  • 哦等等,你在 curl 中改变了很多东西
  • 一步一步来。测试您可以在接触数据库连接之前发布任何内容。在没有 POST 的情况下测试数据库操作......重点是,我的答案有效。至少在linux中。如果这个答案是可以接受的,您可以单击它旁边的复选标记并提出一个新问题,其中包含您遇到的任何其他问题