0

Django で json を返すいくつかのメソッドを書いています。私は自分で例外を処理していますが、特定のシナリオでは、クライアントが (とりわけ) 例外 uuid を抽出できるように、Json 本体を含む Http 500 応答を返したいと考えています。

これは正常に機能しましDebug = Trueたが、に設定するFalseと、次のコードはhtmlエラーページになります...

Ret = {"ExceptionId:": "<Exception_uuid>",
       "Message": "Some user-friendly error message"}

return HttpResponse(json.dumps(Ret), content_type="application/json", status=INTERNAL_SERVER_ERROR)

ここで返されるメッセージが例外とはまったく関係がなく、例外が発生したときに独自のコード (または状況によっては一般的なもの) によって生成される理由は、セキュリティへの影響を認識しています。uuid は (理想的にはデータベースに記録されますが、それが不可能な場合はファイルに記録されます) スタック トレース、実際の例外情報などと共に記録されます。ユーザーは、連絡時に uuid で例外を参照できます。

djangoが、不要な、または必要のないあいまいな html ページを妨害しようとしないようにするにはどうすればよいですか?

4

2 に答える 2

2

クライアントが(とりわけ)例外uuidを抽出できるように、Json本体を含むHttp 500応答を返したいです。

TBH、200 以外の応答を有効な XHR 応答として処理するすべての Web ブラウザーを信頼するわけではないため、ブラウザーに解析させたい JSON 応答を返す予定がある場合は、常に 200 応答を返す方がおそらく安全です。

これを行う一般的な方法の 1 つは、呼び出しが成功したかどうかをブラウザーが判断できるように、すべての JSON 応答に対して同じ構造を返すことです。たとえば、次のようなものを返すことができます...

{"result": "Hello, world!", "exception": null}

...うまくいけば、このようなもの...

{"result": null, "exception": "You provided incorrect parameters"}

...失敗した場合。おまけとして、例外を JavaScript 例外に変換して、呼び出し元の関数にスローすることもできます。

アップデート

処理を簡素化するために、すべての AJAX 呼び出しが 1 つの関数を介してルーティングされると、はるかに簡単になります。何かのようなもの...

function do_json_call(url)
{
    var json = null;
    // code to get JSON via XHR here
    var result = json['result'];
    var exc = json['exception'];
    if (exc !== null)
    {
        throw exc;
    }
    return result;
}

function func1()
{
    try
    {
        var result = do_json_call("http://localhost/json/func1");
        // Do something
    }
    catch (e)
    {
        alert(e);
    }
}

function func2()
{
    try
    {
        var result = do_json_call("http://localhost/json/func2");
        // Do something
    }
    catch (e)
    {
        alert(e);
    }
}

// etc..
于 2013-04-16T12:43:41.107 に答える
0

ROOT_URLCONFつまり urls.py に という名前の属性を追加しますhandler500

urls.py

....
....
handler500 = 'myapp.views.get500handler'

myapp/views.py

def get500h(request):
    return HttpResponse("A server error ocurred")

から返される内容について心配する必要はありませんget500h()。ユーザーには、返される json 応答が引き続き表示されます。

于 2013-04-16T16:09:21.160 に答える