Django模版(三)
Django模版(三)
文章目錄
- Django模版(三)
- 一、圖片驗證碼
- 1.驗證碼
- 2.手動實現驗證碼
- 3.調用驗證碼
- 4.驗證
- 5.點擊“看不清,換一個”,換一個新的驗證碼
- 二、反向解析
- 1.先看看原來怎么做
- 2.反向解析
- 3.URL的參數
一、圖片驗證碼
1.驗證碼
在用戶注冊、登錄頁面,為了防止暴力請求,可以加入驗證碼功能,如果驗證碼錯誤,則不需要繼續處理,可以減輕業務服務器、數據庫服務器的壓力。
2.手動實現驗證碼
接下來的代碼不要求手動寫出來,因為這種代碼在網上可以搜到很多。
1)安裝包Pillow3.4.1。
pip install Pillow==3.4.1點擊查看PIL模塊API,以下代碼中用到了Image、ImageDraw、ImageFont對象及方法。
2)在booktest/views.py文件中,創建視圖verify_code。
提示1:隨機生成字符串后存入session中,用于后續判斷。 提示2:視圖返回mime-type為image/png。
from PIL import Image, ImageDraw, ImageFont from django.utils.six import BytesIO ... def verify_code(request):#引入隨機函數模塊import random#定義變量,用于畫面的背景色、寬、高bgcolor = (random.randrange(20, 100), random.randrange(20, 100), 255)width = 100height = 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'#隨機選取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('FreeMono.ttf', 23)#構造字體顏色fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))#繪制4個字draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)#釋放畫筆del draw#存入session,用于做進一步驗證request.session['verifycode'] = rand_str#內存文件操作buf = BytesIO()#將圖片保存在內存中,文件類型為pngim.save(buf, 'png')#將內存中的圖片數據返回給客戶端,MIME類型為圖片pngreturn HttpResponse(buf.getvalue(), 'image/png')3)打開booktest/urls.py文件,配置url。
url(r'^verify_code/$', views.verify_code),4)運行服務器,在瀏覽器中輸入如下網址。
http://127.0.0.1:8000/verify_code/5)瀏覽效果如下圖:
3.調用驗證碼
1)在booktest/views.py文件中,創建視圖verify_show。
def verify_show(request):return render(request,'booktest/verify_show.html')2)打開booktest/urls.py文件,配置url。
url(r'^verify_show/$', views.verify_show),3)在templates/booktest/目錄下創建verify_show.html。
<html> <head><title>驗證碼</title> </head> <body> <form method="post" action="/verify_yz/">{%csrf_token%}<input type="text" name="yzm"><img id="yzm" src="/verify_code/"/><span id="change">看不清,換一個</span><br><input type="submit" value="提交"> </form> </body> </html>4)運行服務器,在瀏覽器中輸入如下網址。
http://127.0.0.1:8000/verify_show/5)瀏覽效果如下圖:
4.驗證
1)在booktest/views.py文件中,創建視圖verify_yz。
def verify_yz(request):yzm=request.POST.get('yzm')verifycode=request.session['verifycode']response=HttpResponse('no')if yzm==verifycode:response=HttpResponse('ok')return response2)打開booktest/urls.py文件,配置url。
url(r'^verify_yz/$', views.verify_yz),3)回到瀏覽器后刷新,在文本框中填寫驗證碼,點擊提交按鈕。
4)瀏覽效果如下圖:
5.點擊“看不清,換一個”,換一個新的驗證碼
<script type="text/javascript" src="/static/jquery-1.12.4.min.js"></script> <script type="text/javascript">$(function(){$('#change').css('cursor','pointer').click(function() {$('#yzm').attr('src',$('#yzm').attr('src')+1)});}); </script> ... <img id="yzm" src="/verify_code/?1"/> <span id="change">看不清,換一個</span>二、反向解析
當某一個url配置的地址發生變化時,頁面上使用反向解析生成地址的位置不需要發生變化。
- 根據url 正則表達式的配置動態的生成url。
- 在項目urls中包含具體應用的urls文件時指定namespace;
1.先看看原來怎么做
2)打開booktest/urls.py文件,配置url。
url(r'^fan1/$', views.fan1),url(r'^fan2/$', views.fan2),3)在templates/booktest/目錄下創建fan1.html。
<html> <head><title>反向解析</title> </head> <body> 普通鏈接:<a href="/fan2/">fan2</a> </body> </html>4)運行服務器,在瀏覽器中輸入如下網址:
http://127.0.0.1:8000/fan1/瀏覽效果如下圖:
5)點擊鏈接后轉向fan2,效果如下圖:
6)打開booktest/urls.py文件,修改"fan2"的正則表達式為"fan_show"。
7)打開瀏覽器,后退一下,刷新后再次點擊鏈接,瀏覽如下圖:
問題就來了:隨著功能的增加會出現更多的視圖,可能之前配置的正則表達式不夠準確,于是就要修改正則表達式,但是正則表達式一旦修改了,之前所有對應的超鏈接都要修改,真是一件麻煩的事情,而且可能還會漏掉一些超鏈接忘記修改,有辦法讓鏈接根據正則表達式動態生成嗎?
答:反向解析。
反向解析應用在兩個地方:模板中的超鏈接,視圖中的重定向。
2.反向解析
要實現反向解析功能,需要如下步驟:
1)在test4/urls.py中為include定義namespace屬性。
url(r'^',include('booktest.urls',namespace='booktest')),2)在booktest/urls.py中為url定義name屬性,并修改為fan2。
url(r'^fan2/$', views.fan2,name='fan2'),3)在模板中使用url標簽做超鏈接,此處為templates/booktest/fan1.html文件。
<html> <head><title>反向解析</title> </head> <body> 普通鏈接:<a href="/fan2/">fan2</a> <hr> 反向解析:<a href="{%url 'booktest:fan2'%}">fan2</a> </body> </html>4)回到瀏覽器中,后退,刷新,查看源文件如下圖,兩個鏈接地址一樣。
5)在booktest/urls.py中,將fan2修改為fan_show。
6)回到瀏覽器中,刷新,查看源文件如下圖,兩個鏈接地址不一樣。
7)反向解析也可以應用在視圖的重定向中。
- 總結:在定義url時,需要為include定義namespace屬性,為url定義name屬性,使用時,在模板中使用url標簽,在視圖中使用reverse函數,根據正則表達式動態生成地址,減輕后期維護成本。
3.URL的參數
有些url配置項正則表達式中是有參數的,接下來講解如何傳遞參數。
- 情況一:位置參數
1)在booktest/urls.py中,修改fan2如下:
url(r'^fan(\d+)_(\d+)/$', views.fan3,name='fan2'),2)在booktest/views中,定義視圖fan3如下:
def fan3(request, a, b):return HttpResponse(a+b)3)修改templates/booktest/fan1.html文件如下:
<html> <head><title>反向解析</title> </head> <body> 普通鏈接:<a href="/fan2_3/">fan2</a> <hr> 反向解析:<a href="{%url 'booktest:fan2' 2 3%}">fan2</a> </body> </html>4)回到瀏覽器中,刷新,查看源文件如下圖:
使用重定向傳遞位置參數格式如下:
- 情況二:關鍵字參數
1)在booktest/urls.py中,修改fan2如下:
url(r'^fan(?P<id>\d+)_(?P<age>\d+)/$', views.fan4,name='fan2'),2)在booktest/views中,定義視圖fan4如下:
def fan4(request, id, age):return HttpResponse(id+age)2)修改templates/booktest/fan1.html文件如下:
<html> <head><title>反向解析</title> </head> <body> 普通鏈接:<a href="/fan100_18/">fan2</a> <hr> 反向解析:<a href="{%url 'booktest:fan2' id=100 age=18%}">fan2</a> </body> </html>3)回到瀏覽器中,刷新,查看源文件如下圖:
使用重定向傳遞關鍵字參數格式如下:
在模板文件中使用時,格式如下:
{% url 'namespace名字:name' %} 例如{% url ‘booktest:fan2’%};
帶位置參數:
{% url 'namespace名字:name' 參數 %} 例如{% url ‘booktest:fan2’ 1%}
帶關鍵字參數:
{% url 'namespace名字:name' 關鍵字參數 %} 例如{% url ‘booktest:fan2’ id=1 %}
在重定向的時候使用反向解析:
from django.core.urlresolvers import reverse
無參數:
reverse('namespace名字:name名字')
如果有位置參數
reverse('namespace名字:name名字', args = 位置參數元組)
如果有關鍵字參數
reverse('namespace名字:name名字', kwargs=字典)
總結
以上是生活随笔為你收集整理的Django模版(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django模版(二)
- 下一篇: Django静态文件处理、中间件及Adm