cherrypy方法调用另一种方法

时间:2014-01-02 04:20:14

标签: cherrypy

我正在尝试将我的樱桃网络应用程序分解成课程。如果一个樱桃应用程序中的方法如何调用另一种方法?例如,我希望App.index()调用Login.index()和Login.index()来调用Menu.index():

class App:
    @cherrypy.exposed
    def index(self):
        # ... some initialization ...
        # HOW TO CALL Login.index() ???

class Login:
    @cherrypy.exposed
    def index(self):
        # login form that will post to Login.do_login()
    @cherrypy.explode
    def do_login(self):
        # validate
        # HOW TO CALL Menu.index() ???

如果我这样做(这可能不是正确的方法):

class App:
    @cherrypy.exposed
    def index(self):
        # ... some initialization ...
        return Login().index()

class Login:
    @cherrypy.exposed
    def index(self):
        # login form that will post to "do_login"
    @cherrypy.explode
    def do_login(self):
        # validate

获取Login.index()表单。 问题是,在表单中,有一个do_login的帖子。提交时,cherrypy会抱怨找不到“/ do_login”。注意“/”。换句话说,我想在Login.index()返回的网页中找到“do_login”的URL链接,转到Login.do_login(),而不是App.do_login()。

当然,如果我通过GET转到Login()。index(),一切都很好:

class App:
    login = Login()
    @cherrypy.exposed
    def index(self):
        # ... some initialization ...
        return "Go to <a href='login'>login</a>" # CLICK ON THE LINK

class Login:
    @cherrypy.exposed
    def index(self):
        # login form that will post to Login.do_login()
    @cherrypy.explode
    def do_login(self):
        # validate
        # HOW TO CALL Menu.index() ???

我一定错过了什么。

2 个答案:

答案 0 :(得分:1)

我认为您可以通过两种方式解决这个问题,我建议使用选项1,因为这是更自然的HTTP方式:

  1. 在表单action="/login/do_login"上设置完整网址并使用HTTPRedirect管理流程,例如:

    GET - &gt; app / - &gt; NOT_AUTHORIZED - &gt; HTTP_REDIRECT [303] - &gt; /登陆/

    POST - &gt; / login / do_login - &gt;授权 - &gt; HTTP_REDIRECT [303] - &gt; /应用

    class App:    
        @cherrypy.exposed
        def index(self):
            # ... some initialization ...
            raise cherrypy.HTTPRedirect('/login/')
    
    class Login:
        @cherrypy.exposed
        def index(self):
            # login form that will post to "do_login"
        @cherrypy.explode
        def do_login(self):
            # validate
    
  2. 使用internal redirects

    class App:    
        @cherrypy.exposed
        def index(self):
            # ... some initialization ...
            raise cherrypy.InternalRedirect('/login/')
    
    class Login:
        @cherrypy.exposed
        def index(self):
            # login form that will post to "do_login"
        @cherrypy.explode
        def do_login(self):
            # validate
    

答案 1 :(得分:0)

首先,您需要实例化要调用的类...

class App:
    @cherrypy.exposed
    def index(self):
        # ... some initialization ...
        LoginClassObject = Login()
        # HOW TO CALL Login.index()
        LoginClassObject.index()

如果你的班级在另一个python文件中,你将必须导入该类......

from Path.To.Login.File import Login

然后只需重复Menu.index()

以下是关于类对象的更多内容......

http://docs.python.org/2/tutorial/classes.html#class-objects

编辑:

如果您希望发帖转到正确的处理程序,只需在href ...

中指定类
return "Go to <a href='/Login/login'>login</a>" # CLICK ON THE LINK

或者,如果您希望它在用户点击它时,那么您使用正确...

raise cherrypy.HTTPRedirect("/Login/login")

注意:请确保不要将HTTPRedirect放在try / catch中。

希望这有帮助!