我正在使用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)
我认为您正在询问如何以更简洁的方式将关键字参数传递给.filter()
方法。
According to the mongoengine docs
, .filter()
is an alias for __call__()
。它需要一个mongoengine docs
对象,或.filter()
参数的关键字参数。您的代码使用关键字样式。
您可以将__call__()
和Query
变量放入**query
,tag
类似这样的东西:
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的工作,而且语法似乎非常具体,所以我不会在这里尝试。 :)