media靜態文件統一管理 操做內存的流 - StringIO | BytesIO PIL:python圖片操做庫 前端解析二進制流圖片(瞭解) Admin自動化數據管理界面

1、media

'''
1. 將用戶上傳的全部靜態文件統一管理
    -- settings.py
        -- MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
2. 服務器會對外公開一下服務器靜態資源
3. 對外公開的方式(配置url接口),在接口中返回指定的靜態資源(如何批量操做)
    -- from django.views.static import serve
    -- url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}),
'''

2、操做內存的流 - StringIO | BytesIO

from io import StringIO, BytesIO
# 建立操做字符串的內存流
sf = StringIO()
# 往內存中寫
sf.write('hello')
# 在內存中取
sf.getvalue()

# 建立操做二進制的內存流
bf = BytesIO()
# 往內存中寫
bf.write('hello'.encode('utf-8'))
# 在內存總取
bf.getvalue()

3、PIL:python圖片操做庫

# 一、生成圖片(畫板)
from PIL import Image
# 生成一個Image類對象(準圖片):模式、尺寸、顏色
img = Image.new('RGB', (80, 80), color=(255, 0, 0))  # Type: Image
# 將Image類對象採用具體格式放入具體的文件流中
bf = BytesIO()  # eg: 內存字節流
img.save(bf, 'png')

# 二、產生文字顏色字體(選擇指定ttf並設置字體)
from PIL import ImageFont
# 產生某種ttf格式的30px大小文字
img_font = ImageFont.truetype('*.ttf', 30)

# 三、畫圖,畫筆(畫點,線,字,圓)
from PIL import ImageDraw
# 在具體的Image對象上畫圖
img_draw = ImageDraw.Draw(img)
# 畫文字:xy軸、文本、顏色、ImageFont字體
img_draw.text((x, y), 'abc', 'red', img_font)
'''
# 建立畫板,保存在服務器本地
def save_local():
    img = Image.new('RGB', (230, 32), (40, 20, 10))  # type: Image
    # 本地寫流
    wf = open('code.png', 'wb')
    # 將數據以指定格式丟給文件操做流
    img.save(wf, 'png')

    with open('code.png', 'rb') as f:
        data = f.read()
    return data

#建立畫板保存到內存的流
img = Image.new('RGB', (230, 32), (40, 20, 10))  # type: Image
bf = BytesIO()
img.save(bf, 'png')
# 在內存中取
sf.getvalue()
'''
'''
#建立六位隨機驗證碼

from PIL import Image,ImageFont,ImageDraw
from io import BytesIO
import random

#隨機RGB元組
def random_RGB(min,max):
    return tuple([random.randint(min,max) for i in range(3)])

#隨機產證六位驗證碼
def random_six_code():
    code = ''
    #每一位都可覺得字母大小寫或數字
    for i in range(6):
        tag = random.randint(1,3) #1.大寫 2:小寫 3:數字
        if tag == 1:
            #轉換爲字符 ASCII表
            code += chr(random.randint(65,90))
        elif tag == 2:
            code += chr(random.randint(97,122))
        else:
            #轉換爲字符串
            code += str(random.randint(0,9))
    return code

#獲取驗證碼
def login_code(request):
    #建立畫板
    img = Image.new('RGB',(230,32),random_RGB(150,255))


    #設置ImageFont字體
    img_font = ImageFont.truetype('static/font/kumo.ttf',size=30)

    #在畫板中畫字
    img_draw = ImageDraw.Draw(img)

    #獲取六位驗證碼
    img_code = random_six_code()
    
    #將img_code存儲到session中,與會話綁定用來完成驗證碼的驗證
    request.session['img_code'] = img_code

    #畫文字:xy軸、文本、顏色、ImageFont字體
    for i,ch in enumerate(img_code):
        img_draw.text((30+i*30,0),ch,random_RGB(0,150),img_font)

    bf = BytesIO()
    img.save(bf,'png')
    data = bf.getvalue()
    return HttpResponse(data)
'''

前端解析二進制流圖片(瞭解)

// 向指定url請求圖片二進制流轉換爲blob:格式的src
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);  // url
xhr.responseType = "blob";
xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
        if (xhr.status == 200) {
            var blod = this.response;
            var src = URL.createObjectURL(blod);  // src
        }
    }
};
xhr.send();
//完成前端點擊驗證碼進行切換    
$('#code').click(function () {
    url = '/login_code/'; //提供一個鏈接
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);  // url
    xhr.responseType = "blob";
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                var blod = this.response;
                var src = URL.createObjectURL(blod);  // src
                $('#code').attr('src',src)  //拿到其結果
            }
        }
    };
    xhr.send();
})

4、Admin自動化數據管理界面

admin的概念前端

# Admin是Django自帶的一個功能強大的自動化數據管理界面
# 被受權的用戶(超級用戶)能夠直接在Admin中操做數據庫
# Django提供了許多針對Admin的定製功能

配置並訪問自動化數據管理界面python

# 終端項目目錄建立一個超級用戶:python3 manage.py createsuperuser
# eg:Username:root | Email:root@root.com | Password:1234qwer
# 瀏覽器Admin入口:http://127.0.0.1:8000/admin
# 設置Admin界面爲中文環境:項目下settings.py,LANGUAGE_CODE = 'zh-Hans'
# 簡體:zh-hans | 繁體:zh-hant | 美式英語:en-us

將指定映射添加到自動化數據管理界面數據庫

# 應用下的admin.py中,註冊映射對應關係的類
from . import models
admin.site.register(models.Article)

# 應用下的admin.py中,註冊映射對應關係的表
from django.contrib import admin
from blog.models import *

admin.site.register(User)
admin.site.register(Blog)
admin.site.register(Article)
admin.site.register(Category)
admin.site.register(Tag)
admin.site.register(UpOrDown)
admin.site.register(Comment)

格式化界面字段顯示名與表名django

# 爲應用下models.py映射關係類重寫__str__方法
class Article(models.Model):
    title = models.CharField(max_length=32, default='Title', verbose_name="標題")
    #blank是admin界面該字段能夠爲空,null是數據庫該字段能夠爲空
    content = models.TextField(null=True, verbose_name="內容", blank=True)
    # 重寫__str__方法,格式化該類實例對象的表示方式
    def __str__(self):
        return self.title
    class Meta:
        verbose_name = "文章"  #單數形式如何顯示
        verbose_name_plural = verbose_name  #複數形式如何顯示
相關文章
相關標籤/搜索