хороший способ написать потокобезопасное промежуточное ПО в Django - PullRequest
0 голосов
/ 27 сентября 2018

Я хочу применить обязательную фильтрацию практически ко всем моделям, ко всем запросам в довольно большом приложении django.На самом деле я ищу правильный способ реализации промежуточного программного обеспечения, управляемого запросами (вместо стандартного промежуточного программного обеспечения, управляемого запросами), но без манипуляций с каким-либо драйвером БД (без исправлений, переносов и т. Д.).

Идея состоит в том, чтобы использовать один общий миксин для QuerySets и Managers, чтобы этот метод всегда был доступен:

AnyModel.objects.filter_by_organization()

без необходимости передавать туда параметр.

и более поздние:

AnyModel.org_objects занимаюсь filter_by_organization() самовывозом

Моя главная задача - безопасность потоков.не могли бы вы рассмотреть мой подход ниже?this_thread = threading.local ()

... standard django middleware:
class OrganizationMiddleware(object):
    def process_request(self, request):
        this_thread.request = request

    def process_response(self, request, response):
        if hasattr(this_thread, 'request'):
            del this_thread.request   # doubtful
        return response

    def process_exception(self, request, exception):
        if hasattr(this_thread, 'request'):
            del this_thread.request   # doubtful
    ...

... mixin/manager:
class OrganizationQuerySet(models.QuerySet):
   def _get_current_request(self):
       return getattr(this_thread, "request", None)

   def filter_by_organization(self):
       request = self._get_current_request()
       org_id = getattr(request.user, 'organization_id', None)
       return self.filter(...filtering by org_id + extra logic...)
       # keeping this in one place has additional benefits

... in models: 
org_objects = OrganizationQuerySet.as_manager()

... then using above without a need to pass request
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...