2013-12-20 5 views
1

Django 애플리케이션의 각 사용자는 부서와 연관되어 있으며 거의 ​​모든 요청에는 부서 관련 처리가 관련되어 있습니다. 따라서 전체 응용 프로그램에서 부서 개체를 사용할 수있게 만들고 싶습니다.Django 미들웨어, 세션 및 캐싱 시작하기

이들 중 어느있는 경우, 취할 수있는 가장 적절한 방법은 다음과 같습니다

단순히 DB에서 관련 부서를 검색하고 request 객체에 부착
  • 사용자 정의 미들웨어, 종류의, request.department로 말할
      Django의 AuthenticationMiddleware처럼 현재 로그인 한 사용자는 request.user에 있습니다. (예 : herehere)
    1. 사용자가 로그인 할 때 세션에 부서를 배치 한 다음 장고의 request.session 인터페이스를 사용하여보기에서 해당 부서를 검색합니다.

    아직 장고의 캐싱 기능에 익숙하지는 않았지만 모든 요청에 ​​대해 추가 DB 히트가 발생하지 않도록 사용자별로 단위를 캐시하고 싶습니다. 나는 그 Django's sessions provide built-in caching support을 참조하십시오. 또한 캐싱은 첫 번째 방법으로도 구현 될 수 있다고 생각합니다.

    이런 종류의 작업에 사용자 정의 미들웨어 (위의 # 1)보다 세션 (위의 # 2)을 사용하는 것이 유리합니까? 미들웨어 접근법은 내부 API 관점에서 보면 깨끗해 보입니다. 그러나 이것이 세션이 설계된 것과 정확히 일치하는 것 같습니다. 아마도 이것을 사용하기 시작할 수있는 적절한 기회일까요?

    어떤 안내해 주셔서 감사합니다.

  • 답변

    1

    기본적으로 두 가지 방법 모두 매우 유사합니다. request.session 접근법은 미들웨어에서 캐싱을 수동으로 설정하여 추가 단계를 없앨 수 있습니다. 세션 접근 방식의 나쁜 점은 캐시 저장 장치를 사용하면 데이터를 사용할 수 있다는 보장이 없다는 것입니다. 예를 들어, 비활성화 된 쿠키를 가진 사용자의 0.1 %가있을 수 있습니다. 사용자가 memcache 저장소를 사용하고 있습니다. 재배포시 memcache 서버를 다시 시작해야하며 로그인 한 사용자가 데이터를 잃어 버릴 수 있습니다. 요약하면, 중요한 데이터를 위해 캐시 스토리지가있는 세션을 사용하십시오. 내 프로젝트에서는 제 1 옵션을 사용하는 것이 더 큰 수준의 컨트롤을 제공합니다. 당신은 설정할 수 있습니다

    특수 미들웨어가 요청에 view_name 변수를 추가하고 위치를 제어 할 수있게하고 무엇을 보여주고 있습니다

    class NameMiddleware(object): 
        def process_view(self, request, view_func, view_args, view_kwargs): 
         # add current view 
         if isinstance(view_func, str): 
          request.view_name = view_func 
         elif hasattr(view_func, '__name__'): 
          request.view_name = view_func.__name__ 
    

    를 그런 다음에 추가 정보를 제공하는 경우에 더 큰 제어를해야합니다 요청, (당신이 원하는 경우 데이터베이스에 요청을 proxing) 만 선택한 뷰에 부서 INF를 부착하고 효율적인 방법으로 결과를 캐시 할 수 context_processors 예를 들면 : 제안 및 피드백, Dmytriy에 대한

    def department_context_processor(request): 
        if hasattr(request, 'view_name'): 
         if request.view_name == 'department_view1' or request.view_name == 'department_view2': 
          departments = cache.get('department_'+str(request.user), None) 
          if departments is None: 
           departments = Department.objects.filter(user=request.user) 
           cache.set('department_'+str(request.user), departments, 60*60) 
          if departments: 
           return { 
            'departments': departments 
           } 
        return {} 
    
    +0

    감사합니다 ! 정말 도움이되었습니다. 세션 데이터에 대해 쿠키 기반 저장소를 사용하는 것이 유스 케이스의 종류입니까? 이것으로, 부서 자체를 쿠키에 저장하는 것입니다. 올바르게 이해하면 세션 데이터 캐싱이 불필요합니다. 모든 요청에 ​​대해 클라이언트가 데이터를 보내고 서버에서 사용할 수 있습니다. – tino

    +0

    @tino 예, 데이터가 매우 간단하고 캐싱을 망치고 싶지 않은 경우 쿠키 기반 세션 사용에는 몇 가지 중요한 제한 사항이 있습니다. 예를 들어 도메인 당 쿠키 크기가 4Kb로 제한되어 있으면보다 자세한 비교 정보를 찾을 수 있습니다 [여기] (http://stackoverflow.com/a/18240232/1255305).어쨌든 쿠키 기반 저장소를 사용하는 경우 사용자가 쿠키를 삭제하고 요청에 포함되지 않은 유스 케이스를 처리해야하며 해킹 당할 수 있으므로 쿠키에 개인 정보를 저장하지 않도록해야합니다 . –

    +0

    알았습니다. 다시 한번 감사드립니다. 그리고 캐싱 예제도 잘 알고 있습니다. – tino