Django - добавить контекст к запросу, который будет использоваться представлением

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

Например, у меня есть промежуточное программное обеспечение, которое просматривает запрос и добавляет в запрос разрешения пользователя или некоторую пользовательскую конфигурацию. Представление просматривает эти разрешения и решает, как с их помощью обрабатывать запрос.

Это устраняет необходимость в нескольких представлениях (и нескольких частях в представлении) для запроса этой информации.

Мне интересно, как правильно это сделать. Один из вариантов — просто добавить request.user_permissions=... прямо в запрос. Но есть ли какой-то задокументированный и ожидаемый способ сделать это?

Это специально для разрешений пользователя, потому что вы уже можете получить к ним доступ с помощью request.user.has_perm() в представлении или {% if perms.<app_label>.<permission> %} в шаблоне. Чтобы общий контекст был доступен каждому представлению, изучите написание собственного обработчика контекста

bdoubleu 18.12.2020 19:10

Контекстные процессоры добавляются не в представление, а в шаблон. Промежуточное ПО — это правильное место для добавления вещей в представление.

user1600649 18.12.2020 19:16

Это не специально для разрешений. Как промежуточное ПО должно добавлять «дополнительный контекст» к запросу. Должен ли я использовать атрибут объекта запроса?

user972014 18.12.2020 20:59
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
1 352
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это не идеальный ответ, но по моему опыту я использую этот код. Каждое разрешение сохраняется в логическом значении, которое является истинным или ложным. Вы можете получить к нему доступ в HTML-шаблоне, например.

{% if request.user.is_admin %}
    "Your code here"
{% else %}
    "Your code here"
{% endif %}

а для отправки дополнительного контекста вы должны создать и передать словарь и передать его в качестве аргумента методу рендеринга из представления. Например:

def view(request, slug):
    context = {'administrator':True}
    blog_post = get_object_or_404(BlogPost, slug=slug)
    context['blog_post'] = blog_post

    return render(request, 'blog/detail_blog.html', context)

и получить к нему доступ, как

{% if context.administrator %}
    "Your code here"
{% else %}
    "Your code here"
{% endif %}
Ответ принят как подходящий

Не существует реального документированного способа сделать это, но промежуточное ПО является правильным местом для этого, и простое добавление свойств к объекту запроса также является правильным способом.

Вы можете это подтвердить, потому что Django уже это делает:

Так что просто выберите наиболее удобную структуру данных для вашего варианта использования и привяжите ее к объекту запроса.

Предлагаю делать ссылку на конкретный коммит и не мастерить, иначе номера строк скоро устареют.

Antonis Christofides 24.12.2020 11:49

@Melvyn Как насчет случая, когда этот контекст вычисляется внутри PERMISSION_CLASS? вроде не держится

user972014 26.12.2020 18:36

Я считаю, что, поскольку ваше промежуточное ПО будет вычислять контекст, оно должно быть реализовано как обработчик контекста.

https://docs.djangoproject.com/en/3.1/ref/templates/api/#using-requestcontexthttps://docs.djangoproject.com/en/3.1/ref/templates/api/#writing-your-self-context-processors

Другие вопросы по теме