CherryPy:405方法不允许指定的方法对此资源无效

时间:2018-02-06 19:37:43

标签: python cherrypy

我正在使用cherrypy中的身份验证构建我的第一个Web应用程序:auth部分可以正常工作,但在登录后我收到错误405 Method Not Allowed Specified method is invalid for this resource。关于如何克服它的任何想法?

提前致谢!

from cherrypy.lib import auth_digest
import cherrypy

USERS = {'jon': 'secret'}

config = {
  'global' : {
    'server.socket_host' : '127.0.0.1',
    'server.socket_port' : 8080,
    'server.thread_pool' : 8,
    'log.screen'         : True
  },
  '/' : {
    # HTTP verb dispatcher
    'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
    # JSON response
    'tools.json_out.on' : True,
    # Digest Auth
    'tools.auth_digest.on'      : True,
    'tools.auth_digest.realm'   : 'walledgarden',
    'tools.auth_digest.get_ha1' : auth_digest.get_ha1_dict_plain(USERS),
    'tools.auth_digest.key'     : 'generate_something_random',
  }
}

class HelloWorld():
    def index(self):
        return "Hello World!"
    index.exposed = True

#cherrypy.quickstart(HelloWorld(), config=None) #this works
cherrypy.quickstart(HelloWorld(), config=config) #this is broken

enter image description here

2 个答案:

答案 0 :(得分:2)

您正在使用MethodDispacher将HTTP方法映射为公开的类的方法,在这种情况下,您的index方法应该是叫GET

@cherrypy.expose
class HelloWorld():

    def GET(self):
        return "Hello World!"

如果您使用的是不支持类装饰器的python版本,请使用:

class HelloWorld():
    exposed = True

    def GET(self):
        return "Hello World!"

基本上,使用MethodDispatcher公开具有与HTTP方法匹配的方法的资源(对象),例如GET - > def GET(self)POST - > def POST(self)

您可能会发现这篇文章内容丰富:https://blog.joel.mx/posts/cherrypy-101-method-dispatcher

答案 1 :(得分:1)

感谢cyraxjoe指针,我发现了它:

from cherrypy.lib import auth_digest
import cherrypy

USERS = {'jon': 'secret'}

config = {'/': {'tools.auth_digest.on': True,
               'tools.auth_digest.realm': 'walledgarden',
               'tools.auth_digest.get_ha1': auth_digest.get_ha1_dict_plain(USERS),
               'tools.auth_digest.key': 'generate_something_random',
}}

class HelloWorld():
    def index(self):
        return "Hello World!"
    index.exposed = True

#cherrypy.quickstart(HelloWorld(), config=None) #this works -- NO AUTHENTICATION
cherrypy.quickstart(HelloWorld(), config=config) #WORKS WITH AUTHENTICATION