2016-04-22 13 views
0

HTTP応答コード/エラーチェック以外のPythonとNDBを使用してGoogle App Engine APIを使用しています。私は、自分のエンティティの1つのポスト関数に(ユーザーが必要なフィールドを空白にしないようにするために)406エラー(json要求のみ受け付ける)と400エラーを処理するコードを入れましたが、今はコードが壊れているようです。HTTP 406レスポンスコードチェックでGoogle App Engine/Python APIが破損しています

curl --data-urlencode "name=clean" -H "Accept: application/json" http://localhost:15080/task 

私は(すべての場合の問題は、エラーチェックコードである知っている:

class Task_action(webapp2.RequestHandler): 

    def post(self): 

     #Only allows a JSON, if not, then error 
     if 'application/json' not in self.request.accept: 

      self.response.status = 406 
      self.response.status_message = "Not Acceptable, API only supports application/json MIME type" 
      return 
     new_task = Task(parent=PARENT_KEY, 
         name = self.request.get("task_name"), 
         hours = int(self.request.get("task_hours")), 
         id = self.request.get("task_name")) 
     #has error code, since name and hours is required 

     if name: 
      new_task.name = name 
     else: 
      self.response.status = 400 
      self.response.status_message = "Invalid request, task name is Required." 
      if hours: 
       new_task.hours = hours 
      else: 
       self.response.status = 400 
       self.response.status_message = "Invalid request, task hours is Required." 
      key = new_task.put() 
      out = new_task.to_dict() 
      self.response.write(json.dumps(out)) 

が、私はそれをテストするためにカール使用しています:これはエラーとコードが含まチェックしています私はそれを取るとき、カールテストがうまく動作し、オブジェクトがndbデータベースに正しく追加されているからです。しかし、エラーチェックコードが含まれているので、私のカールテストはオブジェクトを必要に応じて追加しません。エラーチェックコードが投稿文を壊している理由は誰にも分かりますか? HTTPエラー応答コードを返す良い方法はありますか?

+0

コードの書式設定を修正しようとしましたが、実際のコード、特にインデントが反映されているかどうかを確認してください。 –

+0

フォーマットを修正していただきありがとうございます。 – ChristinaLindsay

答えて

2

あなたは(多分PARENT_KEYnamehours)コード内のいくつかの初期化されていない変数を持っていたし、また、あなたは、このようにコードが動作しない領域に流れる、エラー応答を準備した後、返されませんでした。

私は再編成機能コードへの影響を最小限に抑え用のコードをチェックし、エラーが(チェックが残りの機能コードを簡素化するために、可能な限り早期に行うべきであることをお勧めしたい。また、私はより簡潔なwebapp2.abort()機能を使用することを好みます(これはreturn文は必要ありません)これらの線に沿って

何か:。

class Task_action(webapp2.RequestHandler): 

    def post(self): 

     # Only allows a JSON, if not, then error 
     if 'application/json' not in self.request.accept: 
      webapp2.abort(406, details="Not Acceptable, API only supports application/json MIME type") 

     # request must contain a valid task name 
     name = self.request.get("task_name") 
     if not name: 
      webapp2.abort(400, details="Invalid request, task name is Required.") 

     # request must contain a valid task hours 
     try: 
      hours = int(self.request.get("task_hours")) 
     except Exception: 
      hours = 0 
     if not hours: 
      webapp2.abort(400, details="Invalid request, task hours is Required.") 

     new_task = Task(parent=PARENT_KEY, name=name, hours=hours, id=hours) 

     new_task.name = name # isn't this done by Task() above? 
     new_task.hours = hours # isn't this done by Task() above? 
     key = new_task.put() 
     out = new_task.to_dict() 
     self.response.write(json.dumps(out)) 

別のノート:あなたが知っている限り、あなたが動作しないTask()呼び出し、中idパラメータを指定しています各Task()エンティティはユニークhours値です。データストアにIDを自動的に割り当てることができます。

+0

ありがとうございました!私はwebapp2.abort関数を使用するつもりです。なぜなら、これはより簡潔で、古いコードでいくつかの重複があることをもう一度見ているからです。私は、else文のコードで何が問題になっているのか把握したいときに気付きました。あなたはself.response.write( 'エラー - 要求はJSONでなければならない\ n')を使用し、突然動作します。私は、Pythonがグローバル変数のステータスと 'status_message!'を認識しないのだろうかと思います。 – ChristinaLindsay

関連する問題