2016-04-22 7 views
0

Ich habe eine Google App Engine-API, die Python und NDB außer HTTP-Response-Code/Fehlerprüfung verwendet. Ich habe etwas Code eingegeben, um 406 zu behandeln (um nur json-Anfragen zu akzeptieren) und 400 Fehler (um zu verhindern, dass ein Benutzer ein erforderliches Feld leer lässt), um die post-Funktion für eine meiner Entitäten, aber jetzt scheint es meinen Code zu zerstören. Dies ist der Code mit dem Fehler enthielt Prüfung:HTTP 406 Response Code Check bricht meine Google App Engine/Python-API

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

ich curl verwende es zu testen:

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

Ich weiß, dass das Problem in dem Fehler-Code überprüft (alle, wenn else-Anweisungen), denn wenn ich es herausnehme, funktioniert der Curl-Test gut und das Objekt wird korrekt zur Datenbank ndb hinzugefügt. Mit dem Fehlerüberprüfungscode fügt mein Curl-Test das Objekt jedoch nicht wie gewünscht hinzu. Hat jemand eine Idee, warum der Fehlerprüfcode meine Postanweisung bricht? Gibt es eine bessere Möglichkeit, HTTP-Fehlercodes zurückzugeben?

+0

Ich habe versucht, Ihre Code-Formatierung zu beheben, überprüfen Sie bitte, ob es noch Ihren tatsächlichen Code, insbesondere die Einrückung widerspiegelt. –

+0

Vielen Dank für die Formatierung, es sieht viel besser aus! – ChristinaLindsay

Antwort

2

Sie hatten einige nicht initialisierten Variablen im Code (name, hours, vielleicht PARENT_KEY), und Sie haben auch nicht zurück, nachdem die Fehlerreaktion vorbereitet, so dass in Bereichen fließt, wo der Code nicht funktionieren würde.

Ich würde vorschlagen, den Fehlerprüfcode für minimalen Einfluss auf den Funktionscode neu zu organisieren (Prüfungen sollten so früh wie möglich durchgeführt werden, um den verbleibenden Funktionscode zu vereinfachen. Außerdem bevorzuge ich die kompaktere webapp2.abort()-Funktion (was nicht braucht eine return Anweisung)

Etwas in dieser Richtung.

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

Noch ein Hinweis: Sie Angabe des id Parameter in der Task() Anruf, der nicht funktioniert, es sei denn, Sie wissen, Jede Entität Task() hat eine einzigartighours Wert. Möglicherweise möchten Sie, dass der Datenspeicher IDs automatisch zuweist.

+0

Vielen Dank für Ihre Hilfe !! Ich werde die Funktion webapp2.abort verwenden, weil es prägnanter ist und einen zweiten Blick darauf wirft, gibt es definitiv einige Duplikate in meinem alten Code :) Ich wollte herausfinden, was das Problem mit dem Else-Statement-Code verursacht hat und bemerkte, dass wann Sie verwenden self.response.write ('Fehler - Anforderungen müssen JSON \ n' sein), dann funktioniert es plötzlich. Ich frage mich, ob Python die globalen Variablen 'status' und 'status_message' nicht erkannt hat! – ChristinaLindsay

Verwandte Themen