我正在尝试将我的樱桃网络应用程序分解成课程。如果一个樱桃应用程序中的方法如何调用另一种方法?例如,我希望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() ???
我一定错过了什么。
答案 0 :(得分:1)
我认为您可以通过两种方式解决这个问题,我建议使用选项1,因为这是更自然的HTTP方式:
在表单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
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中。
希望这有帮助!