Некоторые технические характеристики:
- ЦенОС 6.0
- UWSGI 0.9.9.2
- Нгинкс 1.0.5
- Джанго 1.3.1
uWSGI:
[uwsgi]
socket = 127.0.0.1:3031
master = true
processes = 5
uid = xx
gid = xx
env = DJANGO_SETTINGS_MODULE=xx.settings
module = django.core.handlers.wsgi:WSGIHandler()
post-buffering = 8192
harakiri = 30
harakiri-verbose = true
disable-logging = true
logto = /var/log/xx.log
vacuum = true
optimize = 2
Сериализатор JSON:
class LazyEncoder(simplejson.JSONEncoder, json.Serializer):
def default(self, obj):
if isinstance(obj, Promise):
return force_unicode(obj)
if isinstance(obj, Decimal):
u_value = force_unicode(obj)
if u'.' in u_value:
return float(u_value)
return int(u_value)
return super(lazy_encoder, self).default(obj)
HTTP-ответ в формате JSON:
class JsonResponse(HttpResponse):
status_code = 200
json_status_code = 200
message = _('OK')
def __init__(self, json={}, *args, **kwargs):
mimetype = kwargs.pop('mimetype', 'application/json')
if not 'status' in json:
json['status'] = {'code': self.json_status_code, 'message': self.message}
super(JsonResponse, self).__init__(LazyEncoder(indent=settings.DEBUG and 4 or None, separators=settings.DEBUG and (', ', ': ') or (',', ':')).encode(json), mimetype=mimetype, *args, **kwargs)
У меня есть несколько подклассов JsonResponse с другим json_status_code и сообщением.
Вид:
....
if application.status == Application.STATUS_REMOVED:
return JsonApplicationSuspendedResponse()
....
return JsonResponse()
ПРОБЛЕМА:
Даже когда статус приложения меняется, случается, что я получаю старый json, скажем, в течение 3-4 секунд, а затем он правильно возвращает JsonApplicationSuspendedResponse().
Я проверил, что обновление статуса приложения базы данных происходит немедленно, также заметил, что если я перезагружу uWSGI и отправлю ответ на запрос, то произойдет обратная ситуация. Второй запрос после изменения статуса может иметь старый json.
Похоже, что они пишут ответ для нескольких сенкодов и имеют проблемы с ее обновлением (кэш отключен).
Любые идеи, где это может быть проблемой?
Тот же код отлично работает на Apache2 и mod_wsgi.
исправлено
Это была действительно глупая ошибка, в JsonResponse у меня было:
def __init__(self, json={}, *args, **kwargs):
часть json={} здесь очень важна, JsonResponse и каждый подкласс JsonResponse после инициализации совместно использовали исходный dict и его содержимое, поэтому ответ выглядел так, как будто он не изменился.
def __init__(self, json=None, *args, **kwargs):
mimetype = kwargs.pop('mimetype', 'application/json')
if not json:
json = {}
if not 'status' in json:
json['status'] = {'code': self.json_status_code, 'message': self.message}
Спасибо за ваше время