Как работает декоратор маршрута, используемый в Flask - PullRequest
0 голосов
/ 17 января 2020

Я знаком с основами декораторов Python. Однако я не понимаю, как работает этот специфицированный c декоратор, используемый для Flask маршрутов.

Вот фрагмент кода с сайта Flask:

from flask import Flask, escape, request

app = Flask(__name__)

@app.route('/')
def hello():
    name = request.args.get("name", "World")
    return f'Hello, {escape(name)}!'

.route('/') - это часть, которая меня смущает. Я видел, как используются декораторы: аннотация декоратора обычно является функцией, которая принимает один аргумент - саму декорированную функцию, которая затем может быть выполнена внутри декоратора. Но здесь все по-другому.

Спасибо.

Обновление: Спасибо за подсказку о self во втором фрагменте моего кода. Будучи новичком в Python, я полностью забыл, что первый аргумент something должен быть self. На второй взгляд, я не думаю, что пример помогает прояснить вопрос и поэтому удалил его.

Ответы [ 2 ]

1 голос
/ 17 января 2020

Похоже, у вас есть пара неправильных представлений, которые, мы надеемся, мы можем выяснить. Во-первых, декоратор - это просто термин ( и некоторый язык "sugar", синтаксис @decorator ) для вызываемого объекта, который принимает вызываемый элемент и возвращает другой вызываемый элемент. Этот вызываемый может быть функцией ( например, def foo(func)) или методом ( например, obj.method(func)) - он просто должен быть чем-то, что принимает вызываемый и возвращает один .

В случае декоратора Flask s @app.route вы передаете свою функцию hello объекту ( объект flask.Flask, который я считаю ) route метод. В свою очередь, он добавляет вашу функцию и связанную с ней конфигурацию в свою «память» для маршрутизации, как только приложение Flask получает указание начать обслуживание запросов.

Во-вторых, в вашем примере def something(arg1, arg2): - первый аргумент переданный методу объекта при вызове является экземпляром объекта, обычно называемым self

Учебник для Python Decorators может быть хорошим местом для начала, чтобы узнать, как / почему они работают так, как работают.

0 голосов
/ 17 января 2020

Декоратор - это просто функция, которая принимает функцию в качестве параметра и возвращает другую функцию. Декоратор, который принимает аргументы (например, flask route decorator), должен возвращать функцию, которую можно использовать как простой декоратор.

Например, мы могли бы написать этот route decorator следующим образом:

routes = {}


def route(path):
    def inner(func):
        global routes
        routes[path] = func
        return func

    return inner

Вызов route('/') возвращает функцию, которая принимает функцию в качестве аргумента, которая обновляет глобальную переменную routes, используя значение path, переданное внешней функции, и значение func Получено внутренней функцией.

Если мы используем это для пары функций:

@route('/')
def func1():
    ...

@route('/example')
def func2():
    ...

Затем мы можем проверить переменную routes и увидеть, что теперь она отображает пути к соответствующим функции. Запуск:

print(routes)

Создает что-то вроде:

{'/': <function func1 at 0x7f0c4aeac050>, '/example': <function func2 at 0x7f0c4aeb1e60>}
...