python - mod-wsgi 在使用 https 和大数据包发布期间挂起
问题描述
我在win10中用 apache24
++创建了一个https环境。openssl(1.1.1)
mod-wsgi(4.5.24+ap24vc14)
它适用于 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']
解决方案
推荐阅读
- javascript - 为什么我收到此警告 159:35 警告预计将在箭头函数数组回调返回的末尾返回一个值?
- python - 在 Pony ORM 查询中使用枚举
- snowflake-cloud-data-platform - Snowflake JDBC 驱动程序内部错误:无法检索第一个箭头块的行数:null -- 仅发生在 SELECT 语句上
- behat - 更新到 Drupal 8.9.15 时,我在 Probo 上收到以下 Behat JS 错误。不知道这意味着什么。想法?
- javascript - 使用条件更新对象中的特定值
- python - 为什么 if 语句中的“或”运算符不起作用?
- excel - 这些条不会在我的 Excel 图表中排列是否有原因?
- javascript - 如何为 React Bootstrap 表单自动设置高度
- wpf - ObservabaleCollection 添加/删除不会更新 xaml 端的 ItemsControl
- python - 清除所有数据和画布以重绘底图