web.py运行main两次,忽略更改

时间:2017-02-17 18:32:22

标签: python-2.7 web.py

我有一个简单的web.py应用程序,它读取配置文件并用于URL路径。但是我得到两个奇怪的行为。一,对Main中数据的更改未反映在GET的结果中。二,Main似乎跑了两次。

所需的行为是修改Main中的数据会导致方法看到已修改的数据,而不是主要的重新运行。

问题:

  1. 这里真正发生的事情是,mydict在两者中都没有被修改 得到。
  2. 为什么我要运行两次代码。
  3. 最简单的理想行为路径(最重要的)
  4. 达到理想行为的Pythonic路径(最不重要)
  5. 来自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()
    

1 个答案:

答案 0 :(得分:1)

简短回答,避免使用全局变量,因为它们没有按照您的想法行事。特别是当你最终在nginx / apache下部署它时(可能)会有多个进程在运行。

更长的答案

  
      
  1. 为什么我要运行两次代码?
  2.   

代码,全局到app.py,正在运行两次,因为它运行一次,就像通常那样。第二次是web.application(urls, globals())电话。实际上,对globals()的调用会设置模块加载/重新加载。部分原因是重新加载所有模块(包括app.py)。如果您在web.applications()调用中设置autoreload=False,则不会这样做。

  
      
  1. 这里真的发生了什么,在GET中没有修改mydict?
  2.   

mydict被设置为'动态',但在第二次加载时被重新设置为'静态'。再次设置autoreload=False,它将按预期工作。

  
      
  1. 最短路径?
  2.   

autoreload=False

  
      
  1. Pythonic path?
  2.   

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