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 来处理您的异常并以您想要的方式响应