[django]用requests从url获取图片(数据类型是bytes)后如何在template中显示出来

今天在做一个注册页面的时候遇到了一个验证码图片在页面显示的问题。

我用requests从一个url上获取到一张图片, 没有保存到本地, 而是想直接作为render的字典参数,传到页面里进行渲染。因为requests.get(url)得到的response.content是bytes, 无法像jpg等本地图片文件直接加到<img src="">中,

我的代码是这样的:

 1 def get_captcha(request):
 2     CAPTCHA_URL = "http://jw.qdu.edu.cn/academic/getCaptcha.do"
 3     session = requests.session()
 4     image = session.get(CAPTCHA_URL)
 5     request.session['JSESSIONID'] = session.cookies['JSESSIONID']
 6     print type(image.content)
 7     return image.content
 8 
 9 def register(request):
10     if request.method == "GET":
11         captcha = get_captcha(request)
12         return render(request, 'student/register.html', {'captcha': captcha})

Html代码是这样的register.html

1 <input type="captcha" id="captcha" name="captcha" placeholder="请输入验证码">
2 <img src="{{ captcha }}" />

百思不得其解,上网也没有查阅到相关的信息。

最后求助了django方面很牛逼的一个学长, 他告诉我要对response.content进行base64编码, 然后就可以渲染到页面上去。加入了base64编码之后,可是图片依然显示不出来

1 def register(request):
2     if request.method == "GET":
3         captcha = get_captcha(request)
4         captcha = b64encode(captcha)
5         return render(request, 'student/register.html', {'captcha': captcha})

想到是否是在html页面中的代码不对, 之后在网上查阅信息才得知, 经过base64编码的图片在html的<img>标签显示时,需要添加一些属性,即下面的data:image/jpeg;base64。 感谢博文:在浏览器中使用Base64编码的图像

1 <input type="captcha" id="captcha" name="captcha" placeholder="请输入验证码">
2 <img src="data:image/jpeg;base64,{{ captcha }}" />

 终于可以显示了。

原文地址:https://www.cnblogs.com/KarryWang/p/3806259.html