Является ли промежуточное ПО Django безопасным? - PullRequest
13 голосов
/ 02 июня 2011

Безопасны ли промежуточные программы Django? Могу ли я сделать что-то вроде этого,

class ThreadsafeTestMiddleware(object):

    def process_request(self, request):
        self.thread_safe_variable = some_dynamic_value_from_request

    def process_response(self, request, response):
        # will self.thread_safe_variable always equal to some_dynamic_value_from_request?

Ответы [ 3 ]

28 голосов
/ 02 июня 2011

Почему бы не связать вашу переменную с объектом запроса, например:

class ThreadsafeTestMiddleware(object):

    def process_request(self, request):
        request.thread_safe_variable = some_dynamic_value_from_request

    def process_response(self, request, response):
        #... do something with request.thread_safe_variable here ...
8 голосов
/ 02 июня 2011

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

Как отмечает Стив, решение состоит в том, чтобы добавить его в запрос вместо.

1 голос
/ 04 апреля 2012

Если вы используете mod_wsgi в режиме демона с несколькими потоками, ни один из этих параметров не будет работать.

WSGIDaemonProcess domain.com user = группа www-данных = потоки www-данных = 2

Это сложно, поскольку он будет работать с сервером разработки django (одиночный локальный поток) и давать непредсказуемые результаты в зависимости от времени жизни вашего потока.

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

class ThreadsafeTestMiddleware(object):

    def process_response(self, request, response):
        thread_safe_variable = request.some_dynamic_value_from_request
...