zoukankan      html  css  js  c++  java
  • Django (八) 中间件&验证码&富文本&缓存

     中间件&验证码&富文本&缓存

    1. 中间件&AOP

     
    中间件:是一个轻量级的,底层的插件,可以介入Django的请求和响应过程(面向切面编程)
    中间件的本质就是一个python
    面向切面编程(Aspect Oriented Programming)简称AOPAOP的主要实现目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合的隔离效果。
    中间件可实现功能
       - 统计
       - 黑名单
       - 白名单
       - 反爬
       - 界面友好化(捕获异常)
     

    1.1 中间件的可切入点

    1.2 切入函数

    __init__:
        没有参数,服务器响应第一个请求的时候自动调用,用户确定是否启用该中间件
    process_request(self,request):
        在执行视图前被调用,每个请求上都会调用,不主动进行返回或返回HttpResponse对象
    process_view(self,request,view_func,view_args,view_kwargs)
        调用视图之前执行,每个请求都会调用,不主动进行返回或返回HttpResponse对象
    process_template_response(self,request,response):
        在视图刚好执行完后进行调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象
    process_response(self,request,response):
        所有响应返回浏览器之前调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象
    process_exception(self,request,exception):
        当视图抛出异常时调用,不主动进行返回或返回HttpResponse对象
     

    1.3 自定义中间件

    自定义中间件流程
        1.在工程目录下创建middleware目录
        2.目录中创建一个python文件
        3.python文件中导入中间件的基类
            from django.utils.deprecation import MiddlewareMixin
        4.在类中根据功能需求,创建切入需求类,重写切入点方法
            class LearnAOP(MiddlewareMixin):
                def process_request(self,request):
                    print('request的路径',request.GET.path)
        5.启用中间件,在settings中进行配置,MIDDLEWARE中添加middleware.文件名.类名
       
     

    2.验证码

    在用户登录,注册以及一些敏感操作的时候,我们为了防止服务器被暴力请求,或爬虫爬取,我们可以使用验证码进行过滤,减轻服务器的压力。
    验证码需要使用绘图 Pillow
        pip install Pillow
    核心
        Image,ImageDraw,ImageFont
    绘制流程
            backgroundcolor = (10,20,30)   RGB颜色
        初始化画布 
            image = Image.new('RGB',(100,50),backgroundcolor)
        获取画布中画笔对象
            draw = ImageDraw.Draw(image)
        绘制验证码,随机四个
            font = ImageFont.truetype('path',size)
            fontcolor = (20,40,60)
            draw.text((x,y),'R',font,fontcolor)
        最后扫尾
            del draw 
    
    
            import io
            buf = io.BytesIO()
            Image.save(buf, 'png')
            return HttpResponse(buf.getvalue(),'image/png')
     

    3.富文本

    富文本:Rich Text FormatRTF),是由微软开发的跨平台文档格式,大多数的文字处理软件都能读取和保存RTF文档,其实就是可以添加样式的文档,和HTML有很多相似的地方
    tinymce 插件
    django的插件
        pip install django-tinymce
    用处大约有两种
        1. 在后台管理中使用
        2. 在页面中使用,通常用来作博客
    1.后台中使用:
        配置settings.py文件
            INSTALLED_APPS 添加  tinymce 应用
            添加默认配置
                TINYMCE_DEFAULT_CONFIG = {
                    'theme':'advanced',
                    'width':600,
                    'height':400,
                }
        创建模型类
            from tinymce.models import HTMLField
            class Blog(models.Model):
                sBlog = HTMLField()
        配置站点
            admin.site.register
            
    2.在视图中使用:
        使用文本域盛放内容
        <form>
            <textarea></textarea>
        </form>
    
    
        head中添加script
        <script src='/static/tiny_mce/tiny_mce.js'></script>
        <script>
            tinyMCE.init({
                'mode':'textareas', 'theme':'advanced',
                'width':800,'height':600,
            })
        </script>
        

    4. Cache

    https://docs.djangoproject.com/zh-hans/2.0/topics/cache/

    缓存框架的核心目标

    • 较少的代码

      • 缓存应该尽可能快

      • 因此围绕缓存后端的所有框架代码应该保持在绝对最小值,特别是对于获取操作

    • 一致性

      • 缓存API应该是提供跨越不同缓存后端的一致接口

    • 可扩展性

      • 基于开发人员的需求,缓存API应该可以在应用程序级别扩展

    缓存

    • django内置了缓存框架,并提供了几种常用的缓存

      • 基于Memcached缓存

      • 使用数据库进行缓存

      • 使用文件系统进行缓存

      • 使用本地内存进行缓存

      • 提供缓存扩展接口

    缓存配置

    1. 创建缓存表

      python manage.py createcachetable [table_name]
       
    2. 缓存配置

      CACHES = {
          'default': {
              'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
              'LOCATION': 'my_cache_table',
              'TIMEOUT': '60',
              'OPTIONS': {
                  'MAX_ENTRIES': '300',
              },
              'KEY_PREFIX': 'jack',
              'VERSION': '1',
          }
      }
       

    缓存使用

    • 在视图中使用(使用最多的场景)

    • @cache_page()

      • time 秒 60*5 缓存五分钟

      • cache 缓存配置, 默认default,

      • key_prefix 前置字符串

    缓存底层

    获取cache

    from django.core.cache import cache
    cache = cache['cache_name'] cache = cache.get('cache_name')
     

    设置cache

    from django.core.cache import cache
    cache.set(key, value, timeout)
     

    使用原生缓存来实现

    def get_user_list(request):
        # 每次从缓存中获取
        user_cache = cache.get('user_cache')
        # 如果有缓存,则从缓存中直接取
        if user_cache:
            result = user_cache
        # 如果没有缓存,则从数据库中获取
        else:
            # 模拟长时间的数据操作
            user_list = User.objects.all()
            time.sleep(5)
    
    
            data = {
                'users': user_list,
            }
    
    
            # 使用模板渲染,得到result文本
            template = loader.get_template('App/stu_list.html')
            result = template.render(data)
                    
            # 设置缓存
            cache.set('user_cache', result, 10)
        return HttpResponse(result)
     
  • 相关阅读:
    RTX这种东西究竟有什么价值?
    为什么必须要有需求文档这种东西?
    如何理解环境光?
    文字校对应该怎么校对?
    绑定解绑钝化活化监听器
    ServletRequestLister
    HttpSessionListener
    ServletContextListener知识点
    案例8-站内搜索功能
    案例7-用户名异步校验
  • 原文地址:https://www.cnblogs.com/gugubeng/p/9723446.html
Copyright © 2011-2022 走看看