''' 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}), '''
from io import StringIO, BytesIO # 建立操做字符串的內存流 sf = StringIO() # 往內存中寫 sf.write('hello') # 在內存中取 sf.getvalue() # 建立操做二進制的內存流 bf = BytesIO() # 往內存中寫 bf.write('hello'.encode('utf-8')) # 在內存總取 bf.getvalue()
# 一、生成圖片(畫板) 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(); })
前端
# 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 #複數形式如何顯示