django middleware

web/Django 2016.08.15 21:36



https://docs.djangoproject.com/ja/1.10/topics/http/middleware/



django에서의 middleware는 모든 request/response의 프로세싱의 훅에 해당합니다. 즉 모든 요청 이벤트를 통과하는 중간 처리과정입니다. 


그렇다면 middleware가 언제 필요한가?! 라고 한다면 


만일 특정 url이 들어왔을 경우에만 처리해야 하는 로직이 있다거나 뷰를 리턴할때마다 무엇인가를 추가하거나 빼거나를 할수도 있습니다. 


즉 특정한 app단에서의 django가 아닌 전체 권한을 가지고 움직일때 쓰이는것이 middleware입니다. ( 윈도우에서의 hooking를 생각하시면 됩니다.)


간단하게 소스로 구현한다면 



testmiddle.py

from django.conf import settings
from django.db import connection
from django.template import Template, Context


class SimpleMiddleware(object):
def __init__(self):
pass
# One-time configuration and initialization.

def process_request(self, request):
return

def process_view(self, request, view_func, view_args, view_kwargs):

print(request, view_args, view_func, view_kwargs)
respose = None
return respose

def process_template_response(self, request, response):
print(request, response)
return response

def process_response(self, request, response):
print(request, response)
return response


파일을 만들어 주고 


settings.py 에서



MIDDLEWARE_CLASSES = [
..................
'post.testMiddle.SimpleMiddleware'
]

MIDDLEWARE_CLASSES = [] 부분에 추가해주면 동작합니다. 쉽죠?!



위의 소스는 간단하게 어떤 함수(훅)이 언제 동작하는지를 간단하게 볼수 있습니다. (django v1.9)


사진출처 : https://docs.djangoproject.com/ja/1.9/topics/http/middleware/#middleware


위의 이미지에서 보는바와 같이 각 요청시에 꼭 통과하는 미들웨어 들이 있고 해당 요청에 따라 작동하는 middleware의 훅이 달라지게 됩니다. 



각 이벤트에 따라 작동하는 훅은 달라지며 특정 요청시에만 훅을 적용하는게 성능상 좋습니다.



좀더 알아보기 위해서 process_response()부분에 다음과 같이 추가합니다.


def process_response(self, request, response):

if connection.queries:
execution_sql_time = sum([float(q['time']) for q in connection.queries])
t = Template(
"""
{{nb_sql}} requet{{nb_sql|pluralize:"e,es"}} en {{execution_sql_time}} second{{execution_sql_time|pluralize:"e,es"}}:
{% for sql in sql_log %}
[{{forloop.counter}}] {{sql.time}}s: {{sql.sql|safe}}
{% endfor %}
""")
print("---------------")
print(t.render(Context({'sql_log':connection.queries,'nb_sql':len(connection.queries),'execution_sql_time':execution_sql_time})))
print("---------------")
print(request, response)
return response

바로 해당 url요청에 실행되는 모든 쿼리와 쿼리 시간을 가져 옵니다. 



정상적으로 잘 가져 오는군요. 이렇듯 django의 전체적인 로직에 관여하고 싶다면 middleware로 구현하면 됩니다. 


단!! 서비스 전체에 걸리는 부하이기 때문에 서비스에 영향이 갈수 있습니다. 


저작자 표시
신고

'web > Django' 카테고리의 다른 글

django middleware  (0) 2016.08.15
django-summernote 사용하기  (4) 2016.07.23
get 방식의 글자 256자 제한은 잘못된 상식  (0) 2016.05.24
Django South migration error   (0) 2015.09.30
django ajax post data and view.py  (0) 2014.11.08
uwsgi logger disable option  (0) 2014.10.24

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret