0

ajaxを使用し djangoて、ファイルを解析し、ファイルからデータを収集して、データの処理結果をユーザーに提示するWebアプリを作成しました。

ファイルが予期された形式でない場合、解析とデータ処理は失敗し、プログラムはファイルを処理できなかったことをユーザーに通知します。

私はこのように試しました

def process_file(request):
    success = False
    return_dict = {}    
    ...
    if (request.is_ajax()) and(request.method == "POST"):
        filename = request.POST['filename']
        ...
        data = parse_file(filename)
        results = process_data(data)
        success = True
        return_dict = {'result':results}
     serialized = json.dumps(return_dict)
     if success == True:
         return HttpResponse(serialized,mimetype="application/json")
     else:
        return HttpResponseServerError(serialized, mimetype="application/json")

javascript、の状態をチェックする機能がありajax queryますstatus is not 'success'。の場合、エラーメッセージが表示されます。

これは、djangoサーバーを使用しているときにdjangoビューに500エラーがある場合でも機能します。サーバーコンソールには500エラーが表示されますが、問題なく続行されます。実稼働環境にデプロイされた場合、これが当てはまるのではないかと思います。

djangoビューでランタイムエラーを処理するためのより良い方法はありますか?あなたたちは何を提案しますか?

4

1 に答える 1

1

ここでの問題は、エラーに真に対応していないことです。リクエストが AJAX 経由で POST として送信された限りsuccess常に True. これは、たとえファイルがアップロードされたとしても、ファイルが解析できるかどうか、またはまったく.

何よりもまず、現在コードは常に失敗します (500 エラー) request.post。である必要がありますrequest.POST

次に、 から値を引き出す必要があるrequest.POSTときは常に、次のようにする必要がありますdict.get

filename = request.POST.get('filename')

フィールドが POST データに見つからない場合、filenameは と等しくなりNoneます。filenameしたがって、これに分岐し、そうでない場合にのみ残りのコードを続行する必要がありますNone。たとえば、次のようになります。

if filename is None:
    return HttpResponseBadRequest()
else:
    # the rest of your code

filename第三に、が の入力であると想定していますtype="file"。その場合request.POST、とにかく、実際には存在しません。すべてのファイルのアップロードはrequest.FILES. 上記と同じ注意事項が適用されます。

filename = request.FILES.get('filename')
if filename is None:
    return HttpResponseBadRequest()
else:
    # the rest of your code

第 4 に、 と の両方があなたが作成した独自の方法であるようparse_fileprocess_data思われるため、そこで多くの支援を提供することはできません。try...exceptただし、ファイルからデータを読み取ったり、実際には存在しない想定された形式でそのデータを解析したりするなど、失敗する可能性があることを行うときはいつでも、慎重にブロックを使用することを忘れないでください。

メソッドparse_fileとメソッドは、考えられるすべての例外process_dataをキャッチする必要があります。次に、それらを上方に伝播するか、代わりに別のカスタム例外を発生させるか、単に失敗して のようなものを黙って返すことができます。それに応じて応答し、例外をキャッチするか、戻り値がそうであるかどうかに基づいて分岐するかどうかは、ここでのビュー次第です。NoneNone

于 2012-06-20T15:31:32.680 に答える