我所知道的:
我们都知道flask具有一个有用的query.get_or_404
,我们可以将其调用到任何类对象并返回该对象,如果找不到该对象,则会引发404错误。
问题:
我有一个非常大的应用程序,并使用该函数进行查询,但是当我向前端和其他使用我的API的应用程序发送数据时,它变得有些混乱。 当找不到要查询的对象时,它会返回404,并且当找不到页面时也会发生相同的行为。
我要实现的目标:
我希望有一个有意义的响应,该响应对于每个未找到的对象都不同,对于正常的404错误消息也不同。
示例:
如果我有此查询:
user = User.query.get_or_404(id)
如果找不到该用户,我想引发HTTP错误并返回类似user not found
的消息
到目前为止我已经尝试过:
user = User.query.get(id)
if user:
#do something
else
return {'status':'01', 'description': 'user not found'}
# or raise a http error
这种方法的问题是我无法维护正在处理的应用程序,它将要求我在将get_or_404与该代码一起使用的所有地方进行更改。
我在想什么:
创建类似query.get_or_404
的函数,但带有另一个状态消息
例如query.get_or_415
,并为415 HTTP代码添加错误处理程序,这样,如果未找到对象,它可以返回{'status':'0message:ge : 'object of the class is not found'}
我该如何实现?
我已经在Flask中检查了该功能,但找不到它
有人提出建议吗?
答案 0 :(得分:3)
如bereal所述,您确实应该使用flask-SQLAlchemy
的BaseQuery并从那里添加自己的功能。我将检查是否也可以向此方法添加一些消息传递系统。
import json
from flask import Flask, abort, Response
from flask_sqlalchemy import SQLAlchemy, BaseQuery
class CustomBaseQuery(BaseQuery):
def get_or_415(self, ident):
model_class_name = ''
try:
model_class_name = self._mapper_zero().class_.__name__
except Exception as e:
print(e)
rv = self.get(ident)
if not rv:
error_message = json.dumps({'message': model_class_name + ' ' + str(ident) + ' not found'})
abort(Response(error_message, 415))
return rv
app = Flask(__name__)
db = SQLAlchemy(app, query_class=CustomBaseQuery)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
db.create_all()
user = User(username='foo')
db.session.add(user)
db.session.commit()
@app.route('/')
def index():
User.query.get_or_415(1)
User.query.get_or_415(2)
return ''
转到索引时,它返回:
{"message": "User 2 not found"}
答案 1 :(得分:1)
基于this答案
您可以这样写:
from sqlalchemy.orm import Query
class MyQuery(Query):
def get_or_415(self, pk):
instance = self.get(pk)
if not instance:
raise HttpException(code=415)
return instance
然后,您可以使用flask error handling来处理异常并以所需的方式进行响应