flask "get_or_404" 类似功能但具有另一个状态代码
flask "get_or_404" like function but with another status code
我知道的:
我们都知道 flask 有一个有用的 query.get_or_404
我们可以调用它到任何 class 对象和 return 对象,或者如果找不到对象则引发 404 错误。
问题:
我有一个非常大的应用程序并使用该函数进行查询,但是当我将数据发送到前端和其他使用我的 API 的应用程序时,它现在变得有点混乱。
当找不到他们正在查询的对象时,它 returns 404 并且当找不到页面时也会发生相同的行为。
我想达到的效果:
我想要一个有意义的响应,它对于每个未找到的对象都是不同的,对于正常的 404 错误消息也是不同的。
示例:
如果我有这个查询:
user = User.query.get_or_404(id)
如果找不到用户,我想提出一个 HTTP 错误和 return 一条类似 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 代码添加一个错误处理程序,这样如果找不到对象,它可以 return {'status':'0message:ge : 'object of the class is not found'}
如何实现?
我已经在 Flask 中检查了该函数,但找不到它
有人有建议吗?
正如 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 ''
去索引时,returns:
{"message": "User 2 not found"}
基于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 来处理您的异常并以您想要的方式响应
我知道的:
我们都知道 flask 有一个有用的 query.get_or_404
我们可以调用它到任何 class 对象和 return 对象,或者如果找不到对象则引发 404 错误。
问题:
我有一个非常大的应用程序并使用该函数进行查询,但是当我将数据发送到前端和其他使用我的 API 的应用程序时,它现在变得有点混乱。 当找不到他们正在查询的对象时,它 returns 404 并且当找不到页面时也会发生相同的行为。
我想达到的效果:
我想要一个有意义的响应,它对于每个未找到的对象都是不同的,对于正常的 404 错误消息也是不同的。
示例:
如果我有这个查询:
user = User.query.get_or_404(id)
如果找不到用户,我想提出一个 HTTP 错误和 return 一条类似 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 代码添加一个错误处理程序,这样如果找不到对象,它可以 return {'status':'0message:ge : 'object of the class is not found'}
如何实现?
我已经在 Flask 中检查了该函数,但找不到它
有人有建议吗?
正如 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 ''
去索引时,returns:
{"message": "User 2 not found"}
基于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 来处理您的异常并以您想要的方式响应