1. 程式人生 > >WEB——驗證碼生成、IO儲存、二進位制傳輸

WEB——驗證碼生成、IO儲存、二進位制傳輸

執行下段程式,瀏覽器訪問127.0.0.1:8000
即可在頁面展現驗證碼
程式碼包含了驗證碼的生成 io儲存 二進位制資料傳輸等知識點

# coding=utf-8
# wsgi_server.py
import random
import string
import base64
from io import BytesIO
from PIL import Image, ImageDraw, ImageFont
from wsgiref.simple_server import make_server


class Captcha(object):
    def __init__
(self, number=4, size_x=150, size_y=40, fontsize=35, line_num=2): self.number = number # 生成幾位數的驗證碼 self.size = (size_x, size_y) # 驗證碼圖片的寬度和高度 self.fontsize = fontsize # 驗證碼字型大小 self.line_number = line_num # 加入干擾線的條數 self.SOURCE = list(string.ascii_letters + "123456789"
) # 構建一個驗證碼源文字,包括大小寫數字 ###################################生成干擾元素###################################### def __gene_line(self, draw, width, height): # 開始點 X,Y begin = (random.randint(0, width), random.randint(0, height)) # 結束點 end = (random.randint(0, width), random.
randint(0, height)) # 畫線條,開始 結束點 線條顏色 線條寬度 draw.line([begin, end], fill=self.__gene_random_color(), width=2) def __gene_points(self, draw, point_chance, width, height): # 大小限制 chance = min(50, max(0, int(point_chance))) for w in range(width): for h in range(height): tmp = random.randint(0, 100) if tmp > 100 - chance: draw.point((w, h), fill=self.__gene_random_color()) ######################################################################### ############################# 生成隨機的顏色 ############################### # 起始顏色 最終顏色 def __gene_random_color(cls, start=0, end=255): # 初始化隨機數 random.seed() # 按範圍生成隨機輸R G B return (random.randint(start, end), random.randint(start, end), random.randint(start, end)) # 隨機選擇一個字型 def __gene_random_font(cls): fonts = [ # 字型檔案路徑 '/usr/share/fonts/truetype/TTF/SourceCodePro-It.ttf', ] # 隨機選一個 字型 font = random.choice(fonts) return font # 用來隨機生成一個字串(包括英文和數字) def gene_text(self): # cls.SOURCE生成list A-Z a-z 0-9 number是生成驗證碼的位數 return ''.join(random.sample(self.SOURCE, self.number)) # 生成驗證碼 def gene_graph_captcha(self): # 驗證碼圖片的寬和高 width, height = self.size # 建立圖片 # R:Red(紅色)0-255 G:G(綠色)0-255 B:B(藍色)0-255 A:Alpha(透明度),添加了A,則就只能生成png圖片 image = Image.new('RGB', (width, height), self.__gene_random_color(0, 100)) # 驗證碼的字型 隨機產生字型 字型大小 font = ImageFont.truetype(self.__gene_random_font(), self.fontsize) # 建立畫筆 draw = ImageDraw.Draw(image) # 隨機生成4為字串 text = self.gene_text() # 獲取字型的尺寸 font_width, font_height = font.getsize(text) # 填充字串 x y座標 文字 字型 字型顏色 draw.text(((width - font_width) / 2, (height - font_height) / 2), text, font=font, fill=self.__gene_random_color(150, 255)) # 繪製干擾線 繪製多少條幹擾線 for x in range(0, self.line_number): self.__gene_line(draw, width, height) # 繪製噪點 self.__gene_points(draw, 10, width, height) return text, image # 開啟圖片驗證碼 def auth_code(): # 獲取驗證碼圖片,和驗證碼值 captcha=Captcha() code, img=captcha.gene_graph_captcha() #若要儲存圖片檔案 此處 img.save(path) buf = BytesIO() # 構建一個輸入輸出流 img.save(buf, "jpeg") # 將圖片儲存到輸入輸出流,也就是記憶體中 bur_str = buf.getvalue() # 獲得輸入輸出流裡面的內容 # Base64是一種任意二進位制到文字字串的編碼方法,常用於在URL、Cookie、網頁中傳輸少量二進位制資料。 data = str(base64.b64encode(bur_str)) return data ##################################為方便演示寫一個簡單的web程式########################## def application(env, start_response): start_response('200 ok', [('Content-Type', 'text/html')]) data = auth_code() res = "<img src= \"data:image/jpg;base64,%s\" >" % data print res return res httpd = make_server('', 8000, application) print "Serving is running..." httpd.serve_forever()