08-Django站点管理&Cache缓存

一、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  
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容