Управление несколькими параметрами с помощью GET Flask restful MongoEngine Clean Code - PullRequest
0 голосов
/ 06 марта 2020

Я создаю API с flask_restful и хочу найти, например, два параметра, которые будут переданы GET, tag и author.

с кодом ниже, я могу это сделать. Однако необходимо передать два параметра. Я хочу, чтобы любой параметр, который передал пользователь, все еще искал его,

Пример: если я передал 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)

1 Ответ

1 голос
/ 06 марта 2020

Я думаю, вы спрашиваете, как передать ключевые аргументы в метод .filter() более кратким способом.

В соответствии с mongoengine docs, .filter() является псевдонимом для __call__(). Он принимает Query объект или ключевые аргументы для параметра **query. Ваш код использует стиль ключевых слов.

Вы можете поместить переменные tag и auth в dict, , а затем распаковать их, используя в качестве аргументов в качестве ключевого слова двойной восклицательный знак.

Примерно так :

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()

Тем не менее, обычно существует компромисс безопасности для слепого взятия предоставленных пользователем данных и их передачи в базу данных. Я не знаю достаточно о том, как Mon go справляется с этим, чтобы разумно говорить о том, что является лучшей практикой здесь. Кроме того, то, что вы называете на стороне пользовательского интерфейса, может не совпадать с именем на стороне БД.

Это также возможно при использовании объекта Query, , но я не сделал ничего MongoDB работает долго и синтаксис кажется очень специфичным c, поэтому я не буду здесь пытаться. :)

...