加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Django ORM性能优化 和 图片验证码

发布时间:2020-12-17 00:03:03 所属栏目:Python 来源:网络整理
导读:= models.User.objects.all().values( , , 2 = 3. select_related(外键/一对一) --> = models.User.objects.all().select_related( 4. prefetch_related( ) --> = models.User.objects.all().prefetch_related( 5. only( ) --> = models.User.objects.all().

= models.User.objects.all().values(,,2=3. select_related(外键/一对一) -->= models.User.objects.all().select_related(4. prefetch_related() -->= models.User.objects.all().prefetch_related(5. only() -->= models.User.objects.all().only(= models.User.objects.all().defer()

<span style="color: #0000ff;">def<span style="color: #000000;"> get_vcode():
tmp =<span style="color: #000000;"> []
<span style="color: #0000ff;">for i <span style="color: #0000ff;">in range(5<span style="color: #000000;">):
l = chr(random.randint(97,122)) <span style="color: #008000;">#<span style="color: #008000;"> 生成随机的小写字母
u = chr(random.randint(65,90)) <span style="color: #008000;">#<span style="color: #008000;"> 生成随机的大写字母
n = str(random.randint(0,9)) <span style="color: #008000;">#<span style="color: #008000;"> 生成一个随机的数字
<span style="color: #008000;">#<span style="color: #008000;"> 从上面三个随机选一个
r =<span style="color: #000000;"> random.choice([l,u,n])
tmp.append(r)
<span style="color: #0000ff;">return <span style="color: #800000;">""<span style="color: #000000;">.join(tmp)

<span style="color: #0000ff;">if <span style="color: #800080;">name == <span style="color: #800000;">'<span style="color: #800000;">main<span style="color: #800000;">'<span style="color: #000000;">:
ret =<span style="color: #000000;"> get_vcode()
<span style="color: #0000ff;">print(ret)

PIL <span style="color: #0000ff;">def<span style="color: #000000;"> random_color():
<span style="color: #0000ff;">return
random.randint(0,255),random.randint(0,255<span style="color: #000000;">)

<span style="color: #0000ff;">def<span style="color: #000000;"> vcode():
<span style="color: #008000;">#<span style="color: #008000;"> 创建一个随机颜色的图片对象
image_obj =<span style="color: #000000;"> Image.new(
<span style="color: #800000;">"<span style="color: #800000;">RGB<span style="color: #800000;">"<span style="color: #000000;">,(250,35<span style="color: #000000;">),random_color()
)

with open(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;static/imgs/vcode.png</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;wb</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;) as f1:
    image_obj.save(f1,format</span>=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;PNG</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)

<span style="color: #0000ff;">def<span style="color: #000000;"> vcode():
<span style="color: #008000;">#<span style="color: #008000;"> 创建一个随机颜色的图片对象
image_obj =<span style="color: #000000;"> Image.new(
<span style="color: #800000;">"<span style="color: #800000;">RGB<span style="color: #800000;">"<span style="color: #000000;">,random_color()
)

</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 在该图片对象上生成一个画笔对象</span>
draw_obj =<span style="color: #000000;"&gt; ImageDraw.Draw(image_obj)
</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 加载一个字体对象</span>
font_obj = ImageFont.truetype(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;static/font/kumo.ttf</span><span style="color: #800000;"&gt;'</span>,28<span style="color: #000000;"&gt;)
tmp </span>=<span style="color: #000000;"&gt; []
</span><span style="color: #0000ff;"&gt;for</span> i <span style="color: #0000ff;"&gt;in</span> range(5<span style="color: #000000;"&gt;):
    l </span>= chr(random.randint(97,n])
    draw_obj.text((i </span>* 45 + 30,0),r,fill=random_color(),font=<span style="color: #000000;"&gt;font_obj,)

with open(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;static/imgs/vcode.png</span><span style="color: #800000;"&gt;"</span>,format</span>=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;PNG</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)

<span style="color: #008000;">#<span style="color: #008000;"> 专门返回验证码图片的视图函数
<span style="color: #0000ff;">def<span style="color: #000000;"> vcode(request):
<span style="color: #0000ff;">from PIL <span style="color: #0000ff;">import<span style="color: #000000;"> Image,ImageFont

</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 定义一个生成随机颜色代码的函数</span>
<span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; random_color():
    </span><span style="color: #0000ff;"&gt;return</span> random.randint(0,255<span style="color: #000000;"&gt;)

</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 创建一个随机颜色的图片对象</span>
image_obj =<span style="color: #000000;"&gt; Image.new(
    </span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;RGB</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,random_color()
)
</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 在该图片对象上生成一个画笔对象</span>
draw_obj =<span style="color: #000000;"&gt; ImageDraw.Draw(image_obj)
</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 加载一个字体对象</span>
font_obj = ImageFont.truetype(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;static/font/kumo.ttf</span><span style="color: #800000;"&gt;'</span>,n])
    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 将选中过的那个字符写到图片上</span>
    draw_obj.text((40 * i + 30,font=<span style="color: #000000;"&gt;font_obj)
    tmp.append(r)

</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; # 加干扰线</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; width = 250  # 图片宽度(防止越界)</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; height = 35</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; for i in range(5):</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;     x1 = random.randint(0,width)</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;     x2 = random.randint(0,width)</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;     y1 = random.randint(0,height)</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;     y2 = random.randint(0,height)</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;     draw_obj.line((x1,y1,x2,y2),fill=random_color())</span>
<span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> # 加干扰点
<span style="color: #008000;">#<span style="color: #008000;"> for i in range(40):
<span style="color: #008000;">#<span style="color: #008000;"> draw_obj.point([random.randint(0,width),height)],fill=random_color())
<span style="color: #008000;">#<span style="color: #008000;"> x = random.randint(0,width)
<span style="color: #008000;">#<span style="color: #008000;"> y = random.randint(0,height)
<span style="color: #008000;">#<span style="color: #008000;"> draw_obj.arc((x,y,x+4,y+4),90,fill=random_color())
<span style="color: #000000;">
v_code = <span style="color: #800000;">""<span style="color: #000000;">.join(tmp).upper()
<span style="color: #008000;">#<span style="color: #008000;"> 将生成的验证码保存
request.session[<span style="color: #800000;">"<span style="color: #800000;">v_code<span style="color: #800000;">"] =<span style="color: #000000;"> v_code

</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; with open("static/images/vcode.png","wb") as f1:</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;     image_obj.save(f1,format="PNG")</span>
<span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> with open("static/images/vcode.png","rb") as f:
<span style="color: #008000;">#<span style="color: #008000;"> img_data = f.read()
<span style="color: #008000;">#<span style="color: #008000;"> 直接在内存中保存图片替代io操作
<span style="color: #0000ff;">from io <span style="color: #0000ff;">import<span style="color: #000000;"> BytesIO
f1 =<span style="color: #000000;"> BytesIO()
image_obj.save(f1,format=<span style="color: #800000;">"<span style="color: #800000;">PNG<span style="color: #800000;">"<span style="color: #000000;">)
img_data =<span style="color: #000000;"> f1.getvalue()
<span style="color: #0000ff;">return HttpResponse(img_data,content_type=<span style="color: #800000;">"<span style="color: #800000;">image/png<span style="color: #800000;">"<span style="color: #000000;">)

vcode()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读