media静态文件统一管理 操作内存的流

一、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}),
'''

二、操作内存的流 - StringIO | BytesIO

from io import StringIO, BytesIO
# 创建操作字符串的内存流
sf = StringIO()
# 往内存中写
sf.write('hello')
# 在内存中取
sf.getvalue()

# 创建操作二进制的内存流
bf = BytesIO()
# 往内存中写
bf.write('hello'.encode('utf-8'))
# 在内存总取
bf.getvalue()

三、PIL:python图片操作库

# 1、生成图片(画板)
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')

# 2、产生文字颜色字体(选择指定ttf并设置字体)
from PIL import ImageFont
# 产生某种ttf格式的30px大小文字
img_font = ImageFont.truetype('*.ttf', 30)

# 3、画图,画笔(画点,线,字,圆)
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自动化数据管理界面

admin的概念

# Admin是Django自带的一个功能强大的自动化数据管理界面
# 被授权的用户(超级用户)可以直接在Admin中操作数据库
# Django提供了许多针对Admin的定制功能

配置并访问自动化数据管理界面

# 终端项目目录创建一个超级用户: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)

格式化界面字段显示名与表名

# 为应用下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  #复数形式如何显示
原文地址:https://www.cnblogs.com/lizeqian1994/p/10594006.html