2017-01-08 5 views
0

最近、例外処理に関連する基本的な真実が見つかりました。私たちのサーバーはほとんど5XXというエラーではありません。 これで、いくつかのパラメータとそれぞれのURLを持つRESTビューについて考えてみましょう。このコードで jsonデータとして継承されたビューの欠落パラメータの例外処理

urlpatterns = [ 
    url(r'^some_view/', some_view), 
] 

@api_view(['POST']) 
def some_view(request): 
    # ... 
    param1 = request.data['param1'] 

、私はそうでない場合は、手動で開発者が param1に値を割り当てずに some_viewを呼び出して例外を処理する必要があります - 私は明示的にこのケースを処理しない場合 - 彼らは500エラー( MultipleKeyValueError)を取得しますどの悪い。そして、我々はジレンマがあります。

  • 我々は複数のparamsを持っている場合は特に、それは刺激性と反復性のtry-除くブロックの原因となります取り扱いを

ソリューションにある500エラーにつながる処理していません

urlpatterns = [ 
     url(r'^some_view/(?P<param1>\w+/', some_view), 
    ] 

@api_view(['POST']) 
def some_view(request, param1): 
    # ... 

ここで、Djangoは500とは異なり、urlが見つかりませんという400の例外をスローします。しかし一方で、最初のオプション(私はrequest.data['param1']を使用します)は、外部アプリケーションからだけでなく、HTMLフォームをシリアライズすることによってparamsを送信するWebアプリケーションからRESTリソースを呼び出すことができるという有益な利点を提供します。

ここでは、ベストプラクティスについて質問しています。あなたはどうやってこの状況に対処していますか?欠落しているparamsを見ているtry-exceptブロックを明示的に書くか、url-parametersオプションを使用しますか、ここでは言及していない3番目のオプションがありますか?

答えて

1

ここでは、ベストプラクティスについて質問しています。どのようにあなたたちは、この状況の を処理しますか?明示的にtry-exceptブロックを書き込んで、 のパラメータがないかどうかを確認するか、url-parametersオプションを使用しますか?ここでは言及していない3番目のオプションがありますか?

私は、ビュー間で例外処理のための共通のパターンを処理しようとしている場合は、I一般的に私たちの例外を処理し、成功を収めてJSONレスポンスを返すデコレータ= False書き込みの「第三の選択肢」:

をあなただけ行うことができます方法について次に
from functools import wraps 

def handle_missing_key(func) 
    @wraps(func) 
    def _decorator(*args, **kwargs): 
     try: 
      func(*args, **kwargs) 
     except KeyError as ex: 
      return JsonResponse({ 
       'success': False, 
       'error': '%s' % ex 
      }) 
    return _decorator 

@handle_missing_key 
@api_view(['POST']) 
def some_view(request, param1):  
    pass 

あなただけの200応答を返送しているが、JSONは、任意の着呼を、エラー・メッセージを定義します。この方法gアプリケーションは何が欠けているかを知る。見つからないキーは、KeyError.args、またはJsonResponseのエラーメッセージを使用して見つけることができます。あなたはRESTビューを書いている場合は、

response = HttpResponse(status=400) 
response.reason_phrase = 'Key %s is missing' % ex 
return response 
+0

2ps、私はこのアプローチが好きです。ちょっとした話題ですが、このデコレータを「デフォルト」のようにする方法はDjangoにありますか?つまり、ビューの前に毎回それを含めることなく、すべてのビューをアクティブにするには? –

+0

私はあなたができるとは思っていませんし、おそらくdjangoにもJSON以外のビュー(django管理インターフェースのようなもの)があると思われます。 JSONビューしかない場合は、デフォルトとして扱うミドルウェアを書くことができます。 – 2ps

+0

この回答は、Djangoが400の例外の代わりにok(200)を返すようにする方法の詳細にあるようです。それとも私は何かが足りない? –

1

:あなたはJsonResponse(すなわち、ステータス応答400など)以外の応答を返送する場合は、もちろん、このようなものを使用することができますDjango Rest Frameworkを使用する必要があります。このフレームワークの利点の1つは、バニラDjangoのフォームと同様に、受け入れるフィールドを宣言し、必須であるシリアライザを定義することです。したがって、500秒ではなく検証エラーを返すことができます。

+0

Daniel、これは、すべてのパラメータがいくつかのシリアライザのフィールドにマップされている場合に有効です。しかし、モデルオブジェクト(したがってシリアライザ)に関連付けられていないパラメータを渡す場合はどうすればよいでしょうか。つまり、ビューのif-elseブランチで使用される値ですか? –

+0

ダニエル、あなたはまだそこにいますか?) –

関連する問題