python - 在 ZSI Soap 中使用扭曲的 adbapi

标签 python mysql soap twisted zsi

我是 python 新手,目前正在研究将其用作 SOAP 服务器的可行性。我目前有一个非常粗糙的应用程序,使用 mysql 阻塞 api,但想尝试扭曲的 adbapi。我已经使用 react 器在常规扭曲代码上成功使用了扭曲 adbapi,但似乎无法使用 ZSI 框架使其与下面的代码一起使用。它没有从 mysql 返回任何内容。有人曾经使用过扭曲的 adbapi 和 ZSI 吗?

import os
import sys
from dpac_server import *
from ZSI.twisted.wsgi import (SOAPApplication,
                          soapmethod,
                          SOAPHandlerChainFactory)
from twisted.enterprise import adbapi
import MySQLdb

def _soapmethod(op):
    op_request = GED("http://www.example.org/dpac/", op).pyclass
    op_response = GED("http://www.example.org/dpac/", op + "Response").pyclass
    return soapmethod(op_request.typecode, op_response.typecode,operation=op, soapaction=op)

class DPACServer(SOAPApplication):
    factory = SOAPHandlerChainFactory

    @_soapmethod('GetIPOperation')
    def soap_GetIPOperation(self, request, response, **kw):
        dbpool = adbapi.ConnectionPool("MySQLdb", '127.0.0.1','def_user', 'def_pwd', 'def_db', cp_reconnect=True)

        def _dbSPGeneric(txn, cmts):
            txn.execute("call def_db.getip(%s)", (cmts, ))
            return txn.fetchall()

        def dbSPGeneric(cmts):
            return dbpool.runInteraction(_dbSPGeneric, cmts)

        def returnResults(results):
            response.Result = results

        def showError(msg):
            response.Error = msg

        response.Result = ""
        response.Error = ""

        d = dbSPGeneric(request.Cmts)
        d.addCallbacks(returnResults, showError)

        return request, response

def main():
    from wsgiref.simple_server import make_server
    from ZSI.twisted.wsgi import WSGIApplication

    application         = WSGIApplication()
    httpd               = make_server('127.0.0.1', 8080, application)
    application['dpac'] = DPACServer()
    print "listening..."
    httpd.serve_forever()

if __name__ == '__main__':
    main()

最佳答案

您发布的代码为每个(某种)请求创建一个新的ConnectionPool,并且它永远不会停止池。这意味着您最终将耗尽资源,并且无法满足更多请求。 “最终”可能是在一两个或三个请求之后。

如果您从未收到任何回复,也许这不是您遇到的问题。但在某些时候这将成为一个问题。

经过仔细检查,我想知道这段代码是否运行了 Twisted react 器。第一次阅读时,我以为您正在使用一些 ZSI Twisted 集成来运行您的服务器。现在我发现您正在使用 wsgiref.simple_server。我有一定的信心认为这行不通。

您已经在使用 Twisted,use Twisted's WSGI server相反。

除此之外,验证 ZSI 是否在正确的线程中执行回调。 WSGI 应用程序默认在非 react 器线程中运行。 Twisted API 不是线程安全的,因此如果 ZSI 不采取措施纠正这一点,那么在线程中使用非线程安全 API 就会引入错误。

关于python - 在 ZSI Soap 中使用扭曲的 adbapi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18712318/

相关文章:

python - 如何将 gRPC Python 插件与 Docker 和 Google Cloud Builds 一起使用?

MySQL:Digits (1.75) 到 Friendly Time(1 小时 45 分钟)

php - 检索 productcode 字段的最后一个 id 值

java - 这是有效的日期格式吗 - 2007-12-13+01 :00?

java - 使用 namespace 和前缀的 JAXB 解码

python - 创建一个带有未知数量复选框的窗口 - Python/tkinter

python - flask 棉花糖去掉小数点

WCF 身份验证策略

python - 如何应用 if 条件并应用于数据框

php - 使用 "if - else"从同一数据库上的两个表读取数据