zulip/zephyr/middleware.py

42 lines
1.6 KiB
Python

from decorator import RequestVariableMissingError, RequestVariableConversionError
from zephyr.lib.response import json_error
import logging
import time
logger = logging.getLogger('humbug.requests')
class LogRequests(object):
def process_request(self, request):
request._time_started = time.time()
def process_response(self, request, response):
# The reverse proxy might have sent us the real external IP
remote_ip = request.META.get('HTTP_X_REAL_IP')
if remote_ip is None:
remote_ip = request.META['REMOTE_ADDR']
time_delta = -1
# A time duration of -1 means the StartLogRequests middleware
# didn't run for some reason
if hasattr(request, '_time_started'):
time_delta = time.time() - request._time_started
logger.info('%-15s %-7s %3d %.3fs %s'
% (remote_ip, request.method, response.status_code,
time_delta, request.get_full_path()))
# Log some additional data whenever we return a 40x error
if 400 <= response.status_code < 500:
try:
user_id = request.user.id
except:
user_id = "unknown"
logger.info('status=%3d, data=%s, uid=%s' % (response.status_code, response.content, user_id))
return response
class JsonErrorHandler(object):
def process_exception(self, request, exception):
if hasattr(exception, 'to_json_error_msg') and callable(exception.to_json_error_msg):
return json_error(exception.to_json_error_msg())
return None