功能类似的烧瓶“ get_or_404”,但带有另一个状态代码

时间:2018-10-29 09:47:40

标签: 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 class is not found'}

我该如何实现?

我已经在Flask中检查了该功能,但找不到它

有人提出建议吗?

2 个答案:

答案 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来处理异常并以所需的方式进行响应