我通常用PHP编写Web应用程序。目前我正在学习使用Python的CherryPy框架来做网络程序。我想要做的是接受来自用户的http Get请求,然后使用查询字符串中的变量来执行某些功能,最后我将返回结果。但现在我觉得我被困在CherryPY的编程惯例中。
我尝试使用索引函数接受GET方法发布的变量,然后执行如下操作:
import cherrypy
from sqlalchemy import *
from function import function
class WelcomePage:
def index(self,number):
if not number:
return "failure";
else:
number1=number;
return ;
now = datetime.datetime.utcnow();
code = generateCode();
finalResult();
def finalResult():
return code;
上面的代码不起作用,它只会在index(self,number)的return语句结束,而我无法继续其他函数。我想我打破了Python风格的面向对象结构(与PHP不同)。 以下是处理GET输入和计算后返回的正确方法
@cherrypy.exposed
def index(self,number):
if not number:
return "failure";
else:
cal = Calculation();
other =OtherFunction();
code=cal.doSomething(number1);
final =other.doAnotherThing(code);
return final;
那就是我需要在index函数中调用所有其他函数,然后在index函数中返回结果。这是关于http GET变量(或帖子)的唯一方法。我是否可以使用其他方法来编写不需要调用索引函数内所有函数的代码(这似乎会使索引函数如此冗长)。这是一个更干净,更清晰的方法来完成具有不同功能的GET变量的处理,然后最终返回计算结果?我试过谷歌很多天但仍然无法找到一个好方法。
答案 0 :(得分:0)
首先,来自PHP你应该理解语法(例如你不需要分号,除非它是一个多语句行)和语义(例如Python OO功能来安排你的代码,你的“编程结构”)蟒蛇。其次,CherryPy应用程序和常见PHP部署之间的工作流程差异(例如,您可以阅读PHP is meant to die)。 CherryPy到您的代码是线程应用程序服务器。您的活动代码始终在内存中,可以在后台运行。你有更多的权力和更多的责任。
一旦了解了基础知识,就可以按自己喜欢的方式安排代码。撰写或分解,放入函数或类或单独的模块或Python可以处理的任何其他可想象的方式。 CherryPy在这里没有限制。最简单的可能是以下内容。
#!/usr/bin/env python
import cherrypy
config = {
'global' : {
'server.socket_host' : '127.0.0.1',
'server.socket_port' : 8080,
'server.thread_pool' : 4
}
}
class App:
def _foo(self, value):
return self._bar(value)[::-1]
def _bar(self, value):
return value * 2
@cherrypy.expose
def index(self, value = None):
if not value:
# when you visit /
raise cherrypy.HTTPError(500)
else:
# when you visit e.g. /?value=abc
return self._foo(value)
if __name__ == '__main__':
cherrypy.quickstart(App(), config = config)