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分钟)。您可以设置TIMEOUT
为None
默认情况下缓存键永不过期。值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-redis、django-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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。