Python mod wsgi在使用https和大型数据包发布期间挂起

Python mod wsgi在使用https和大型数据包发布期间挂起,python,apache,flask,https,mod-wsgi,Python,Apache,Flask,Https,Mod Wsgi,我用apache24+openssl(1.1.1)+mod wsgi(4.5.24+ap24vc14)在win10中创建了一个https环境 它对http发布很有效(无论发布数据包有多大),但我遇到了https发布的问题 对于https发布: 当客户机和服务器是同一台本地计算机时,无论发布数据包有多大,都可以正常工作 当客户端是同一域中的另一台机器时,它也适用于中小型发布数据包,可能小于3M,没有精确的数字 当客户端是同一域中的另一台机器,并且发布了相对较大的数据包(大约5M或6M),在最初几次

我用
apache24
+
openssl(1.1.1)
+
mod wsgi(4.5.24+ap24vc14)
在win10中创建了一个https环境

它对http发布很有效(无论发布数据包有多大),但我遇到了https发布的问题

对于https发布:

  • 当客户机和服务器是同一台本地计算机时,无论发布数据包有多大,都可以正常工作

  • 当客户端是同一域中的另一台机器时,它也适用于中小型发布数据包,可能小于3M,没有精确的数字

  • 当客户端是同一域中的另一台机器,并且发布了相对较大的数据包(大约5M或6M),在最初几次成功发布后,程序挂起在服务器
    body=environ['wsgi.input'].read(length)
    ,没有响应,也没有错误(很少会在长时间后成功通过,但大多数情况下会一直挂起,直到连接超时)

  • 调试客户端和服务器时,
    length
    的运行时值既正确又相同

  • 似乎
    body=environ['wsgi.input'].read(length)
    来自
    sys.stdin.buffer.read(length)
    ,但我仍然找不到根本原因和解决方案

  • 客户端代码:

    import json
    import requests
    import base64
    import requests.packages.urllib3.util.ssl_
    requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ALL'
    url="https://192.168.0.86"
    # url="http://192.168.0.86"
    f_img=open("./PICs/20191024142412.jpg",'rb')
    # f_img=open("./PICs/20191023092645.jpg",'rb')
    json_data={'type':'idpic','image':str(base64.b64encode(f_img.read()),'utf-8')}
    result = requests.post(url,json=json_data,verify=False)
    result_data=json.loads(result.content)
    print(result_data)
    
    部分服务器代码:

    class WSGICopyBody(object):
    
        def __init__(self, application):
            self.application = application
    
        def __call__(self, environ, start_response):
            from io import StringIO, BytesIO
            length = environ.get('CONTENT_LENGTH', '0')
            length = 0 if length == '' else int(length)
            body = environ['wsgi.input'].read(length)
            environ['body_copy'] = body
            environ['wsgi.input'] = BytesIO(body)
            app_iter = self.application(environ,self._sr_callback(start_response))
            return app_iter
    
        def _sr_callback(self, start_response):
            def callback(status, headers, exc_info=None):
                start_response(status, headers, exc_info)
            return callback
    
    app = Flask(__name__)
    app.wsgi_app = WSGICopyBody(app.wsgi_app)
    
    @app.route('/',methods=['POST'])
    @app.route('/picserver',methods=['POST'])
    def picserver():     
        print("before request.get_data")
        request_json_data = request.environ['body_copy']