美文网首页
08-Django站点管理&Cache缓存

08-Django站点管理&Cache缓存

作者: 王梓懿_1fbc | 来源:发表于2018-10-21 12:34 被阅读13次

    一、Admin站点管理(后台可视化界面操作)

    • 概述

      内容发布: 负责添加、修改、删除内容
      公告访问
      
      
    • 配置Admin应用

      在`settings.py`文件中的IINSTALLED_APPS中添  加'django.contrib.admin' (默认是已经是添加好的)  
      
      
    • 创建管理员用户

      $ python3 manage.py createsuperuser
      
      
    • 访问站点管理

      语法: ip:端口号/admin
      例如: 192.168.0.13:8000/admin
      
      
    • 站点管理的汉化版

      在settings.py中替换以下内容即可
        LANGUAGE_CODE = 'en-us' 替换 LANGUAGE_CODE = 'zh-Hans'
        TIME_ZONE = 'UTC' 替换 TIME_ZONE = 'Asia/Shanghai'
      
      
    • 管理数据表(后台界面中)

      修改admin.py文件:
        # 引入
        from .models import Grades,Students
        # 注册
        admin.site.register(Grades)
        admin.site.register(Students)
      
      
    • 自定义管理数据页面(因为原本页面显示不够友好)

      # 自定义管理数据页面
      # 该类需要注册时添加进去
      class GradesAmin(admin.ModelAdmin):
        # 列表页的属性
        # 显示字段(需要显示什么字段,就写上什么字段即可)
        list_display = ['pk','gname','gdate','gboynum','ggirlnum','isdel']
        # 过滤器(过滤字段)
        list_filter = ['gname']
        # 搜索字段
        search_fields = ['pk']
        # 分页(多少条为一页)
        list_per_page = 5
      
        # 添加、修改页属性
        # 属性的先后顺序
        fields = ['gboynum','gname','gdate','ggirlnum','isdel']
        # 给属性分组(fields和fieldsets不能同时使用)
        fieldsets = [
                    ('num',{'fields':['gboynum','ggirlnum']}),
                    ('base',{'fields':['gname','gdate','isdel']}),
        ]
      
      # 注册(以后其实不会在这里完成注册,会通过装饰器完成注册!)
      admin.site.register(Grades,GradesAmin)
      
      
    • 自定义管理页面(关联对象)

      需求: 在创建班级时,可以直接添加几个学生
      # TabularInline 或 StackedInline 两种显示方式
      class StudentsInfo(admin.TabularInline):
        # 要创建学生
        model = Students
        # 需要创建几个
        extra = 1
      
      # 与Grades关联上
      class GradesAmin(admin.ModelAdmin):
        # 与上面关联上
        inlines = [StudentsInfo]
      
      
    • 自定义管理页面(执行动作的位置)

      # 将动作位置放置底部
      class StudentsAdmin(admin.ModelAdmin):
        # 执行动作的位置
        actions_on_bottom = True
        actions_on_top = False
      
      

    二、富文本

    • 富文本格式

    富文本格式(Rich Text Format, 一般简称为RTF)是一种跨平台文档格式,由微软公司开发。大多数的文字处理软件都能读取和保存RTF文档。
    富文本格式是一种类似DOC格式(Word文档)的文件,有很好的兼容性,使用Windows系统里面的“写字板”就能打开并进行编辑。

    • 在站点中使用富文本
    - 安装
        pip install django-tinymce
    
    - 配置settings.py文件
        INSTALLED_APPS = [
        ...
        'tinymce',
        ]
    
    - 在setting.py文件添加
        # 富文本
        TINYMCE_DEFAULT_CONFIG = {
            'theme':'advanced',
            'width':600,
            'height':400,
        }
    
    - 创建一个模型类
        from tinymce.models import HTMLField
        class Text(models.Model):
            str = HTMLField()
    
    - 配置站点admin.py
        from .models import Text
        admin.site.register(Text)
    
    

    创建站点管理员用户: python manage.py createsuperuser

    • 自定义视图中使用
    # 添加文章
    def artical(request):
        if request.method == 'POST':
            text = Text()
            text.str = request.POST.get('str')
            text.save()
            return HttpResponse('文章提交成功')
        elif request.method == 'GET':
            return render(request, 'addartical.html')
    
    # 文章获取
    def getartical(request):
        articals = Text.objects.all()
        artical = articals.last()
    
        return HttpResponse(artical.str)
    
    
    {% load static %}
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>富文本编辑</title>
        <!--虽然实际文件没有,但会自动放入-->
        <script type="text/javascript" src="{% static 'tiny_mce/tiny_mce.js' %}"></script>
        <script>
            tinyMCE.init({
                'mode': 'textareas',
                'theme': 'advanced',
                'width': 1000,
                'height': 500,
            })
        </script>
    </head>
    <body>
        <form action="{% url 'app:test01' %}" method="post">
            <textarea name="str"></textarea> <br>
            <input type="submit" name="提交">
        </form>
    </body>
    </html>
    
    

    三、MarkDown语法的支持

    • 安装
    pip install django-markdown-deux
    
    
    • 添加应用
    # settings.py文件中
    INSTALLED_APPS = [
        ...
        'markdown_deux',
        ...
    ]
    
    
    • 使用
    模版头部载入模块{% load markdown_deux_tags %}
    内容调用部分加入过滤器markdown
    
    
    • 例如
    # models.py文件    文章 模型类
    class Book(models.Model):
        title = models.CharField(max_length=180,default='')
        content = models.TextField(default='')  
        def __str__(self):
            return self.title
    
    # admin.py文件 【管理数据表(后台界面中)】
    admin.site.register(Book)
    
    # urls.py文件   添加路由
    url('^markdownx/$', views.markdownx, name='markdownx'),
    
    # views.py文件  添加视图函数
    def markdownx(request):
        book = Book.objects.last()
        return render(request, 'markdownx.html', context={'book':book})
    
    # markdownx.html文件  模板 
    {% load markdown_deux_tags %}
    {% block content %}
        <h1> {{ book.title }} </h1>
        <div class="main_body">
            {{ book.content|markdown }}
        </div>
    {% endblock %}
    
    

    后台中操作Book模型类(添加数据markdowm语法),前端页面(展示数据)

    四、缓存框架

    Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样内容可以随时变化,也就说请求到达视图函数之后,然后进行模板渲染,将字符串返回给用户,用户会看到相应的html页面。但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多。
    但是如果每次请求都从数据库中请求并获取数据,并且当用户并发量十分大的时候,这将服务器性能将大大受到影响。
    因此使用缓存能有效的解决这类问题。如果能将渲染后的结果放到速度更快的缓存中,每次有请求过来,先检查缓存中是否有对应的资源,如果有,直接从缓存中取出来返回响应,节省取数据和渲染的时间,不仅能大大提高系统性能,还能提高用户体验。

    • 缓存的适合场景
      对页面实时性要求不高的页面。对于大多数的购物网站,短期内商品的描述是没有变化的,可以使用缓存。

    • 缓存优先级
      由django的生命周期知各级缓存的优先级:中间件应用的全局缓存->视图函数缓存->模板渲染下的局部视图使用缓存。

    • 设置缓存
      缓存系统需要少量的配置才能使用,你必须告诉系统你的缓存数据存放在哪里-数据库还是文件系统亦或是直接存在缓存中-这是一个重要的决定,直接影响到你的缓存性能。

    • 本地内存缓存
      每个进程都有它们自己的私有缓存实例,所以跨进陈缓存是不可能的,因此,本地内存缓存不是特别有效率的,建议你只是在内部开发测时使用,不建议在生产环境中使用。

      CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
            # 如果你只有一个本地内存缓存,你可以忽略这个设置;
            # 如果你有多个的时候,你需要至少给他们中一个赋予名字以区分他们;
            'LOCATION': 'unique-snowflake'
        }
      }
      
      
    • 基于Memcached缓存
      Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载从而显著提供网站性能,也是django中到目前为止最有效率的可用缓存。
      Memcached作为一个后台进程运行,并分配一个指定的内存量,它所做的全是提供一个添加,检索和删除缓存中任意数据的快速接口,所有的数据都是直接存储在内存中,所以就没有数据库或者文件系统使用的额外开销了。

      CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            # 给LOCATION设置IP:PORT,其中ip是Memcached进程的IP地址,port是Memcached运行的端口
            'LOCATION': [
                '10.1368.96.101:13111',
                '10.1368.96.102:13112',
                '10.1368.96.103:13113',
            ]
        }
      }
      
      
    • 使用数据库进行缓存
      使用数据库缓存,首先你需要在数据库中建立一个用于缓存的数据库表,可以参考下面的命令,注意cache_table_name不要和数据库中已经存在的表名冲突: python manage.py createcachetable [cache_table_name]

      CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            # 使用缓存数据对应的表单
            'LOCATION': 'my_cache_table',
        }
      
      
    • 使用文件系统进行缓存

      CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
            # 缓存所在的位置
            # 必须保证对你列出的路径具有读写权限
            'LOCATION': '/var/tmp/django_cache',
        }
      }
      
      

    五、缓存参数

    通过配置缓存参数来控制缓存的性能

    • TIMEOUT: 用于缓存的默认超时(以秒为单位)。
      此参数默认为300秒(5分钟)。您可以设置TIMEOUTNone默认情况下缓存键永不过期。值0使得键立即过期(实际上“不缓存”)。

    • OPTIONS: 应传递给缓存的选项,以下对应的是使用本地缓存、数据库缓存以及文件缓存的参数选项。

      - MAX_ENTRIES: 删除旧值之前缓存中允许的最大条数。此参数默认为300。
      - CULL_FREQUENCY: MAX_ENTRIES达到最大值时,需要删除的一部分。实际比率是为在达到最大值时删除一半数量。
      
      
    • KEY_PREFIX: 一个字符串,将自动包含(默认情况下预先添加)到Django服务器使用的所有缓存键中。

    • VERSION: Django服务器生成的缓存键的默认版本号。

    • KEY_FUNCTION: 包含函数的虚线路径的字符串,用于定义如何将前缀,版本和密钥组合为最终缓存键。

    • 例如使用数据库缓存的参数设置

      CACHES = {
       'default': {
           'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
           'LOCATION': 'my_cache_table',
           'TIMEOUT': '60',
           'OPTIONS': {
               'MAX_ENTRIES': '300',
           },
           'KEY_PREFIX': 'zyz',
           'VERSION': '1',
       }
      }
      
      
    • 例如基于Memcached存储的参数设置

      CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': '127.0.0.1:11211',
            'OPTIONS': {
                'server_max_value_length': 1024 * 1024 * 2,
            }
        }
      }
      
      

    六、原生实现缓存

    • 视图函数的缓存(使用最多的场景)

      from django.views.decorators.cache import cache_page
      
      # time 秒 60*5 缓存五分钟
      # cache 缓存配置, 默认default  [可选]
      # key_prefix 前置字符串 [可选]
      @cache_page(60 * 15, cache="special_cache", key_prefix="zyz")
      def my_view(request):
        ...
      
      
    • 底层的缓存API
      有时候你不想缓存一个页面,甚至不想某个页面的一部分,只是想缓存某个数据库检索的结果,django提供了底层次的API,你可以是用这些API来缓存任何粒度的数据。

      # 导包
      from django.core.cache import cache
      
      # 获取cache
      value = get(key)
      # 设置默认值,如果缓存中不存在该对象,则指定返回哪个值
      value =cache.get(key, default)
      
      # 设置cache
      # timeout可选参数,默认是系统配置,None永久,0不缓存
      set(key, value, timeout)
      
      # 要获取键值或者如果键不在缓存中,则设置值,则有get_or_set()方法
      cache.get_or_set(key, value, timeout)
      cache.get_or_set('my_new_key', 'my new value', 100)
      
      # 删除key
      cache.delete(key)
      
      # 删除缓存中的所有key
      cache.clear()
      
      

    八、Redis实现缓存

    • 常见的有两个实现
      django-redisdjango-redis-cache

    • 安装django-redis

      pip install django-redis
      
      
    • 配置和内置的缓存配置基本一致

      CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            # 配置redis的位置
            # 配置主机地址、端口号、数据库
            "LOCATION": "redis://127.0.0.1:6379/1",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        }
      }
      
      
    • 用法和内置缓存使用一样

      # 检查
      # django中设置
      cache.set('name', 'atom', 100)
      
      # redis-cli
      > keys *  
      > get name  
      
      

    作者:西门奄
    链接:https://www.jianshu.com/u/77035eb804c3
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    相关文章

      网友评论

          本文标题:08-Django站点管理&Cache缓存

          本文链接:https://www.haomeiwen.com/subject/bykbzftx.html