web.py 运行 main 两次,忽略变化

web.py running main twice, ignoring changes

我有一个简单的 web.py 应用程序,它读取配置文件并提供给 URL 路径。但是我有两种奇怪的行为。第一,对 Main 中的数据所做的更改不会反映在 GET 的结果中。二、Main 出现两次运行。

期望的行为是修改 Main 中的数据将导致方法看到修改后的数据,并且没有 main 重新运行。

问题:

  1. 这里真正发生了什么,mydict 没有被修改 得到。
  2. 为什么我得到一些代码 运行ning 两次。
  3. 实现所需行为的最简单途径(最重要)
  4. 实现所需行为的 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 下部署它时(可能)会有多个进程 运行.

更长的答案

  1. 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,它不会这样做。

  1. What is really happening here, that mydict is not modified in either GET?

mydict 被设置为 'something dynamic',但在第二次加载时被 re-set 设置为 'something static'。再次设置 autoreload=False,它将按您预期的方式工作。

  1. Shortest path?

autoreload=False

  1. Pythonic path?

...好吧,我想知道为什么你的模块中有 mydict['somevalue'] = 'something static' mydict['somevalue'] = 'something dynamic' 这样:为什么不在下面设置一次'__main__'?