【问题标题】:Default the root view in cherrypy在cherrypy中默认根视图
【发布时间】:2026-02-08 11:40:01
【问题描述】:

some source code我是 写作时,我可以提出如下要求:

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

并让它重定向成功。

但是,我想从 URL 中删除 index 并保留它 使用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)

【问题讨论】:

  • 我没有在cherrypy中做很多很多,但index不应该映射到没有订阅的站点吗?即*.com 而不是 `*.com/questions'?
  • 我认为问题在于 CherryPy 认为我正在寻找路线 http://proxy.metaperl.org/bitgold-rw1 并且找不到它。我认为index 可以有可选参数。
  • 有趣。我可能知道这里发生了什么。你能告诉我们Root类吗?特别是与相关方法有什么关系?这会帮助我们得到答案。

标签: python wsgi cherrypy


【解决方案1】:

如果您在 Root 类中将索引方法重命名为“默认”,这应该可以工作。

添加行

cherrypy.quickstart(Root())

在 myapp.py 的底部并使用“python myapp.py”运行它,您的服务器应该启动并侦听端口 8080。 向http://localhost:8080/bitgold-rw1 提出请求对我有用,它抱怨我不是美国公民,我想这很好;-)

【讨论】:

    【解决方案2】:

    重命名为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 之类的东西。

    顺便说一句,如果它是关于 MVC 它是一个控制器,而不是一个视图。

    【讨论】:

      【解决方案3】:

      正如@ralhei 所提到的,如果您不想在cherrypy 中处理调度程序,那么@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)
      

      【讨论】: