Python的Django架構完成一個完整的論壇(4.項目所需的其他py檔案源碼),djangopy

來源:互聯網
上載者:User

Python的Django架構完成一個完整的論壇(4.項目所需的其他py檔案源碼),djangopy

這些檔案放在建立的一個utils檔案夾中:

自動產生驗證碼:

check_code.py:

"""製造驗證碼"""import randomfrom PIL import Image, ImageDraw, ImageFont, ImageFilter_letter_cases = "abcdefghjkmnpqrstuvwxy"  # 小寫字母,去除可能干擾的i,l,o,z_upper_cases = _letter_cases.upper()  # 大寫字母_numbers = ''.join(map(str, range(3, 10)))  # 數字init_chars = ''.join((_letter_cases, _upper_cases, _numbers))def create_validate_code(size=(120, 30),                         chars=init_chars,                         img_type="GIF",                         mode="RGB",                         bg_color=(255, 255, 255),                         fg_color=(0, 0, 255),                         font_size=18,                         font_type="Monaco.ttf",                         length=4,                         draw_lines=True,                         n_line=(1, 2),                         draw_points=True,                         point_chance=2):    """    @todo: 產生驗證碼圖片    @param size: 圖片的大小,格式(寬,高),預設為(120, 30)    @param chars: 允許的字元集合,格式字串    @param img_type: 圖片儲存的格式,預設為GIF,可選的為GIF,JPEG,TIFF,PNG    @param mode: 圖片模式,預設為RGB    @param bg_color: 背景顏色,預設為白色    @param fg_color: 前景色彩,驗證碼字元顏色,預設為藍色#0000FF    @param font_size: 驗證碼字型大小    @param font_type: 驗證碼字型,預設為 ae_AlArabiya.ttf    @param length: 驗證碼字元個數    @param draw_lines: 是否劃幹擾線    @param n_lines: 幹擾線的條數範圍,格式元組,預設為(1, 2),只有draw_lines為True時有效    @param draw_points: 是否畫幹擾點    @param point_chance: 幹擾點出現的機率,大小範圍[0, 100]    @return: [0]: PIL Image執行個體    @return: [1]: 驗證碼圖片中的字串    """    width, height = size  # 寬高    # 建立圖形    img = Image.new(mode, size, bg_color)    draw = ImageDraw.Draw(img)  # 建立畫筆    def get_chars():        """產生給定長度的字串,返回列表格式"""        return random.sample(chars, length)    def create_lines():        """繪製幹擾線"""        line_num = random.randint(*n_line)  # 幹擾線條數        for i in range(line_num):            # 起始點            begin = (random.randint(0, size[0]), random.randint(0, size[1]))            # 結束點            end = (random.randint(0, size[0]), random.randint(0, size[1]))            draw.line([begin, end], fill=(0, 0, 0))    def create_points():        """繪製幹擾點"""        chance = min(100, max(0, int(point_chance)))  # 大小限制在[0, 100]        for w in range(width):            for h in range(height):                tmp = random.randint(0, 100)                if tmp > 100 - chance:                    draw.point((w, h), fill=(0, 0, 0))    def create_strs():        """繪製驗證碼字元"""        c_chars = get_chars()        strs = ' %s ' % ' '.join(c_chars)  # 每個字元前後以空格隔開        font = ImageFont.truetype(font_type, font_size)        font_width, font_height = font.getsize(strs)        draw.text(((width - font_width) / 3, (height - font_height) / 3),                  strs, font=font, fill=fg_color)        return ''.join(c_chars)    if draw_lines:        create_lines()    if draw_points:        create_points()    strs = create_strs()    # 圖形扭曲參數    params = [1 - float(random.randint(1, 2)) / 100,              0,              0,              0,              1 - float(random.randint(1, 10)) / 100,              float(random.randint(1, 2)) / 500,              0.001,              float(random.randint(1, 2)) / 500              ]    img = img.transform(size, Image.PERSPECTIVE, params)  # 建立扭曲    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)  # 濾鏡,邊界加強(閾值更大)    return img, strs

 

 

網頁分頁功能的pagination.py檔案:

from django.utils.safestring import mark_safeclass Pagination(object):    """    分頁    """    def __init__(self, current_page, data_count, per_page_count=10, pager_num=7):        try:            self.current_page = int(current_page)        except Exception as e:            self.current_page = 1        self.data_count = data_count        self.per_page_count = per_page_count        self.pager_num = pager_num    @property    def start(self):        return (self.current_page - 1) * self.per_page_count    @property    def end(self):        return self.current_page * self.per_page_count    @property    def total_count(self):        v, y = divmod(self.data_count, self.per_page_count)        if y:            v += 1        return v    def page_str(self, base_url):        page_list = []        if self.total_count < self.pager_num:            start_index = 1            end_index = self.total_count + 1        else:            if self.current_page <= (self.pager_num + 1) / 2:                start_index = 1                end_index = self.pager_num + 1            else:                start_index = self.current_page - (self.pager_num - 1) / 2                end_index = self.current_page + (self.pager_num + 1) / 2                if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:                    end_index = self.total_count + 1                    start_index = self.total_count - self.pager_num + 1        if self.current_page == 1:            prev = '<li><a class="page" href="javascript:void(0);">上一頁</a></li>'        else:            prev = '<li><a class="page" href="%s?p=%s">上一頁</a></li>' % (base_url, self.current_page - 1,)        page_list.append(prev)        for i in range(int(start_index), int(end_index)):            if i == self.current_page:                temp = '<li class="active"><a class="page active" href="%s?p=%s">%s</a></li>' % (base_url, i, i)            else:                temp = '<li><a class="page" href="%s?p=%s">%s</a></li>' % (base_url, i, i)            page_list.append(temp)        if self.current_page == self.total_count:            nex = '<li><a class="page" href="javascript:void(0);">下一頁</a></li>'        else:            nex = '<li><a class="page" href="%s?p=%s">下一頁</a></li>' % (base_url, self.current_page + 1,)        page_list.append(nex)        page_str = mark_safe("".join(page_list))        return page_str

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.