Django rest framework 在apache2上运行的django rest框架未向客户端返回完整响应

Django rest framework 在apache2上运行的django rest框架未向客户端返回完整响应,django-rest-framework,python-requests,apache2,python-3.6,wsgi,Django Rest Framework,Python Requests,Apache2,Python 3.6,Wsgi,我在apache/2.4.29上运行一个api,该api是在wsgi上运行的django 2.2.5之上使用django rest framework 3.10.3构建的,每当我尝试为客户端的POST请求返回json对象时,apiviews.py中描述成功的POST方法都不会发送完整数据。我试过使用curl、postman和insomina,结果都是一样的。日志显示返回的响应对象已完全发送。 这是apiviews.py代码: 从rest\u框架导入泛型、状态、视图集和权限 来自rest\u fr

我在apache/2.4.29上运行一个api,该api是在wsgi上运行的django 2.2.5之上使用django rest framework 3.10.3构建的,每当我尝试为客户端的POST请求返回json对象时,apiviews.py中描述成功的POST方法都不会发送完整数据。我试过使用curl、postman和insomina,结果都是一样的。日志显示返回的响应对象已完全发送。 这是apiviews.py代码:

从rest\u框架导入泛型、状态、视图集和权限
来自rest\u framework.response导入响应
从rest_framework.views导入APIView
从django.shortcuts导入get_object_或_404、get_list_或_404
从django.contrib.auth导入验证
导入线程
导入日期时间
导入json
从commons.models导入SMSMessage
从commons.serializer导入SMSMessagesSerializer
从notification.sender导入发件人
类别SMSView(APIView):
def post(自我,请求):
sms_messages_serializer=SMSMessagesSerializer(
资料={
“短信号码收件人”:request.data.get(“短信号码收件人”),
“短信内容”:request.data.get(“短信内容”),
“发送用户”:request.auth.user\u id,
}
)
权限\类=(permissions.IsAuthenticated)
如果sms\u消息\u序列化程序有效():
要发送的数据={
“编号”:sms\u消息\u序列化程序。已验证\u数据[
“手机短信号码”
],
“msg\u text”:sms\u消息\u序列化程序。已验证\u数据[
“短信内容”
]
}
sms\u对象=sms\u消息\u序列化程序.save()
其他:
打印(“无效数据-{0}\t{1}”。格式(sms_messages_serializer.errors,datetime.datetime.now())
数据发送=无
最大重试次数=0
resp=响应()
最大重试次数<3时:
最大重试次数+=1
状态标志,状态响应=发送方(数据发送)
如果不是状态标志:
resp=响应(
资料={
“状态”:“未发送短信”
},
status=status.HTTP\u 500\u内部\u服务器\u错误,
content\u type=“应用程序/json”
)
其他:
#SMSMessagesSerializer类中定义的更新方法
#需要使用一个实例。
sms\u消息\u序列化程序.update(
sms_对象,
{
“交货状态”:真
}
)
resp=响应(
资料={
“状态”:“短信发送成功”
},
headers=状态\响应.headers,
状态=状态\响应。状态\代码,
content\u type=“应用程序/x-www-form-urlencoded”
)
打印(相应数据)
返回响应
其他:
resp=响应(
资料={
“错误”:“无法发送短信”
},
status=status.HTTP\u 500\u内部\u服务器\u错误,
content\u type=“应用程序/json”
)
打印(相应数据)
返回响应
sms成功发送后,在日志文件上打印:

[Wed Dec 23 14:19:29.789772 2020] [wsgi:error] [pid 27330] [remote xxx.xxx.xxx.xxx:xxxx] {'status': 'sms successfully sent.'}
但这不是交付给客户机的内容,客户机应用程序接收:

{"status":"sms successfull
为了更加清晰,这是
sender
模块——它使用python请求库:

导入请求
导入时间
导入json
来自rest\u framework.response导入响应
从rest\u框架导入状态
基本url=”http://xxx.xxx.xxx.xxx:xxxx/"
def发送器(sms_数据):
"""
访问服务器并发送sms的实际功能。
"""
发送url=base\u url+“api/sendsms/”
发送_头={“内容类型”:“application/x-www-form-urlencoded”}
response=requests.response()
尝试:
response=requests.post(
正在发送您的url,
数据=sms_数据,
headers=发送_头,
超时=(7,14),
)
响应。针对_状态()提出_
例外情况除外,如e:
打印(“{}”。格式(e))
返回False,响应
其他:
返回True,响应
由于所有的头都完好无损,并且这只发生在成功响应上,所以它不会出现在其余的响应上

如何使其向客户发送完整响应


谢谢

成功响应时设置的标题会通知错误的内容长度和内容类型

您的响应当前是这样构建的:

resp=响应(
资料={
“状态”:“成功”
},
headers=状态\响应.headers,
状态=状态\响应。状态\代码,
content\u type=“申请/表格数据”
)
在这里,您正在转发来自SMS服务的响应头,例如
内容长度
,而传输的内容是
{“status”:“success”}

当内置响应中未提供
内容长度
时,框架将根据传输的内容进行计算

还要注意的是,传输的内容是JSON数据,而不是
表单数据

如果您关心SMS服务响应中的任何特定头,我建议明确选择要发送回请求者的头,如下所示:

resp=响应(
资料={
“状态”:“成功”
},
标题={
“从短信服务传递的特定标题名称”:状态响应。标题[“从短信服务传递的特定标题名称”],
#...
},
状态=状态\响应。状态\代码,
content\u type=“应用程序/json”
)
否则,如果您不关心来自的响应中的任何标题