【问题标题】:Creating new task in database using id with POST使用带有 POST 的 id 在数据库中创建新任务
【发布时间】:2017-04-03 15:50:22
【问题描述】:

我正在尝试根据我将放入 url 的 todo_ID 在我的数据库中创建一个新任务。我可以完全在数据库中发布一个新任务,但我希望服务器选择 todo_ID,所以如果一个人在 url 中键入 /1,它将创建一个 todo_ID = 1 的新任务,并根据什么填写 UserID 和详细信息用户放入。问题是我不知道如何根据 todo_ID 来做,所以有人可以告诉我如何:D

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 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, UserID, details):
        self.UserID = UserID
        self.details = details


  @app.route('/<int:todo_ID>', methods = ['POST'])  #Uses POST method with same URL as GET method to add new information to Todo table.
def create_dev(todo_ID):
    id = Todo.query.create(todo_ID)
    dev = request.json["UserID"],request.json["details"]
    db.session.add(id,dev)
    db.session.commit()
    return "New task has been created.", 201


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

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

【问题讨论】:

  • 您确定存在您的网址中带有 id 的记录吗?
  • 哦……我以为我应该添加一个我以前没有的 id……呃,我不应该有那部分代码吗?现在我想起来了,它看起来像是我更新时需要的东西

标签: python rest post flask


【解决方案1】:

试试

dev.UserID = request.POST["UserID"]

要使 request.json 工作,请将内容类型设置为 application/json。来自Flask documentation

如果 mimetype 是 application/json 这将包含已解析的 JSON 数据。否则这将是无。

更多详情:https://stackoverflow.com/a/20001283/3930114

编辑 1:基于 cmets 讨论的解决方案

@app.route('/<int:todo_ID>', methods = ['POST'])  #Uses POST method    with same URL as GET method to add new information to Todo table.
# Setting todo_ID default to None
def create_dev(todo_ID=None):
    # This if will allow you to not pass id via url and handle in backend. Frankly, first integer field will automatically become autoincrement field in Flask, so I am not even sure why you want to send todo_ID via url but I dont have enough information about your app :)
    if todo_ID is None:
        # write logic to create a todo_ID
        pass
    # Instance of model task
    dev.UserID = request.json["UserID"]
    dev.details = request.json["details"]
    t = Task(todo_ID, dev.UserID, dev.details)
    db.session.add(t)
    db.session.commit()
    return "New task has been created with todo_ID: " + todo_ID, 201

编辑 2:基于 cmets 中的附加信息的解决方案

@app.route('/', methods = ['POST'])  #Uses POST method    with same URL as GET method to add new information to Todo table.
# Setting todo_ID default to None
def create_dev():
    # Instance of model task
    t = Todo(UserID=request.json["UserID"], details=request.json["details"])
    db.session.add(t)
    db.session.commit()
    return "New task has been created with todo_ID: " + todo_ID, 201

PS:我没有测试过这段代码。

参考资料:

【讨论】:

  • 哦,我想我搞砸了我的代码,因为我无法找到我正在尝试制作的新 ID,因为它尚未制作。现在的主要问题是我不知道如何根据 todo_ID 发布数据。同样在我的 curl 语句中,我输入了 application/json ,当我尝试输入新的 todo_ID 时它起作用了,但我希望服务器选择 todo_ID 所以不必输入它。
  • 如果理解正确,您似乎有几个单独的问题未在原始问题中表示,您能否编辑原始问题? > 现在的主要问题是我不知道如何根据 todo_ID 发布数据。你似乎在做正确的事。对于第二个问题,您是在尝试编辑任务还是创建新任务?如果进行编辑,服务器可以使用什么标准来获取 todo_ID?否则,服务器应该选择自动值或尝试使用来自routedefaults
  • 我的主要问题是能够根据 todo_ID 发布数据。我正在尝试创建一个新任务。我已经想出了如何编辑现有任务。
  • 所以我读了两个问题: 1. 你想根据 todo_ID 发布数据:在这种情况下,你说你不是在编辑一个任务,所以你是在创建一个基于 todo_id 的新任务你在某处创造的? 2.新建一个任务:没有自己创建的todo_ID,想让后端弄清楚todo_ID应该是什么,这样你就可以创建任务了……这样有意义吗?
  • 我想做你提到的第二个,所以如果 url 有 /30 那么 todo_ID 应该使用 todo_ID = 30 创建。
猜你喜欢
  • 2020-04-05
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 2014-11-21
  • 2012-11-17
  • 2015-11-26
  • 1970-01-01
相关资源
最近更新 更多