Python Flask-Restful Error: Delete method in API is deleting ALL database entries
Python Flask-Restful Error: Delete method in API is deleting ALL database entries
我已经用 peewee 编写了一个 flask-restful API 和一个 SQLite 数据库。我可以 'get' 在我为其存储数据的艺术作品列表中。我也可以 'get' 单件,'post' 和 'put' 没有问题。但是,如果我想删除单个片段,我的 API 将删除所有片段条目。现在我正在使用 postman 测试我的 API,所以我知道这不是 AJAX 或 javascript 错误(我稍后会写)。任何指导都可能有所帮助。
我试图增加发出删除请求所需的查询数量,其中我的数据库中的 created_by 字段(这是一个整数 id)必须与用户身份验证的 id 匹配。我创建了两个用户并分别发布了两个不同的片段,运行 对一个片段的删除请求仍然删除了所有片段。
def piece_or_404(id):
try:
piece = models.Piece.get(models.Piece.id==id)
except models.Piece.DoesNotExist:
abort(404)
else:
return piece
class Piece(Resource):
def __init__(self):
self.reqparse = reqparse.RequestParser()
self.reqparse.add_argument(
'title',
required=True,
help='No title provided',
location=['form', 'json']
)
self.reqparse.add_argument(
'location',
required=True,
help='No url provided',
location=['form', 'json']
)
self.reqparse.add_argument(
'description',
required=False,
nullable=True,
location=['form', 'json'],
)
self.reqparse.add_argument(
'created',
type=inputs.date,
required=False,
help='Date not in YYYY-mm-dd format',
location=['form', 'json']
)
self.reqparse.add_argument(
'price',
type=inputs.positive,
required=True,
help='No price provided',
location=['form', 'json']
)
self.reqparse.add_argument(
'created_by',
type=inputs.positive,
required=True,
help='No user provided',
location=['form', 'json']
)
super().__init__()
@auth.login_required
def delete(self, id):
try:
Piece = models.Piece.select().where(
models.Piece.id==id
).get()
except models.Piece.DoesNotExist:
return make_response(json.dumps(
{'error': 'That Piece does not exist or is not editable'}
), 403)
query = Piece.delete()
query.execute()
return '', 204, {'Location': url_for('resources.pieces.pieces')}
如果我有 ID 为 1、2 和 3 的片段,那么 运行 url.com/api/v1/pieces/1 上的有效删除请求应该只删除 ID 为1.
问题是您在一个实例上使用 table 级别的方法 delete()
。您还可以使用行级方法 delete_instance()
。参见:http://docs.peewee-orm.com/en/latest/peewee/api.html#Model
关于如何解决这个问题,您有两种选择:
1 更改您对 delete 的调用以添加与 select.
匹配的位置
query = models.Piece.delete().where(models.Piece.id==id)
query.execute()
见http://docs.peewee-orm.com/en/latest/peewee/api.html#Model.delete
(注意警告!)
2 在对象实例上使用delete_instance()
方法:
Piece.delete_instance()
见http://docs.peewee-orm.com/en/latest/peewee/api.html#Model.delete_instance
我已经用 peewee 编写了一个 flask-restful API 和一个 SQLite 数据库。我可以 'get' 在我为其存储数据的艺术作品列表中。我也可以 'get' 单件,'post' 和 'put' 没有问题。但是,如果我想删除单个片段,我的 API 将删除所有片段条目。现在我正在使用 postman 测试我的 API,所以我知道这不是 AJAX 或 javascript 错误(我稍后会写)。任何指导都可能有所帮助。
我试图增加发出删除请求所需的查询数量,其中我的数据库中的 created_by 字段(这是一个整数 id)必须与用户身份验证的 id 匹配。我创建了两个用户并分别发布了两个不同的片段,运行 对一个片段的删除请求仍然删除了所有片段。
def piece_or_404(id):
try:
piece = models.Piece.get(models.Piece.id==id)
except models.Piece.DoesNotExist:
abort(404)
else:
return piece
class Piece(Resource):
def __init__(self):
self.reqparse = reqparse.RequestParser()
self.reqparse.add_argument(
'title',
required=True,
help='No title provided',
location=['form', 'json']
)
self.reqparse.add_argument(
'location',
required=True,
help='No url provided',
location=['form', 'json']
)
self.reqparse.add_argument(
'description',
required=False,
nullable=True,
location=['form', 'json'],
)
self.reqparse.add_argument(
'created',
type=inputs.date,
required=False,
help='Date not in YYYY-mm-dd format',
location=['form', 'json']
)
self.reqparse.add_argument(
'price',
type=inputs.positive,
required=True,
help='No price provided',
location=['form', 'json']
)
self.reqparse.add_argument(
'created_by',
type=inputs.positive,
required=True,
help='No user provided',
location=['form', 'json']
)
super().__init__()
@auth.login_required
def delete(self, id):
try:
Piece = models.Piece.select().where(
models.Piece.id==id
).get()
except models.Piece.DoesNotExist:
return make_response(json.dumps(
{'error': 'That Piece does not exist or is not editable'}
), 403)
query = Piece.delete()
query.execute()
return '', 204, {'Location': url_for('resources.pieces.pieces')}
如果我有 ID 为 1、2 和 3 的片段,那么 运行 url.com/api/v1/pieces/1 上的有效删除请求应该只删除 ID 为1.
问题是您在一个实例上使用 table 级别的方法 delete()
。您还可以使用行级方法 delete_instance()
。参见:http://docs.peewee-orm.com/en/latest/peewee/api.html#Model
关于如何解决这个问题,您有两种选择:
1 更改您对 delete 的调用以添加与 select.
匹配的位置query = models.Piece.delete().where(models.Piece.id==id)
query.execute()
见http://docs.peewee-orm.com/en/latest/peewee/api.html#Model.delete (注意警告!)
2 在对象实例上使用delete_instance()
方法:
Piece.delete_instance()
见http://docs.peewee-orm.com/en/latest/peewee/api.html#Model.delete_instance