Nginx + UWSGI + Django странное поведение ответа JSON - PullRequest
1 голос
/ 28 сентября 2011

Некоторые технические характеристики:

  • CentOS 6.0
  • uWSGI 0.9.9.2
  • Nginx 1.0.5
  • Django 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)

JSON HttpResponse:

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):

part json = {} здесь очень важно, JsonResponse и каждый подкласс JsonResponse после init разделяли исходный 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}

Спасибо за ваше время

1 Ответ

0 голосов
/ 29 сентября 2011

вы пытались отключить оптимизатор python (уберите опцию оптимизации из файла конфигурации uWSGI)?

Даже если это выглядит как проблема js / html / client, некоторые объекты могут привести к путаницеоптимизации включены.И, пожалуйста, не следуйте глупым советам, например, переходу на неподдерживаемые версии более 1 года.

...