fanfanacs 2023-01-31 08:58 采纳率: 100%
浏览 129
已结题

django 验证码不显示

跟着网上教程写的代码,检查了3遍代码应该是没有问题,但是验证码不显示
def verify(request):
#引入随机函数模块
import random
from PIL import Image, ImageDraw, ImageFont
#定义变量,用于画面的背景色、宽、高
#bgcolor = (random.randrange(20, 100), random.randrange(
#    20, 100),100)
bgcolor = (242,164,247)
width = 100
height = 25
#创建画面对象
im = Image.new('RGB', (width, height), bgcolor)
#创建画笔对象
draw = ImageDraw.Draw(im)
#调用画笔的point()函数绘制噪点
for i in range(0, 100):
    xy = (random.randrange(0, width), random.randrange(0, height))
    fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
    draw.point(xy, fill=fill)
#定义验证码的备选值
#str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
str1 = '0123456789'
#随机选取4个值作为验证码
rand_str = ''
for i in range(0, 4):
    rand_str += str1[random.randrange(0, len(str1))]
#构造字体对象,ubuntu的字体路径为“/usr/share/fonts/truetype/freefont”
font = ImageFont.truetype('static/arial.ttf', 21)
#font = ImageFont.load_default().font
#构造字体颜色
fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
#绘制4个字
draw.text((5, -3), rand_str[0], font=font, fill=fontcolor)
draw.text((25, -3), rand_str[1], font=font, fill=fontcolor)
draw.text((50, -3), rand_str[2], font=font, fill=fontcolor)
draw.text((75, -3), rand_str[3], font=font, fill=fontcolor)
#释放画笔
del draw
#存入session,用于做进一步验证
request.session['verifycode'] = rand_str
"""
python2的为
# 内存文件操作
import cStringIO
buf = cStringIO.StringIO()
"""
# 内存文件操作-->此方法为python3的
import io
buf = io.BytesIO()
#将图片保存在内存中,文件类型为png
im.save(buf, 'png')
个人猜应该是电脑少装了内容,但具体缺了啥不清楚

img

展开全部

  • 写回答

6条回答 默认 最新

  • P2441M 2023-01-31 09:10
    关注

    我把这段代码单拎出来运行了一下,确实能正常绘制,有没有这个视图对应的模板文件的代码?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    fanfanacs 2023-02-01 00:42

    这个吗?

     <div class="form-group has-feedback">
            <input type="text" name="code" class="form-control" style="width:150px" placeholder="验证码">
            <span class="form-control-feedback" style="width:150px">
                <img src="{% url 'myadmin_verify' %}"/>
            </span>
    

    最后也是要跳转到我之前发的这段代码这里的

    回复
    P2441M 回复 fanfanacs 2023-02-01 01:08

    img虽然默认只能显示对应url的图片,但是可以用 Data URI Scheme 来显示内存的图片。
    在verify那里添加这些代码试试:

    from base64 import b64encode
    
    def verify(request):
        # 之前的代码...
        source = 'data:image/jpeg;base64,' + b64encode(buf.getvalue()).decode()  # 编码成 base64 再用默认方式解码
        return render(request, 'verify.html', {'source': source})
    
    <img src="{{ source }}"/>
    

    回复
    fanfanacs 回复 P2441M 2023-02-01 01:23

    改完之后直接没了

    img

    回复
    展开全部5条评论
查看更多回答(5条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 2月8日
  • 已采纳回答 2月1日
  • 创建了问题 1月31日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部