python - flask "get_or_404"类似功能但具有另一个状态代码

标签 python flask sqlalchemy flask-sqlalchemy http-error

我所知道的:

我们都知道 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找不到类'}

我怎样才能实现它?

我已经在 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 ''

当转到索引时,它返回:

{"message": "User 2 not found"}

关于python - flask "get_or_404"类似功能但具有另一个状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53042728/

相关文章:

python - Sqlalchemy complex NOT IN another table query

python - PYODBC ProgrammingError : ('42000' , “[42000] [Microsoft][Pilote ODBC Microsoft Access]

python - 如何在 2D 平面上可视化 4D 数据?

python - 如何在可接受的时间内让所有正在运行的 Python 进程在 Windows 下运行?

python - .strip 不会删除某些字符串上的换行符

javascript - 基于服务器的 Bokeh 图更新

python - 我在 python 的 Flask 教程的开头,我不明白这一段

python - 为什么某些 Flask session 值在关闭浏览器窗口后从 session 中消失,但稍后又重新出现而无需我添加它们?

python - 使用查找值而不是外键 ID 在 SQLAlchemy 中创建新实例

Python SQLAlchemy : Data source name not found and no default driver specified