在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)
答案 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提出请求对我有用,它抱怨说我不是美国公民,我认为没问题; - )