補(bǔ)充1.img的src屬性:
1.圖片路徑
2.url
3.圖片的二進(jìn)制數(shù)據(jù)
補(bǔ)充2:字體樣式
我們計算機(jī)上之所以可以輸出各種各樣的字體樣式,其內(nèi)部其實對應(yīng)的是一個個以.ttf結(jié)尾的文件
由于img的src屬性里可以放圖片的二進(jìn)制數(shù)據(jù),因此我們可以在src里放上圖片的請求路徑,返回的是一個圖片的二進(jìn)制數(shù)據(jù)
# 該視圖函數(shù)返回的是圖片的二進(jìn)制數(shù)據(jù),圖片是本地已有的圖片路徑
def get_code(request):
with open ('static/img/default.png','rb') as f:
data = f.read()
return HttpResponse(data)
字體樣式網(wǎng)站
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比新華網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式新華網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋新華地區(qū)。費(fèi)用合理售后完善,十多年實體公司更值得信賴。
"""
圖片相關(guān)的模塊:
pip3 install pillow
導(dǎo)入:from PIL import Image,ImageDraw,ImageFont
Image:生成圖片
ImageDraw:能夠在圖片上亂涂亂畫
ImageFont:控制字體樣式
"""
from PIL import Image,ImageDraw,ImageFont
import random
def get_random():
return random.randint(0,255),random.randint(0,255),random.randint(0,255),
def get_code(request):
1.先產(chǎn)生一個圖片,new方法的第一個參數(shù)是固定模式RGB格式,第二個是圖片大小(寬,高),第三個是圖片顏色(可以放rgb模式的顏色)
# image_obj = Image.new('RGB',(350,35),'green') # 固定顏色
# image_obj = Image.new('RGB',(350,35),(23,43,53)) # 變形1
image_obj = Image.new('RGB', (350, 35), get_random()) # 變形2
2.將產(chǎn)生的圖片存起來,打開一個文件,該圖片有一個save方法可以存儲圖片,第一個參數(shù)是文件句柄,第二個是存儲圖片格式
with open('xxx.png','wb') as f:
image_obj.save(f,'png')
3.再將圖片以二進(jìn)制形式讀出來,返回給img標(biāo)簽的src屬性
with open('xxx.png','rb') as f:
data = f.read()
return HttpResponse(data)
上述方法:會進(jìn)行頻繁的文件存儲IO操作,效率比較低下,步驟4利用內(nèi)存管理器模塊優(yōu)化!
"""
導(dǎo)入內(nèi)存管理器模塊:from io import BytesIO,StringIO
BytesIO:功能臨時幫您存儲數(shù)據(jù),返回的數(shù)據(jù)是二進(jìn)制
StringIO:功能臨時幫您存儲數(shù)據(jù),返回的數(shù)據(jù)是字符串
"""
def get_code(request):
# 1.同樣先生成一個圖片對象
image_obj = Image.new('RGB', (350, 35), get_random())
# 2.這里再生成一個內(nèi)存管理器對象,就可以看成是f文件句柄
io_obj = BytesIO()
# 3.將圖片保存到文件管理器對象里
image_obj.save(io_obj,'png')
# 4.把圖片從文件管理器對象里取出來,用getvalue()方法
return HttpResponse(io_obj.getvalue())
def get_code(request):
# 1.同樣先生成一個圖片對象
image_obj = Image.new('RGB', (350, 35), get_random())
# 2.在圖片上生成一個畫筆對象
img_draw = ImageDraw.Draw(image_obj)
# 3.設(shè)置字體樣式,truetype()第一個參數(shù)是字體樣式路徑,第二個是字體大小
img_font = ImageFont.truetype('static/font/222.ttf',30)
# 4.隨機(jī)生成驗證碼,五位,大小寫字母、數(shù)字
code = ''
for i in range(5):
random_upper = chr(random.randint(65,90)) # 65-90的數(shù)字使用chr()函數(shù)對應(yīng)轉(zhuǎn)成大寫字母
random_lower = chr(random.randint(97,122)) # 97-122的數(shù)字使用chr()函數(shù)對應(yīng)轉(zhuǎn)成小寫字母
random_int = str(random.randint(0,9))
# 從上面三種隨機(jī)選擇一種
tmp = random.choice([random_int,random_lower,random_upper])
# 將產(chǎn)生的隨機(jī)字符串寫到圖片上
"""
text()方法的第一個參數(shù),字符串在圖片上的坐標(biāo),第二個是字符串,
第三個字符串的顏色,第四個字體樣式和大小
"""
img_draw.text((i*60,0),tmp,get_random(),img_font)
code += tmp
print(code)
# 5.將生成的隨機(jī)驗證碼保存起來,因為在登錄的視圖函數(shù)需要用到,進(jìn)行比對
request.session['code'] = code
# 6.再生成一個內(nèi)存管理器對象,就可以看成是f文件句柄
io_obj = BytesIO()
# 7.將圖片保存到文件管理器對象里
image_obj.save(io_obj,'png')
# 8.把圖片從文件管理器對象里取出來,用getvalue()方法
return HttpResponse(io_obj.getvalue())
如何讓用戶一點(diǎn)驗證碼圖片就刷新驗證碼