中间件:是一个轻量级的,底层的插件,可以介入Django的请求和响应过程(面向切面编程);中间件的本质就是一个python类。
面向切面编程(Aspect Oriented Programming)简称AOP。AOP的主要实现目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合的隔离效果。
中间件可实现功能:
__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.在工程目录下创建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.文件名.类名
在用户登录,注册以及一些敏感操作的时候,我们为了防止服务器被暴力请求,或爬虫爬取,我们可以使用验证码进行过滤,减轻服务器的压力。
验证码需要使用绘图 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')
富文本:Rich Text Format(RTF),是由微软开发的跨平台文档格式,大多数的文字处理软件都能读取和保存RTF文档,其实就是可以添加样式的文档,和HTML有很多相似的地方。
tinymce 插件 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.在视图中使用:
使用文本域盛放内容
在head中添加script
https://docs.djangoproject.com/zh-hans/2.0/topics/cache/
创建缓存表
python manage.py createcachetable [table_name]
缓存配置
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
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)