2017-10-18 1 views
1

Redigiert meine Frage, weil es vorher nicht sehr klar war.Anfrage Handler mit Webapp2 Tupel (Regex, Handler)

Code 1 Arbeits

class AtSeaHandler(webapp2.RequestHandler): 
    def get(self, id=None): 
     boat = ndb.Key(urlsafe=id).get() 
     boat_dict = boat.to_dict() 
     boat_dict['self'] = "/boats/" + id 
     self.response.write(json.dumps(boat_dict) 

app = webapp2.WSGIApplication([ 
     ('/boats/([\w-]+)', AtSeaHandler) 
     ], debug=True) 

Code 2 (nicht funktioniert)

class AtSeaHandler(webapp2.RequestHandler): 
    def get(self, id=None): 
     boat = ndb.Key(urlsafe=id).get() 
     boat_dict = boat.to_dict() 
     boat_dict['self'] = "/boats/" + id 
     self.response.write(json.dumps(boat_dict) 

app = webapp2.WSGIApplication(
     ('/boats/([\w-]+)/at_sea', AtSeaHandler) 
     ], debug=True) 

Code 2 ist eine Kopie des Codes 1. Der einzige Unterschied zwischen Code 1 und Code 2 Code 1 ist ('/ boats/([\ w -] +)', AtSeaHandler) gegen Code 2 ist ('/ boats/([\ w -] +)/at_sea', AtSeaHandler). Dann kommentiere ich Code 1.

Code 1 funktioniert. Code 2 funktioniert nicht mit dem/at_sea hinzugefügt. Ich habe http://localhost:8080/boats/aghkZXZ-Tm9uZXIRCxIEQm9hdBiAgICAgPCLCww im Postboten eingegeben und überprüft Code 1 funktioniert. Auch Code 2 getestet und überprüft, dass es nicht funktioniert.

Was muss ich tun, damit dies funktioniert? Wenn ich einen boat Entity Key an ([\ w -] +) übergeben habe und ich def get(self, id=None):id den Boot Entity Key gegeben habe. Braucht at_sea ein Argument in get()? Muss ich die get() von get (self, id = none) ändern, um zu erhalten (self, id = none, argument3 = keine)? Aus C++ kommend, denke ich, dass es wie ein Funktionsaufruf mit 3 Argumenten einen Funktionskopf mit 3 Parametern benötigt, um diese Argumente zu halten. Verarsche ich die Dinge total?

Die documentation hilft mir nicht verstehen, wie meine Frage zu beantworten ...

+0

yup, mein erster Verdacht ist wahr: versuchen http: // localhost: 8080/Boote/aghkZXZ-Tm9uZXIRCxIEQm9hdBiAgICAgPCLCww/at_sea das neue Muster –

Antwort

0

Sie können jederzeit tun, um eine Tryout einen generischen Ansatz in der get() Code des Handler (Whcih Sie mit Ihrem Browser leicht überprüfen kann), in dem Sinne, dass es unabhängig von den RegexMuster arbeiten, sollen Sie in den app ‚s Router:

def get(self, *args, **kwargs): 
     self.response.write('args: %s<br>kwargs: %s' % (args, kwargs)) 

der Router die gleiche Art und Weise für die put() funktioniert, so dass Sie eine ähnliche Methode anwenden könnten, es ist nur ein bisschen schwieriger, die Ergebnisse sofort zu sehen - du würdest h Sie müssen die Protokollierung verwenden und die Protokolle der App überprüfen.

Damit sehen Sie genau, welche Argumente Sie erhalten und wie/wo, so dass Sie Ihren Handler-Code nach Bedarf anpassen können. Sie müssen möglicherweise wiederholen, wenn Sie das Regex-Muster ändern.

Mit dem Code Sie gebucht haben (d. H. def put():) sollte es überhaupt nicht funktioniert haben, da id nicht initialisiert ist. Was bedeutet, dass Sie Ihre Änderungen wahrscheinlich aus den Augen verloren haben.

Für mich put(self, id=None): ist richtig und sollte für jedes Muster mit eine einzige() Gruppe darin arbeiten.

Sie nicht genau erklären, was Sie stopped working meine ich :) Ich habe 2 Verdacht:

  • Sie das Muster entsprechen nicht den tatsächlichen Anforderung ändern. Ich meine eine boats/<some_safe_url> Anfrage würde das '/boats/([\w-]+)' Muster entsprechen, aber das Muster '/boats/([\w-]+)/at_sea' scheitern. Sie würden einen Fehler 404 sehen.

  • Sie erwartet die Anfrage auf AtSeaHandler, aber Sie haben es tatsächlich auf BoatHandler (und vielleicht haben Sie nicht bemerkt, dass). Dies passiert, weil ein boats/<some_safe_url>/at_sea Muster auch dem Muster '/boats/(.*)' entspricht und der Router die erste Übereinstimmung auswählt. Diese unerwartete Übereinstimmung erzeugt auch einen ungültigen id: <some_safe_url>/at_sea, der Ihnen nicht einen Schlüssel und damit ein Boot bringen kann - wieder ein 404-Fehler oder ein einfacher Crash - ein Fehler von 500. Sie müssen die Reihenfolge der Routendefinitionen im Router mit dem spezifischsten Muster zuerst ändern.

+0

Dank zu passen! Ich erkannte nicht die Routing-Reihenfolge und die (. *) Verursachte mir das Problem. Jetzt funktioniert es! All die Dinge, auf die ich im Internet gestoßen bin, haben nicht in der Reihenfolge der Routendefinitionen betont, und mir war nicht klar, wie (. *) Verschlang, was danach kam. Die folgende Reihenfolge arbeitete tatsächlich, wenn ich ersetzt mit ([/ w -] +) (*). ('/ Boote/([\ w -] +)/at_sea', AtSeaHandler), \t ('/ Boote/([\ w -] +) ', BoatHandler) – NoobProgrammer