使用 GET Flask restful MongoEngine Clean Code 管理多个参数

Manage Multiple Params with GET Flask restful MongoEngine Clean Code

我正在用 flask_restful 创建一个 API,我想搜索带有两个参数的示例,这两个参数将通过 GET 传递,标签和作者。

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

示例感谢: 如果我通过了 tag=tech 响应应该包含所有带有标签 tech 和所有作者的新闻如果我也通过了作者它应该将标签视为全部 - 我想你明白了 -

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)

我想你问的是如何以更简洁的方式将关键字参数传递给 .filter() 方法。

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

您可以将 tagauth 变量放入 dictthen unpack them using a double splat as keyword arguments.

像这样:

fdict = dict()
if tag : fdict['tag'] = tag
if auth: fdict['auth'] = auth

news = News.objects.filter(**fdict).to_json()

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

这是我能想到的最干净的方式:

news = News.objects.filter(**request.args).to_json()

也就是说,盲目地获取用户提供的数据并将其传递到数据库通常需要进行安全权衡。我不太了解 Mongo 如何处理此问题,无法明智地谈论这里的最佳做法。另外,您在 UI 端命名的名称可能与数据库端的名称不同。

This is also possible using a Query object, 但我已经很久没有做任何 MongoDB 的东西了,语法似乎很具体,所以我不会在这里尝试。 :)