在cherrypy中默认根视图

时间:2015-09-03 06:31:21

标签: python wsgi cherrypy

some source code我 写作,我能够提出如下要求:

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

让它成功重定向。

但是,我想从网址中删除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)

3 个答案:

答案 0 :(得分:3)

正如@ralhei @saaj所提到的,默认方法是关键,如果你不想在cherrypy中处理调度程序。我尝试了下面的代码并按照您的意愿工作

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)

答案 1 :(得分: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它是一个控制器,而不是一个视图。

答案 2 :(得分:1)

如果您将索引方法重命名为'默认'在你的Root类中,这应该可行。

添加行

cherrypy.quickstart(根())

在myapp.py的底部,然后用' python myapp.py'运行它。您的服务器应该启动并侦听端口8080。 向http://localhost:8080/bitgold-rw1提出请求对我有用,它抱怨说我不是美国公民,我认为没问题; - )