Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django截断响应_Python_Django_Wsgi - Fatal编程技术网

Python Django截断响应

Python Django截断响应,python,django,wsgi,Python,Django,Wsgi,我创建了一个小Django应用程序并将其部署在Ubuntu上, views.py 该应用程序的主要目标是获取sql查询并以文件形式返回csv响应,文件大小可以超过200 mb。我有一个问题-我的响应总是被截断到696KB(不管cursor.execute结果中的行数如何)。有一个例子。您可以看到最后截断的行。 服务器是通过“python3 manage.py runserver 0.0.0.0:8000”命令运行的。 请帮我解决我的问题 已更新 我用Nginx和gunicorn重新部署了它,并

我创建了一个小Django应用程序并将其部署在Ubuntu上, views.py

该应用程序的主要目标是获取sql查询并以文件形式返回csv响应,文件大小可以超过200 mb。我有一个问题-我的响应总是被截断到696KB(不管cursor.execute结果中的行数如何)。有一个例子。您可以看到最后截断的行。

服务器是通过“python3 manage.py runserver 0.0.0.0:8000”命令运行的。 请帮我解决我的问题

已更新 我用Nginx和gunicorn重新部署了它,并尝试了这里建议的解决方案 尽管如此,我还是犯了同样的错误

我修正了我的代码,在这篇文章之后-


现在一切都好了。

听起来你可能需要一个。你试过实现这个吗?您似乎遇到了缓冲/分块响应的某种问题。可以使用gunicorn或nginx之类的工具来增加缓冲区大小,但这不是一个真正的解决方案

from django.shortcuts import render
import json
import psycopg2
import csv
from django.http import HttpResponse
from ratelimit.decorators import ratelimit
def create_connection():
    return psycopg2.connect(database="data",user="ag",host="localhost",port=5432,password='pass')

def execute_query(query, parameters):
    with create_connection() as connection:
        result = []
        cursor = connection.cursor()
        cursor.execute(query, parameters)
        for row in cursor:
            result.append(row)
        for i in range(len(result)):
            result[i] = list(result[i])
            for j in range(len(result[i])):
                result[i][j] = result[i][j] if result[i][j] else ""
        return result

@ratelimit(key='ip', rate='10/m')
def to_csv(request):
    j_body = json.loads(request.GET.get('data', ''))
    query = j_body['query']
    print(query)
    print("****************************************************************")
    parameters = j_body['params']
    headers = j_body['headers']
    rows = execute_query(query, parameters)
    response = HttpResponse(content_type='text_csv')
    response['Content-Disposition'] = 'attachment; filename="result.csv"'
    writer = csv.writer(response)
    writer.writerow(headers)
    writer.writerows(rows)
    return response
#Also changed execute_query method, so it doesn't create redurant copy of response from database
def execute_query(query, parameters):
    with create_connection() as connection:
        result = []
        cursor = connection.cursor()
        cursor.execute(query, parameters)
        return cursor

class Echo(object):
    """An object that implements just the write method of the file-like
    interface.
    """
    def write(self, value):
        """Write the value by returning it, instead of storing in a buffer."""
        return value

@ratelimit(key='ip', rate='10/m')
def to_csv(request):
    try:
        j_body = json.loads(request.GET.get('data', ''))
        query = j_body['query']
        print("****************************************************************")
        parameters = j_body['params']
        headers = j_body['headers']
        cursor = execute_query(query, parameters)
        pseudo_buffer = Echo()
        writer = csv.writer(pseudo_buffer)
        writer.writerow(headers)
        print('Writing began')
        response = StreamingHttpResponse((writer.writerow(row) for row in cursor),
                                     content_type="text/csv")
        response['Content-Disposition'] = 'attachment; filename="result.csv"'
        print('Sending began')
        return response
    except:
        return HttpResponse('Error')