• 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  #复数形式如何显示
  • 相关阅读:
    一道《编程之美》第一章的无解题引发的“血案”
    MapReduce实例2(自定义compare、partition)& shuffle机制
    MapReduce实例&YARN框架
    HDFS下载数据机制的底层分析
    在windows下的hdfs客户端编写
    C语言-第2次作业得分
    第2次作业得分-东师软工
    第1次作业得分-东师软工
    第3次作业-四则运算(结对作业)
    第2次作业-效能分析
  • 原文地址:https://www.cnblogs.com/lizeqian1994/p/10594006.html
Copyright © 2020-2023  润新知