尝试使用 python 的 StreamingHttpResponse 创建和下载包含大型数据集的 csv 文件时,如何防止 500 CORS 错误?
How do I prevent a 500 CORS error when attempting to create and download a csv file containing a large data set using python's StreamingHttpResponse?
该函数对于小数据集运行和工作完美,但对于大数据集,会产生以下错误:
(URL隐藏在红色)
500 CORS 错误。从下面的代码中可以看出,我尝试将多个响应 headers 添加到响应 (StreamingHttpResponse object) 中,重点是扩展时间函数可以 run/execute/query 在超时之前。我还尝试添加 headers 来处理跨站点问题,我认为这首先不是问题,因为该函数在小数据集上工作得很好:
def create_and_download_csv(self, request):
qs = self.filter_queryset(self.get_queryset())
serialized = self.serializer_class(qs, many=True)
# mapping csv headers to columns
headers = {
"column_header": "Column Header",
"column_header": "Column Header",
"column_header": "Column Header",
"column_header": "Column Header",
}
response = StreamingHttpResponse(
renderers.CSVStreamingRenderer().render(
serialized.data,
renderer_context={'header': headers.keys(), 'labels': headers}
),
content_type="text/csv",
)
response["Access-control-Allow-Headers"] = "*"
response["Connection"] = "keep-alive"
response["Content-Disposition"] = 'attachment; filename="status.csv"'
response["Access-Control-allow-origin"] = "*"
response["Keep-Alive"] = 200
response["Timeout"] = 100
print(response)
return response
也许我把 headers 放错地方了?还是项目运行的 docker 容器是我应该配置超时值的地方?有想法请帮忙
使用Django CORS头库
pip install django-cors-headers
将其添加到您已安装的应用程序中:
INSTALLED_APPS = (
'corsheaders',
)
添加一个 CORS 中间件class
MIDDLEWARE_CLASSES = (
'corsheaders.middleware.CorsMiddleware',
)
然后将您的域添加到 CORS_ORIGIN_WHITELIST
CORS_ORIGIN_WHITELIST = [
"https://example.com",
"https://sub.example.com",
"http://localhost:8080",
"http://127.0.0.1:9000"
]
原来问题是在项目的 deployment/hosting/serving 中使用的 Gunicorn 和 Kong 上设置的超时。请求超时,因为工作人员在给出有效响应之前被杀死。
该函数对于小数据集运行和工作完美,但对于大数据集,会产生以下错误:
(URL隐藏在红色)
500 CORS 错误。从下面的代码中可以看出,我尝试将多个响应 headers 添加到响应 (StreamingHttpResponse object) 中,重点是扩展时间函数可以 run/execute/query 在超时之前。我还尝试添加 headers 来处理跨站点问题,我认为这首先不是问题,因为该函数在小数据集上工作得很好:
def create_and_download_csv(self, request):
qs = self.filter_queryset(self.get_queryset())
serialized = self.serializer_class(qs, many=True)
# mapping csv headers to columns
headers = {
"column_header": "Column Header",
"column_header": "Column Header",
"column_header": "Column Header",
"column_header": "Column Header",
}
response = StreamingHttpResponse(
renderers.CSVStreamingRenderer().render(
serialized.data,
renderer_context={'header': headers.keys(), 'labels': headers}
),
content_type="text/csv",
)
response["Access-control-Allow-Headers"] = "*"
response["Connection"] = "keep-alive"
response["Content-Disposition"] = 'attachment; filename="status.csv"'
response["Access-Control-allow-origin"] = "*"
response["Keep-Alive"] = 200
response["Timeout"] = 100
print(response)
return response
也许我把 headers 放错地方了?还是项目运行的 docker 容器是我应该配置超时值的地方?有想法请帮忙
使用Django CORS头库
pip install django-cors-headers
将其添加到您已安装的应用程序中:
INSTALLED_APPS = (
'corsheaders',
)
添加一个 CORS 中间件class
MIDDLEWARE_CLASSES = (
'corsheaders.middleware.CorsMiddleware',
)
然后将您的域添加到 CORS_ORIGIN_WHITELIST
CORS_ORIGIN_WHITELIST = [
"https://example.com",
"https://sub.example.com",
"http://localhost:8080",
"http://127.0.0.1:9000"
]
原来问题是在项目的 deployment/hosting/serving 中使用的 Gunicorn 和 Kong 上设置的超时。请求超时,因为工作人员在给出有效响应之前被杀死。