Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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 如何将.png图像转换为字符串并通过Django API发送?_Python_Django_Django Rest Framework - Fatal编程技术网

Python 如何将.png图像转换为字符串并通过Django API发送?

Python 如何将.png图像转换为字符串并通过Django API发送?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在尝试将.png图像转换为字符串,并通过DjangoAPI发送,但这会导致错误 from django.shortcuts import render from django.http import HttpResponse import numpy as np import pandas as pd import matplotlib.pyplot as plt import base64 # Create your views here. from django.views.decor

我正在尝试将.png图像转换为字符串,并通过DjangoAPI发送,但这会导致错误

from django.shortcuts import render
from django.http import HttpResponse
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import base64

# Create your views here.
from django.views.decorators.csrf import csrf_exempt
import json

@csrf_exempt

def get_res(request):
    if request.method == 'POST':
        x = json.loads(request.body)
        arrx = x['x']
        arry = x['y']
        plt.plot(arrx,arry)
        plt.savefig('plot.png')
        with open('plot.png', 'rb') as imageFile:
            str = base64.b64encode(imageFile.read())
        response = json.dumps([{'image': str}])
        return HttpResponse(response, content_type = 'text/json')
这会导致错误

Internal Server Error: /
Traceback (most recent call last):
  File "C:\lol\myenv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
  File "C:\lol\myenv\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
response = self.process_exception_by_middleware(e, request)
  File "C:\lol\myenv\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\lol\myenv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
  File "C:\lol\apiex\api1\views.py", line 23, in get_res
response = json.dumps([{'image': str}])
  File "c:\users\new u\appdata\local\programs\python\python37\Lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
  File "c:\users\new u\appdata\local\programs\python\python37\Lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
  File "c:\users\new u\appdata\local\programs\python\python37\Lib\json\encoder.py", line 257, in iterencode
return _iterencode(o, 0)
  File "c:\users\new u\appdata\local\programs\python\python37\Lib\json\encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type bytes is not JSON serializable

请告诉我如何解决此问题,或者是否有更好的方法解决此问题。

您应该使用
.decode()
将二进制字符串转换为字符串:

@csrf_exempt
def get_res(request):
    if request.method == 'POST':
        x = json.loads(request.body)
        arrx = x['x']
        arry = x['y']
        plt.plot(arrx,arry)
        plt.savefig('plot.png')
        with open('plot.png', 'rb') as imageFile:
            data = base64.b64encode(imageFile.read()).decode()
        response = json.dumps([{'image': data}])
        return HttpResponse(response, content_type = 'text/json')
@csrf\u豁免
def get_res(请求):
如果request.method==“POST”:
x=json.loads(request.body)
arrx=x['x']
arry=x['y']
plt.绘图(arrx,arry)
plt.savefig('plot.png')
打开('plot.png','rb')作为图像文件:
data=base64.b64编码(imageFile.read()).decode()
response=json.dumps([{'image':data}])
返回HttpResponse(响应,内容类型='text/json')
这是base64字符串,因此您必须在客户端将该字符串“解码”为图像,如所示

注意:不要用类名命名变量,因为它会“隐藏”对类的引用


该字符串的格式是什么?图像的base64流ByTestStream?我只想将图像转换为字符串,作为响应发送,然后将其转换回angular page中的图像。最好的方法是什么?