@niko83

Как в Django получить объект request из любой части кода?

Объект request передаётся в view.py.

Что делать когда нам нужно получить доступ к этому объекту например в моделе, в каком-то своём модуле или ещё где-то.



При этом не хочется всегда передавать это объект в качестве аргумента.



Хочется иметь гарантированный прямой доступ.



Возможно в Джанго организован паттер Registry, где всегда можно обраться к этому объекту?

Или есть какой-то другой способ добраться к нему.



А если организовавывать самостоятельно паттерн Registry в какой части когда следует проводить регистрацию обекта request в наш реестр?
  • Вопрос задан
  • 3995 просмотров
Решения вопроса 1
enchantner
@enchantner
Глобальные переменные — зло. Вообще в идеале для решения всех проблем у вас есть вьюхи и мидлвари, реквест вообще не должен появляться в моделях, это от лукавого. MVC наше все.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Yngvie
@Yngvie
В той же статье, ссылку на которую дал bekbulatov было решение, но его оттуда удалили в пользу передачи request как параметра.

Можно посмотреть в предыдущую версию. Там используется Middleware для глобального доступа к объекту user, но переделать на request будет не сложно.

Использовать стоит не когда «не хочется всегда передавать это объект в качестве аргумента», а когда такой возможности просто нет.

И не забывайте что код может быть вызван не только из view'хи, но и скажем с management-комманды или консоли.
Ответ написан
Комментировать
@bekbulatov
Разработчики рекомендуют передавать request в виде аргумента. Здесь же про минусы использования threadlocals
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы