2011-01-04 7 views
3

Zur Zeit habe ich Seiten über zugegriffen:Wie URLs neu formatieren, um erholsamer zu sein (von ... /? Id = 123 bis .../123)?

www.foo.com/details.html?id=123 

Ich mag würde sie mehr erholsamen artig, wie durch die folgende machen:

www.foo.com/details/123 

Ich bin mit Google App Engine. Derzeit sind die URLs in der html-mappings Datei zugeordnet:

('/details.html*', DetailsPage), 

Und dann auf dem DetailsPage Handler, holt er den ID Wert über:

class DetailsPage(webapp.RequestHandler): 
    def get(self): 
     announcement_id = self.request.get("id") 

Wie könnte ich diese restrukturieren, so dass es die URL abbildet und ein Extrakt der ID über die andere formatierte URL: www.foo.com/details/123

Dank

Antwort

13

R ewrite Ihre URL-Zuordnung wie folgt aus:

('/details/(\d+)', DetailsPage), 

(dies setzt voraus, dass es ein nachlauf Teil der URL sein, die eine oder mehrere Ziffern und nichts enthält anderes).

Dann ändern Sie Ihre DetailsPage::get() Methode, dass die ID-Parameter zu akzeptieren, wie:

class DetailsPage(webapp.RequestHandler): 
    def get(self, announcement_id): 
     # next line no longer needed 
     # announcement_id = self.request.get("id") 

... und weiter mit Ihrem Code.

+0

Großartig! Vielen Dank! Eine Änderung - Ich erkannte, dass ich mit der Beschreibung irreführend war ... was ist, wenn die ID, nach der ich kommen möchte/Details mit der Regex übereinstimmt: [a-zA-Z0-9-_] Wie kann ich diese Änderung widerspiegeln? ('/ details/[a-zA-Z0-9-_]', DetailsPage), scheint nicht zu funktionieren (es gab mir einen 404 Fehler). – Cuga

+0

dafür kann man "r"/details/(\ w +) "' - '\ w" mit all diesen Zeichen ersetzen, das '+' erfordert mindestens ein passendes Zeichen und die Parens fangen das Match ein der Parameter, der an Ihre Funktion 'get()' übergeben wird. – bgporter