Met*_*ata 6 python json flask python-3.x flask-sqlalchemy
我正在尝试调用一个 API,该 API 又会触发我们的 sqlserver 数据库中的存储过程。这就是我编码的方式。
class Api_Name(Resource):
def __init__(self):
pass
@classmethod
def get(self):
try:
engine = database_engine
connection = engine.connect()
sql = "DECLARE @return_value int EXEC @return_value = [dbname].[dbo].[proc_name])
return call_proc(sql, apiname, starttime, connection)
except Exception as e:
return {'message': 'Proc execution failed with error => {error}'.format(error=e)}, 400
pass
Run Code Online (Sandbox Code Playgroud)
call_proc
是我从数据库返回 JSON 的方法。
def call_proc(sql: str, connection):
try:
json_data = []
rv = connection.execute(sql)
for result in rv:
json_data.append(dict(zip(result.keys(), result)))
return Response(json.dumps(json_data), status=200)
except Exception as e:
return {'message': '{error}'.format(error=e)}, 400
finally:
connection.close()
Run Code Online (Sandbox Code Playgroud)
输出的问题在于 JSON 的返回方式及其大小。最初,API 需要 1 分 30 秒:当 return 语句是这样的时:
case1: return Response(json.dumps(json_data), status=200, mimetype='application/json')
Run Code Online (Sandbox Code Playgroud)
网上查了一下,发现上面的说法是试图美化JSON。所以我mimetype
从响应中删除并将其设为
case2: return Response(json.dumps(json_data), status=200)
Run Code Online (Sandbox Code Playgroud)
API 运行了 30 秒,尽管 JSON 输出未正确对齐,但它仍然是 JSON。我看到从 API 返回的 JSON 的输出大小接近 20MB。我在邮递员的回复中观察到这一点:
Status: 200 OK Time: 29s Size: 19MB
Run Code Online (Sandbox Code Playgroud)
Json输出的区别:
情况1:
[ {
"col1":"val1",
"col2":"val2"
},
{
"col1":"val1",
"col2":"val2"
}
]
Run Code Online (Sandbox Code Playgroud)
案例2:
[{"col1":"val1","col2":"val2"},{"col1":"val1","col2":"val2"}]
Run Code Online (Sandbox Code Playgroud)
上述两种情况的输出差异会有所不同吗?如果是这样,我该如何解决这个问题?如果没有区别,有什么方法可以进一步加快速度并进一步减少运行时间,例如压缩我返回的 JSON?
您可以使用gzip
压缩使纯文本大小从兆字节到甚至千字节。或者甚至使用flask-compress库来实现这一点。
另外我建议使用ujson来加快dump()
通话速度。
import gzip
from flask import make_response
import ujson as json
@app.route('/data.json')
def compress():
compression_level = 5 # of 9 max
data = [
{"col1": "val1", "col2": "val2"},
{"col1": "val1", "col2": "val2"}
]
content = gzip.compress(json.dumps(data).encode('utf8'), compression_level)
response = make_response(content)
response.headers['Content-length'] = len(content)
response.headers['Content-Encoding'] = 'gzip'
return response
Run Code Online (Sandbox Code Playgroud)
文档:
归档时间: |
|
查看次数: |
4471 次 |
最近记录: |