По умолчанию корневой вид вишневого

В некоторый исходный код Я Я могу сделать запрос, например:

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 работает для меня, он жалуется, что я не гражданин США, который, я думаю, в порядке, -)