日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django模版(三)

發布時間:2024/4/11 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 response

2)打開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.先看看原來怎么做

  • 打開booktest/views.py文件,創建視圖fan1、fan2。
  • def fan1(request):return render(request,'booktest/fan1.html') def fan2(request):return HttpResponse('fan2')

    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"。

    url(r'^fan_show/$', views.fan2),

    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。

    url(r'^fan_show/$', views.fan2,name='fan2'),

    6)回到瀏覽器中,刷新,查看源文件如下圖,兩個鏈接地址不一樣。

    7)反向解析也可以應用在視圖的重定向中。

    from django.shortcuts import redirect from django.core.urlresolvers import reverse return redirect(reverse('booktest:fan2'))
    • 總結:在定義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)回到瀏覽器中,刷新,查看源文件如下圖:

    使用重定向傳遞位置參數格式如下:

    return redirect(reverse('booktest:fan2', args=(2,3)))
    • 情況二:關鍵字參數

    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)回到瀏覽器中,刷新,查看源文件如下圖:

    使用重定向傳遞關鍵字參數格式如下:

    return redirect(reverse('booktest:fan2', kwargs={'id':100,'age':18}))

    在模板文件中使用時,格式如下:
    {% 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模版(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。