概述
内容发布: 负责添加、修改、删除内容
公告访问
配置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>
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()
常见的有两个实现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