Nginx + uWsgi + Djangoの奇妙なjson応答動作

django json nginx python uwsgi
Nginx + uWsgi + Djangoの奇妙なjson応答動作

いくつかの技術仕様:

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

他のjson_status_codeとメッセージを含むJsonResponseのサブクラスがいくつかあります。

見る:

application.status == Application.STATUS_REMOVEDの場合:JsonApplicationSuspendedResponse()を返します

return JsonResponse()

問題:

アプリケーションのステータスが変化しているときでも、3〜4秒間は言うことなく古いjsonを受け取り、JsonApplicationSuspendedResponse()を正しく返します。

データベースアプリケーションステータスの更新がすぐに行われることを確認しました。また、uWSGIを再起動してリクエストを送信すると応答が正しく、逆の状況が発生することにも気付きました。 ステータス変更後の2番目のリクエストには、古いjsonが含まれる場合があります。

彼らは少数のセンサーのために応答を書いており、彼女のリフレッシュに問題があったように見えます(キャッシュは無効になっています)。

それが問題になる可能性のあるアイデアはありますか?

Apache2とmod_wsgiで同じコードが正常に機能します

一定

これは本当に愚かなバグで、JsonResponseでは次のようになりました。

def __init__(self, json={}, *args, **kwargs):

part * json = \ {} *はここで非常に重要です。initの後のJsonResponseとJsonResponseの各サブクラスは初期辞書とその内容を共有しているため、答えは変わらないように見えました。

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


ベストアンサー

Pythonオプティマイザーを無効にしようとしましたか(uWSGI構成ファイルから最適化オプションを削除します)?

js / html / clientの問題のように見えても、オブジェクトによっては、最適化が有効になっていると、何らかの混乱を引き起こす可能性があります。 また、サポートされていない1年以上前のバージョンにダウングレードするなどの愚かなアドバイスに従わないでください。

0


タイトルとURLをコピーしました