web.py 运行 main 两次,忽略变化
web.py running main twice, ignoring changes
我有一个简单的 web.py 应用程序,它读取配置文件并提供给 URL 路径。但是我有两种奇怪的行为。第一,对 Main 中的数据所做的更改不会反映在 GET 的结果中。二、Main 出现两次运行。
期望的行为是修改 Main 中的数据将导致方法看到修改后的数据,并且没有 main 重新运行。
问题:
- 这里真正发生了什么,mydict 没有被修改
得到。
- 为什么我得到一些代码 运行ning 两次。
- 实现所需行为的最简单途径(最重要)
- 实现所需行为的 Python 路径(最不重要)
来自 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
这导致(注意第二个 "Initializing 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()
简短回答,避免使用全局变量,因为它们不会按照您认为的那样进行。特别是当你最终在 nginx / apache 下部署它时(可能)会有多个进程 运行.
更长的答案
- Why am I getting some code running twice?
app.py 的全局代码是 运行 两次,因为它像往常一样运行一次。第二次是在 web.application(urls, globals())
调用中。实际上,对 globals()
的调用设置了模块加载 / re-loading。其中一部分是 re-loading 所有模块(包括 app.py)。如果您在 web.applications() 调用中设置 autoreload=False
,它不会这样做。
- What is really happening here, that mydict is not modified in either GET?
mydict 被设置为 'something dynamic',但在第二次加载时被 re-set 设置为 'something static'。再次设置 autoreload=False
,它将按您预期的方式工作。
- Shortest path?
autoreload=False
- Pythonic path?
...好吧,我想知道为什么你的模块中有 mydict['somevalue'] = 'something static'
和 mydict['somevalue'] = 'something dynamic'
这样:为什么不在下面设置一次'__main__'
?
我有一个简单的 web.py 应用程序,它读取配置文件并提供给 URL 路径。但是我有两种奇怪的行为。第一,对 Main 中的数据所做的更改不会反映在 GET 的结果中。二、Main 出现两次运行。
期望的行为是修改 Main 中的数据将导致方法看到修改后的数据,并且没有 main 重新运行。
问题:
- 这里真正发生了什么,mydict 没有被修改 得到。
- 为什么我得到一些代码 运行ning 两次。
- 实现所需行为的最简单途径(最重要)
- 实现所需行为的 Python 路径(最不重要)
来自 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
这导致(注意第二个 "Initializing 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()
简短回答,避免使用全局变量,因为它们不会按照您认为的那样进行。特别是当你最终在 nginx / apache 下部署它时(可能)会有多个进程 运行.
更长的答案
- Why am I getting some code running twice?
app.py 的全局代码是 运行 两次,因为它像往常一样运行一次。第二次是在 web.application(urls, globals())
调用中。实际上,对 globals()
的调用设置了模块加载 / re-loading。其中一部分是 re-loading 所有模块(包括 app.py)。如果您在 web.applications() 调用中设置 autoreload=False
,它不会这样做。
- What is really happening here, that mydict is not modified in either GET?
mydict 被设置为 'something dynamic',但在第二次加载时被 re-set 设置为 'something static'。再次设置 autoreload=False
,它将按您预期的方式工作。
- Shortest path?
autoreload=False
- Pythonic path?
...好吧,我想知道为什么你的模块中有 mydict['somevalue'] = 'something static'
和 mydict['somevalue'] = 'something dynamic'
这样:为什么不在下面设置一次'__main__'
?