使用GET Flask Resting MongoEngine干净代码管理多个参数

问题描述 投票:0回答:1

我正在使用flask_restful创建一个API,例如,我想使用两个将由GET传递的参数(标记和作者)进行搜索。

使用下面的代码,我可以做到这一点。但是,有必要我传递两个参数。我希望用户传递的任何参数仍然可以搜索它,

示例:如果我通过了tag = tech,则响应应该包含tag技术和所有作者的所有新闻;如果我也通过了author,则应将tag视为全部-我认为你明白了-

class ArticleAPI(Resource):
    def get(self):
        tag=request.args.get('tag','')
        auth=request.args.get('author','')

        news = News.objects.filter(topic=tag,author=auth).to_json()
        return Response(news, mimetype="application/json", status=200)

我知道我可以像这样做很长时间,但是看起来很丑:`(

    if tag is not None and auth is not None :
            news = News.objects.filter(topic=tag,author=auth).to_json()
        elif tag is not None :
            news = News.objects.filter(topic=tag).to_json()
        elif auth is not  None:
            news = News.objects.filter(author=auth).to_json()

我正在使用Flask_mongoengine

from flask_mongoengine import MongoEngine

db = MongoEngine()

def initialize_db(app):
    db.init_app(app)

python mongodb flask mongoengine flask-mongoengine
1个回答
1
投票

我认为您正在询问如何以更简洁的方式将关键字参数传递给.filter()方法。

According to the mongoengine docs, .filter() is an alias for __call__()。它需要一个mongoengine docs对象,或.filter()参数的关键字参数。您的代码使用关键字样式。

您可以将__call__()Query变量放入**querytag

类似这样的东西:

auth

现在您可以根据需要添加任意数量的这些参数,并且语法应该相同。

dict这是我能想到的最简洁的方法:

then unpack them using a double splat as keyword arguments.

就是说,通常需要进行安全权衡,以盲目的获取用户提供的数据并传递到数据库中。我对Mongo的处理方式知之甚少,无法明智地谈论这里的最佳实践。另外,您在UI端命名的名称可能在数据库端没有相同的名称。

fdict = dict() if tag : fdict['tag'] = tag if auth: fdict['auth'] = auth news = News.objects.filter(**fdict).to_json() ,但是很长一段时间我都没有做过MongoDB的工作,而且语法似乎非常具体,所以我不会在这里尝试。 :)

© www.soinside.com 2019 - 2024. All rights reserved.