Передача даты в качестве параметра URL на маршрут колбы - PullRequest
0 голосов
/ 24 ноября 2018

Я хочу отфильтровать некоторые результаты базы данных для данного URL с некоторым параметром даты (например, url.com?start=2018-12-12).Обычный способ чтения параметра - с помощью request.args.get, получая доступ к значению базового ImmutableMultiDict, что дает мне необязательные аргументы default и type.

Моя первая попытка теперь была такой:

@app.route()
def event():
   ektempo = request.args.get('start', default = datetime.date.today(), type = datetime.date)
   ...

, которая работает для параметра по умолчанию, но не для переданной строки даты, так как datetime.date требует три целых числа в качестве параметров.Обычно я получаю свой объект даты по datetime.datetime.strptime и строку формата.Есть ли способ передать строку datetime в качестве параметра url во флакон и привести ее питонно к datetime.date.

Мне нравится, как работает request.args.get, но, похоже, я не могу получить datetime.dateОбъект легко из него с заданным параметром URL.Есть ли другой способ получить его с помощью встроенного метода фляги, который проверяет параметр и не указывает ни одного параметра или ValueError дает мне значение по умолчанию?

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Принятое решение делает работу для варианта использования (и получил мой ответ :);тем не менее, если параметр не соответствует ожидаемому формату, он будет устанавливать его в значение по умолчанию (сегодня) в молчании, без обратной связи с вызывающей стороной - так как это является предполагаемым поведением фляги / werkzeug.

Вот как его использовать для проверки и возврата ошибки, если клиент передал недопустимое значение - совмещение решения OP:

from flask import jsonify

def to_date(date_string): 
    try:
        return datetime.datetime.strptime(dateString, "%Y-%m-%d").date()
    except ValueError:
        raise ValueError('{} is not valid date in the format YYYY-MM-DD'.format(date_string))

@app.route()
def event():
    try:
        ektempo = to_date(request.args.get('start', default = datetime.date.today().isoformat()))
    except ValueError as ex:
        return jsonify({'error': str(ex)}), 400   # jsonify, if this is a json api

0 голосов
/ 24 ноября 2018

Как указал Дэниэл Роузман, вы можете передать любую функцию типу, поэтому я просто определил небольшую вспомогательную функцию для преобразования строки даты, и вот она:

def toDate(dateString): 
    return datetime.datetime.strptime(dateString, "%Y-%m-%d").date()

@app.route()
def event():
    ektempo = request.args.get('start', default = datetime.date.today(), type = toDate)
    ...

Даочень классно, спасибо большое Дэниел, именно то, что я искал!:)

...