如何在另一个应用程序内运行web.py服务器

时间:2012-03-15 06:10:11

标签: multithreading web.py

我有一个用Python编写的小桌面游戏,希望能够在游戏运行时访问它的内部。我想通过在单独的线程和服务页面上运行web.py来实现这一点。因此,当我访问http://localhost:8080/map时,它会显示当前级别的地图以进行调试。

我安装并运行了web.py,但我真的不知道从哪里开始。我尝试在一个单独的线程中启动web.application,但由于某种原因我无法在线程之间共享数据(我认为)。

下面是一个简单的例子,我正在使用测试这个想法。我认为http://localhost:8080/每次都会返回不同的数字,但它会一直显示相同的数字(5)。如果我在while循环中打印common_value,它会递增,但它从5开始。

我在这里错过了什么,接近合情合理的方法是什么?如果可能的话,我真的想避免使用数据库。

import web
import thread

urls = (
    '/(.*)', 'hello'
)

app = web.application(urls, globals())

common_value = 5

class hello:        
    def GET(self):  
        return str(common_value)

if __name__ == "__main__":
    thread.start_new_thread(app.run, ())    
    while 1:
        common_value = common_value + 1

2 个答案:

答案 0 :(得分:1)

在搜索了一下之后,我发现了一个有效的解决方案:

如果common_value在单独的模块中定义并从那里导入,则上述代码有效。所以实质上(原因是命名):

thingy.py

common_value = 0

server.py

import web
import thread
import thingy

import sys; sys.path.insert(0, ".")

urls = (
    '/(.*)', 'hello'
)

app = web.application(urls, globals())

thingy.common_value = 5

class hello:        
    def GET(self):               
        return str(thingy.common_value)

if __name__ == "__main__":
    thread.start_new_thread(app.run, ())    
    while 1:
        thingy.common_value = thingy.common_value + 1

答案 1 :(得分:0)

我发现了带有参数的错误,但是 改变: # load certificate certificate_server = OpenSSL::X509::Certificate.new(File.read("certificate_server.crt")) # CERT INFORMATION IS VERIFIED SUCCESSFULLY HERE # DIGEST IS VERIFIED SUCCESSFULLY HERE # certificate signature initialization response_signature = Akami::WSSE::VerifySignature.new(response) document = response_signature.document namespaces = response_signature.namespaces # retrieve Signature data & digest value data = document.at_xpath('//wse:Security/ds:Signature/ds:SignedInfo', namespaces).canonicalize(Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0) signature = Base64.decode64(document.at_xpath('//wse:Security/ds:Signature/ds:SignatureValue', namespaces).text) # check if Signature is valid return false unless certificate_server.public_key.verify(OpenSSL::Digest::SHA1.new, signature, data) true

使用:

certificate_server.public_key.verify(signature_digester, signature, data)

现在有效。