day07 Form&Auth&验证码&富文本&缓存
一. Form&Auth
Form有非常多使用方法,丰富的内容,我这里只做一个表单验证
Form的验证思路
前端:form表单
后台:创建form类,当请求到来时,先匹配,匹配出正确和错误信息。
# Form的使用
class RegisterForm(forms.Form):
# 使用表单做校验
# 表示username字段必须填写,且最大不超过16字符,最小不低于6字符
username = forms.CharField(
# 此处对应的html中表单的input的name
# <input type="text" name="username">中的username
required=True, # 不能为空
max_length=16, # 最大长度为16
min_length=6, # 最小长度为6
# 不满足则报错,内容为下方对应的信息
error_messages={
'required': "注册用户名必须填写",
'max_length': '注册账号最长不超过16',
'min_length': '注册账号最小不少于6',
}
)
def clean(self):
# 用户名是否注册
# 此处得到的是清洗过的数据,简单来说就是上方没有报错的数据
username = self.cleaned_data.get('username')
if User.objects.filter(username=username).exists():
# 此处raise主动抛出异常,将错误信息保存在username中
raise forms.ValidationError({'username': '账号已存在!'})
# 检测重复密码
pwd1 = self.cleaned_data.get('pwd1')
pwd2 = self.cleaned_data.get('pwd2')
if pwd1 != pwd2:
raise forms.ValidationError({'pwd2': '两次密码不一致'})
return self.cleaned_data
# 视图函数
def register(request):
if request.method == 'POST':
# 这里我们需要导入我们写的form.py中的RegisterForm,将request的POST传入,
# 因为我们在html的表单中是以POST进行提交的,所以需要POST进行接收
form = RegisterForm(request.POST)
# 这里验证我们得到的form是否有效
if form.is_valid():
# 验证成功
# 所有清洗过的数据都存在form.cleaned_data中,只需要使用get()取出就好了
username = form.cleaned_data.get('username')
pwd1 = form.cleaned_data.get('pwd1')
# models:创建一个用户
User.objects.create_user(
username=username,
password=pwd1
)
# 注册成功,重定向到登陆
return redirect(reverse('App:login'))
else:
# 验证失败,重新渲染注册页面,form.errors是我们在form中抛出的异常信息,所有的
# 异常信息都会保存到erros中,将他传到html,再errors.username,erros.pwd2取出
return render(request, 'register.html', {'errors': form.errors})
Auth
Django内置了强大的用户认证系统auth,它默认使用 auth_user 表来存储用户数据。
在INSTALLED_APPS中添加'django.contrib.auth'使用该APP, auth模块默认启用。
auth 模块
创建超级用户:python manage.py createsuperuser
auth.authenticate():验证用户名和密码是否正确,一般需要username、password,认证成功返回一个User对象。
auth.login():将认证通过后的User对象注入request.user属性,会在后端为该用户生成相关session数据。
auth.logout():调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
is_authenticated():判断是否认证。
login_requierd():auth给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。
- 若用户没有登录,则会跳转到django默认的登录URL '/accounts/login/' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。
- 如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。
- LOGIN_URL = '/login/' # 这里配置成你项目登录页面的路由
create_user():创建一个新用户,需要username、password等。
create_superuser():创建一个超级用户。
* check_password():检查密码是否正确。
* set_password():修改密码,设置完一定要调用用户对象的save方法。
二.验证码
在用户登录,注册以及一些敏感操作的时候,我们为了防止服务器被暴力请求,或爬虫爬取,我们可以使用验证码进行过滤,减轻服务器的压力。
验证码需要使用绘图 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 插件
django的插件
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.在视图中使用:
使用文本域盛放内容
<form>
<textarea></textarea>
</form>
在head中添加script
<script src='/static/tiny_mce/tiny_mce.js'></script>
<script>
tinyMCE.init({
'mode':'textareas', 'theme':'advanced',
'width':800,'height':600,
})
</script>
四. Cache
缓存
- django内置了缓存框架,并提供了几种常用的缓存
- 基于Memcached缓存
- 使用数据库进行缓存
- 使用文件系统进行缓存
- 使用本地内存进行缓存
- 提供缓存扩展接口
缓存配置
-
创建缓存表
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',
}
}
# 使用redis缓存
# 1、安装插件pip install django_redis
# 2、在settings中配置
# 3、启动redis服务:redis-server
# 4、启动redis客户端:redis-cli,查看数据库2中的缓存内容
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
"LOCATION":"redis://127.0.0.1:6379/2",
'OPTIONS': {
"CLIENT_CLASS":"django_redis.client.DefaultClient",
# "PASSWORD" : "密码"
},
'KEY_PREFIX': 'QF',
}
}
缓存使用
- 在视图中使用(使用最多的场景),直接加上装饰器就可以
- @cache_page()
- time 秒 60*5 缓存五分钟
- cache 缓存配置, 默认default,
- key_prefix 前置字符串
缓存底层
获取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)