Когда создаются Flask ресурсы? - PullRequest
4 голосов
/ 17 января 2020

Я новичок в Flask. У меня есть класс ресурсов, который обрабатывает запросы POST. Обработка запросов довольно сложна и не может быть полностью в функции post. Получу ли я новый экземпляр ресурса для каждого запроса? Или экземпляры используются повторно? Безопасно ли для меня что-то вроде:

class MyResource(Resource):
    def post(self):
        self.var = 17
        self.do_some_work()
        return self.var * self.var

Гарантирует ли Flask, что мой экземпляр ресурса не будет использоваться для других транзакций?

1 Ответ

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

Объекты ресурсов создаются во время обработки запроса, и они не являются постоянными. Помните, что принципы REST гласят, что API должны быть без состояний . Если вы хотите хранить данные между запросами, вам следует использовать какую-то базу данных.

Самый простой способ доказать, что я сказал, - это использовать print (id(self)) в вашем обработчике get и несколько раз инициировать запрос. Вы увидите, что объект всегда меняется.

Теперь, если вас интересует Flask внутреннее , здесь мы go. Класс Resource является частью Flask -RESTtful , и в документации говорится следующее:

Ресурсы построены поверх Flask подключаемых представлений , предоставляя вам легкий доступ к нескольким методам HTTP, просто определяя методы на вашем ресурсе.

Ресурсы добавляются методом Resource.add_resource () , и он просто регистрирует базовый Вид объект.

if self.app is not None:
    self._register_view(self.app, resource, *urls, **kwargs)
else:
    self.resources.append((resource, urls, kwargs))

Resource._register_view () метод делает много сумасшедших вещей, но наиболее значимыми являются две строки:

resource_func = self.output(resource.as_view(endpoint, *resource_class_args, **resource_class_kwargs))
...
self.blueprint_setup.add_url_rule(url, view_func=resource_func, **kwargs)

Здесь вы можете видеть, что объект представления предоставляет обработчик это будет связано с путем URL. Этот обработчик будет вызываться каждый раз, когда к этому маршруту будет сделан HTTP-запрос.

Наконец, мы добрались до ядра, в методе View.as_view () , он создает функцию на лету, и эта функция будет представлять обработчик маршрута.

def view(*args, **kwargs):
    self = view.view_class(*class_args, **class_kwargs)
    return self.dispatch_request(*args, **kwargs)

Как видите, эта функция будет создавать новый объект каждый раз, когда должен быть отправлен запрос, и, как вы уже догадались, view_class содержит ваш собственный класс для обработки запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...