我有一个简单的web.py应用程序,它读取配置文件并用于URL路径。但是我得到两个奇怪的行为。一,对Main中数据的更改未反映在GET的结果中。二,Main似乎跑了两次。
所需的行为是修改Main中的数据会导致方法看到已修改的数据,而不是主要的重新运行。
问题:
来自pbuck(已接受的答案):答案为3.)替换
app = web.application(urls, globals())
使用:
app = web.application(urls, globals(), autoreload=False)
在pythons Linux(CentOS 6 python 2.6.6)和MacBook(brew python 2.7.12)上的相同行为
开始时我得到:
$ python ./foo.py 8080
Initializing mydict
Modifying mydict
http://0.0.0.0:8080/
查询时:
wget http://localhost:8080/node/first/foo
wget http://localhost:8080/node/second/bar
导致(注意第二个“初始化mydict”):
Initializing mydict
firstClass.GET called with clobber foo
firstClass.GET somevalue is something static
127.0.0.1:52480 - - [17/Feb/2017 17:30:42] "HTTP/1.1 GET /node/first/foo" - 200 OK
secondClass.GET called with clobber bar
secondClass.GET somevalue is something static
127.0.0.1:52486 - - [17/Feb/2017 17:30:47] "HTTP/1.1 GET /node/second/bar" - 200 OK
代码:
#!/usr/bin/python
import web
urls = (
'/node/first/(.*)', 'firstClass',
'/node/second/(.*)', 'secondClass'
)
# Initialize web server, start it later at "app . run ()"
#app = web.application(urls, globals())
# Running web.application in Main or above does not change behavior
# Static Initialize mydict
print "Initializing mydict"
mydict = {}
mydict['somevalue'] = "something static"
class firstClass:
def GET(self, globarg):
print "firstClass.GET called with clobber %s" % globarg
print "firstClass.GET somevalue is %s" % mydict['somevalue']
return mydict['somevalue']
class secondClass:
def GET(self, globarg):
print "secondClass.GET called with clobber %s" % globarg
print "secondClass.GET somevalue is %s" % mydict['somevalue']
return mydict['somevalue']
if __name__ == '__main__':
app = web.application(urls, globals())
# read configuration files for initializations here
print "Modifying mydict"
mydict['somevalue'] = "something dynamic"
app.run()
答案 0 :(得分:1)
简短回答,避免使用全局变量,因为它们没有按照您的想法行事。特别是当你最终在nginx / apache下部署它时(可能)会有多个进程在运行。
更长的答案
- 为什么我要运行两次代码?
醇>
代码,全局到app.py,正在运行两次,因为它运行一次,就像通常那样。第二次是web.application(urls, globals())
电话。实际上,对globals()
的调用会设置模块加载/重新加载。部分原因是重新加载所有模块(包括app.py)。如果您在web.applications()调用中设置autoreload=False
,则不会这样做。
- 这里真的发生了什么,在GET中没有修改mydict?
醇>
mydict被设置为'动态',但在第二次加载时被重新设置为'静态'。再次设置autoreload=False
,它将按预期工作。
- 最短路径?
醇>
autoreload=False
- Pythonic path?
醇>
....好吧,我想知道为什么你的模块中有mydict['somevalue'] = 'something static'
和 mydict['somevalue'] = 'something dynamic'
这样:为什么不在'__main__'
下设置一次?