2015-09-09 4 views
0

В настоящее время я получаю запрос объект в моей модели Django используя следующий код:Как создать глобальные переменные, доступные в моделях через промежуточное ПО в Django?

request_user = None 
for frame_record in inspect.stack(): 
    if frame_record[3] == 'get_response': 
     request_user = frame_record[0].f_locals['request'].user 

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

Я знаю, как создать промежуточное программное обеспечение. Мой вопрос - это то, что «может быть» установлено в промежуточном программном обеспечении, к которому имеет доступ модель? Я могу видеть только запрос, к которому нельзя получить доступ непосредственно в модели. У Django есть глобальная переменная в сеансе или что-то в этом роде?

+1

Вы почти наверняка не будете делать такую ​​интроспекцию кода, которую вы описываете выше. Почему вы не можете просто передать пользователя в модельный метод в качестве аргумента? Или поместить идентификатор пользователя в переменные сеанса? –

+0

Мне нужен объект запроса. Мне нужно знать, кто делает запрос и некоторую информацию META из запроса. – Prometheus

+1

Почему вы не передаете объект 'request' вашей модели? Я не думаю, что установка чего-то в промежуточном программном обеспечении - правильный подход. –

ответ

1

Самый прямой способ (и наименее подверженный ошибкам) ​​- просто создать новую функцию, которую вы вызываете из своего представления, и передать запрос вместе с любыми другими параметрами, которые вам нужны.

Как правило, вы хотите отделить свои проблемы, так что методы модели должны только принимать базовые атомные типы (строки, диктофоны, списки, числа и т. Д.) Или другие экземпляры модели. Материал, который имеет дело с запросами и ответами, должен быть функциями на уровне представления, а материал, который используется для форматирования в шаблонах, явно является вспомогательными функциями шаблона. Это поможет упростить реорганизацию или редизайн позже.

Глобалы никогда не будут отвечать.

1

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

Если вам просто нужно получить доступ к объекту request, вы должны просто передать запрос своей модели. Там вы можете получить доступ к словарю request.user и request.META.

1

Я думаю, что вы должны установить process_request() вместо этого, чтобы установить переменную.

2

Хотя это, как правило, не способ сделать это, иногда есть причины (мы используем менеджеров на наших моделях, которые только когда-либо возвращают объекты, которые текущий пользователь может видеть, - он хочет знать запрос, и мы надеемся, 't контролировать аргументы, вызываемые функциями с).

Для этого мы используем django-tls. Это промежуточное программное обеспечение, которое ставит запрос в глобальном.

Но, вообще говоря, ваши модели не должны знать, что что-то вроде HTTP существует, или делать какие-либо предположения о пользовательском интерфейсе. Зависимости должны идеально работать только в одном направлении: представления знают, что существуют модели, поэтому модели не должны знать, что существуют представления. Вы будете рады, что сделали это, если вам придется делать то же самое в задачах Celery, или командах управления, или из случайного кода Python.