2015-09-03 9 views
10

In some source code Ich bin schreiben, ich bin in der Lage eine Anfrage wie zu machen:die Ansicht root Standard in cherrypy

http://proxy.metaperl.org/index/bitgold-rw1 

und habe es erfolgreich umleiten.

Allerdings möchte ich index von der URL entfernen und es noch umleiten, indem Sie die index() Methode verwenden. Ich habe versucht, die Umbenennung index() zu default() nach etwa Dispatching, lesen aber es erlaubt mir immer noch nicht, wie diese eine URL zu haben:

http://proxy.metaperl.org/bitgold-rw1 

Es wird versucht, ein Verfahren bitgold-rw1 anstelle der Verwendung der Methode standardmäßig den Namen zu finden zu lösen, die Anforderung, gving mir den Fehler:

NotFound: (404, "The path '/bitgold-rw1' was not found.") 

die WSGI Startdatei sieht wie folgt aus:

# -*- python -*- 

# core 
import os 
import sys 

# 3rd party 
import cherrypy 

# local 
def full_path(*extra): 
    return os.path.join(os.path.dirname(__file__), *extra) 

sys.path.insert(0, full_path()) 
import config 
import myapp 

application = cherrypy.Application(
    myapp.Root(), 
    "/", 
    config.config) 
+0

Ich mache keine * Menge * in cherrypy, aber ist 'index' nicht auf die Site ohne Subs abgebildet? d. h. 'stackoverflow.com' im Gegensatz zu' stackoverflow.com/questions '? – Zizouz212

+0

Ich denke, das Problem ist, dass CherryPy denkt, ich suche nach einer Route "http: // proxy.metaperl.org/bitgold-rw1" und es kann es nicht finden. Ich denke, 'index' kann optional parms haben. –

+0

Interessant. Ich könnte mir vorstellen, was hier vor sich geht. Kannst du uns die 'Root'-Klasse zeigen? Insbesondere etwas mit den verwandten Methoden zu tun? Das würde uns helfen, eine Antwort zu bekommen. – Zizouz212

Antwort

1

Wenn Sie Ihre Indexmethode in Ihrer Root-Klasse umbenennen, sollte dies funktionieren.

Fügen Sie die Zeile

cherrypy.quickstart (Root())

am unteren Rand des myapp.py und führen Sie es mit 'python myapp.py' Ihr Server auf Port 8080 beim Start und hören sollte. Eine Anfrage an http://localhost:8080/bitgold-rw1 funktioniert für mich, es beschwert sich, dass ich kein US-Bürger bin, was ich gut finde ;-)

2

Umbenennen zu default ist nicht genug. Es muss mindestens mit variadischen Argumenten, *args, aufrufbar sein, um Pfadsegmente zu empfangen. Wie folgt aus:

#!/usr/bin/env python3 


import cherrypy 


config = { 
    'global' : { 
    'server.socket_host' : '127.0.0.1', 
    'server.socket_port' : 8080, 
    'server.thread_pool' : 8 
    } 
} 


class Root: 

    @cherrypy.expose 
    def default(self, *args, **kwargs): 
    cherrypy.log('{0}, {1}'.format(args, kwargs)) 
    return 'OK' 


if __name__ == '__main__': 
    cherrypy.quickstart(Root(), '/', config) 

Dann wird es Dinge wie http://127.0.0.1:8080/bitgold-rw1/ fangen und auch http://127.0.0.1:8080/bitgold-rw1/foo/bar mögen.

Und übrigens, wenn es etwa MVC ist, ist es ein Controller, keine Ansicht.

2

Wie von @ralhei @saaj erwähnt Standardmethode ist der Schlüssel, wenn Sie nicht mit Dispatcher in Cherrypy beschäftigen wollen. Ich probierte den unten stehenden Code und funktionierte so, wie Sie es wollten

class Root(object): 

    @cherrypy.expose 
    def index(self, tag): 
     redirect_url = db.urls[tag] 
     ip = cherrypy.request.headers['Remote-Addr'] 
     request_url = 'http://ipinfo.io/{0}/country'.format(ip) 
     r = requests.get(request_url) 
     country = r.text.strip() 
     raise cherrypy.HTTPRedirect(redirect_url) 

    @cherrypy.expose 
    def default(self,tag): 
     return self.index(tag)