djangoのログ機能を使って、呼び出されたview名とかパラメーターとかを書き出してたんだけど、viewでキャッシュを使うとログを書いてくれなくなるので、それをなんとかしたいという話。
コードにするとこんな感じ
#views.py
...
from django.views.decorators.cache import cache_page
import logging
logger = logging.getLogger("hoge")
@cache_page(60*60*24*30)
def index(request, param1, param2):
logger.info(u"param1:{0} param2:{1}".format(param1, param2))
...
こうするとキャッシュが効いてしまって、1回アクセスした時以外ログが出なくなってしまう。アクセスログ的 な使い方をしたい時に困ってしまう。アクセスログはnginxとかそこらへんのログに任せてた方が良いような気もするが、 django内で何とかしたかったのでrequest_startedシグナルを使って下のようにした
#views.py
from
import logging
logger = logging.getLogger("hoge")
@cache_page(60*60*24*30)
def index(request, param1, param2):
logger.info(u"param1:{0} param2:{1}".format(param1, param2))
...
#ここから追記
from django.core.signals import request_started
import copy
from django.core.handlers.wsgi import WSGIRequest
from django.core.urlresolvers import resolve
def log_before_view(**kwargs):
try:
handler = kwargs["sender"]
environ = copy.copy(kwargs["environ"])
request = WSGIRequest(environ)
match = resolve(request.path_info)
if len(match.args) == 2:
logger.info(u"param1:{0} param2:{1}".format(param1, param2))
except:
pass
request_started.connect(log_before_view)
これでキャッシュが効いてる状態でもログを取ることが出来る