Flask Routes с общей предварительной обработкой параметров - PullRequest
0 голосов
/ 25 ноября 2018

Можно ли выполнить некоторую общую предварительную обработку на маршрутах, когда они совместно используют один и тот же параметр?
У меня есть следующие два маршрута:

@app.route("/<string:filetype>/<int:number>/something", methods=['GET'])
def handle_get_file(filetype, number):
    if filetype == "bad":
        return status.HTTP_400_BAD_REQUEST
    ...some logic that has to do with "something"

@app.route("/<string:filetype>/someotherthing", methods=['GET'])
def handle_some_other_file(filetype):
    if filetype == "bad":
        return status.HTTP_400_BAD_REQUEST
    ...some logic that has to do with "some other thing"

, которые используют один и тот же код, который проверяет тип файла.
Вместо того, чтобы вручную вызывать проверку типа файла, я хотел бы использовать какой-то автоматический шаблон, который сначала выполнит общую часть пути, а затем перейдет к большим маршрутам «что-то» или «что-то другое» далее..

Например,

# this will match first
@app.route("/<string:filetype>/<path:somepath>")
def preprocessing(filetype):
    if filetype == "bad":
        return status.HTTP_400_BAD_REQUEST
    else:
        # process the rest of the route further

Возможно ли реализовать решение для пути, содержащего параметр, но также отделенного от некоторых других элементов?Например: для вышеупомянутой предварительной обработки для запуска на <int:someothernumber>/<string:filetype>/<path:somepath>".

1 Ответ

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

У вас есть много вариантов в этом домене.

Препроцессоры URL запускаются очень рано,

Flask проведет вас через их реализацию в следующем примере:

@app.url_value_preprocessor
def pull_lang_code(endpoint, values):
    g.lang_code = values.pop('lang_code', None)

Источник: http://flask.pocoo.org/docs/1.0/patterns/urlprocessors/

Чтобы использовать это для решения вашей проблемы, я думаю, поэтому я бы начал с чего-то вроде:

@app.url_value_preprocessor
def pull_lang_code(endpoint, values):
    filetype = values.pop('filetype', None)
    if filetype == "bad":
        app.abort(404)
...