CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
'OPTIONS': {
'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
},
}
}
全站应用: 粒度最大
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
# 其他中间件...
'django.middleware.cache.FetchFromCacheMiddleware',
]
a. 引入TemplateTag
{% load cache %}
b. 使用缓存
{% cache 5000 缓存key %}, key随便取值
缓存内容
{% endcache %}
from datetime import datetime, date
import json
data = [
{"pk": 1, "name": "leon", "age": 18, 'birth': datetime.now()},
{"pk": 2, "name": "belmont", "age": 16, 'birth': datetime.now()},
{"pk": 3, "name": "friend", "age": 8, 'birth': datetime.now()},
{"pk": 4, "name": "qqq", "age": 5, 'birth': datetime.now()},
{"pk": 5, "name": "www", "age": 5, 'birth': datetime.now()}
]
class JsonCustomEncoder(json.JSONEncoder):
def default(self, field):
if isinstance(field, datetime):
return field.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(field, date):
return field.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self, field)
print(json.dumps(data, cls=JsonCustomEncoder))
问题:
数据库增加一条数据的时候,记录一条日志
内置信号
Model signals
pre_init # django的model执行其构造方法前,自动触发
post_init # django的modal执行其构造方法后,自动触发
pre_save # django的modal对象保存前,自动触发
post_save # django的modal对象保存后,自动触发
pre_delete # django的modal对象删除前,自动触发
post_delete # django的modal对象删除后,自动触发
m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals
pre_migrate # 执行migrate命令前,自动触发
post_migrate # 执行migrate命令后,自动触发
Request/response signals
request_started # 请求到来前,自动触发
request_finished # 请求结束后,自动触发
got_request_exception # 请求异常后,自动触发
Test signals
setting_changed # 使用test测试修改配置文件时,自动触发
template_rendered # 使用test测试渲染模板时,自动触发
Database Wrappers
connection_created # 创建数据库连接时,自动触发
1. [{} ]:尽量在查询的时候做 values 分组
all_users = models.User.objects.all().values('name','age','role__name')
2. [ 对象 ]:用的时候注意,只拿自己表中的字段,别跨表
all_users = models.User.objects.all()
3. select_related (外键、一对一)
all_users = models.User.objects.all().select_related('role')
4. prefetch_related (role)
all_users = models.User.objects.all().prefetch_related('role')
5. only 用的时候注意,只拿自己指定的字段
all_users = models.User.objects.all().only('name')
6. defer 用的时候注意,除了该字段不拿,其余的全拿
all_users = models.User.objects.all().defer('name')
本质上,验证码就是在网页上面抠出一块地方用来访问一个会给你一张带数字图片的url
# 图片验证码
def v_code(request):
# 新建图像 配色模式 长宽 配色板
img_obj = Image.new('RGB', (250, 35), random_color())
# 生成一个画笔的对象,画这个图片对象
draw_obj = ImageDraw.Draw(img_obj)
# 生成一个字体的对象 指定字体样式文件 字体大小
font_obj = ImageFont.truetype('static/font/font_style.ttf', 28)
temp = []
for i in range(5):
v1 = chr(random.randint(97, 122)) # 随机大写字母
v2 = chr(random.randint(65, 90)) # 随机小写字母
n = chr(random.randint(0, 9)) # 随机 0-9 任意一位
random_var = random.choice([v1, v2, n]) # 随机取一位
temp.append(random_var)
# 将每一位随机的验证码写进图片 位置 本次随机内容 填充颜色 字体
draw_obj.text((i * 40 + 35, 0), random_var, fill=random_color(), font=font_obj)
# 加干扰线
# width = 250 # 图片宽度(防止越界)
# height = 35
# for i in range(5):
# x1 = random.randint(0, width)
# x2 = random.randint(0, width)
# y1 = random.randint(0, height)
# y2 = random.randint(0, height)
# draw_obj.line((x1, y1, x2, y2), fill=random_color())
""""""
# 将随机的验证码内容写进 session
request.session['v_code'] = ''.join(temp).upper()
from io import BytesIO
# 内存对象
f = BytesIO()
# 将图片以 png 的格式保存在内存里
img_obj.save(f, format='png')
# 将图片文件取出来
img_data = f.getvalue()
return HttpResponse(img_data, content_type='img/png')
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。