По умолчанию корневой вид вишневого
В некоторый исходный код Я
Я могу сделать запрос, например:
http://proxy.metaperl.org/index/bitgold-rw1
И переадресуйте его успешно.
Однако, я хочу удалить index
из URL-адреса и сохранить его
перенаправлять с помощью метода index()
. Я попытался переименовать index()
в
default()
после прочтения
Dispatching,
но он по-прежнему не позволяет мне иметь такой URL:
http://proxy.metaperl.org/bitgold-rw1
Он пытается найти метод с именем bitgold-rw1
вместо использования
метод по умолчанию для разрешения запроса, приведя ошибку:
NotFound: (404, "The path '/bitgold-rw1' was not found.")
Файл запуска WSGI выглядит следующим образом:
# -*- 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)
Ответы
Ответ 1
Переименовать на default
недостаточно. Он должен быть вызван, по крайней мере, с переменными аргументами, *args
, для получения сегментов пути. Вот так:
#!/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)
Затем он поймает такие вещи, как http://127.0.0.1:8080/bitgold-rw1/
, а также как http://127.0.0.1:8080/bitgold-rw1/foo/bar
.
И btw, если он о MVC - это контроллер, а не вид.
Ответ 2
Как упоминалось в @ralhei @saaj метод по умолчанию - это ключ, если вы не хотите иметь дело с диспетчерами в вишнево. Я пробовал код ниже и работал так, как вы хотите
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)
Ответ 3
если вы переименуете свой индексный метод в 'default' в свой класс Root, это должно работать.
Добавьте строку
cherrypy.quickstart(Корень())
внизу myapp.py и запустите его с помощью "python myapp.py", ваш сервер должен запустить и прослушать порт 8080.
Выполнение запроса http://localhost:8080/bitgold-rw1 работает для меня, он жалуется, что я не гражданин США, который, я думаю, в порядке, -)