昨日auth模块
昨日回顾:
auth组件:
-验证:authenticat(request,username='lqz',password='123')
-登录:login(request,user)
-注销:logout(request),内部调用了flush(),以后再从request中取user,是匿名用户
-request.user:请求来了,在中间件中,通过cookie查询user信息,放到request.user中,如果查询不到,把匿名用户赋给它
-登录认证装饰器:login_required(指定?后面拼接的key值,如果没有登录,跳转到哪个url)
-全局配置跳转的url:在setting中:LOGIN_URL='/login/'
-创建用户:create_superuser,create_user,就只是一个字段区分
-校验密码:check_password(密码),得用户对象调用,如果校验通过,返回True
-修改密码:set_password(密码),修改了一定要调save()方法,得用户对象来调用
-是否验证通过:is_authenticated,校验用户是否验证通过,通常用在模板上
-删除用户:orm的删除
-扩展auth组件:
-创建一个一对一的表模型
-定义一个表模型,继承AbstractUser,写扩展的字段
-数据库迁移会报错:去setting中配置:AUTH_UDER_MODEL='app名字.表模型'
-其他用法完全一样,只是原来用User表模型,全部改成新定义的表模型
今日
BBS项目数据设计
数据库设计: User -id -name -password -email -phone -avatar 用户头像 -create_date 用户注册时间 -blog Blog -id -title #博客标题 -site_name #站点名称 -theme category(分类): #一个站点可以有多个分类,但分类只属于创建分类那个人的站点 -nid -title -blog 跟blog一对多 tag:(文章关键字) -id -title -blog 跟blog一对多 article -id -title -desc 摘要 -create_time auto_add_now:当该条记录创建时,自动添加当前时间 -content 文章内容 -category 一对多 一个分类可以有多个文章 -tag 多对多 多个文章可以有多个关键字 -blog 一对多 一个博客站点可以有多个文章 commit(评论) -id -user 哪个用户 外键 -article 对哪篇文章 外键 -content 评论了什么内容 -commit_time 时间 -parent_id 这个绑定commit 的id nid user article content parent_id 1 1 1 111 null 2 2 1 222 null 3 3 1 333 1 4 4 1 444 3 5 3 1 555 4 UpandDown(点赞数 反对数) -nid -user 哪个用户 -article 对哪篇文章 -is_up 点赞还是点踩
Pillow
from django.shortcuts import render, HttpResponse from PIL import Image,ImageDraw,ImageFont import random from io import BytesIO def get_valid_code(request): # 第一种方式 with open('static/img/lhf.jpg','rb') as f: # 图片二进制 data=f.read() return HttpResponse(data) # 第二种方式:随机生成一张图片 # pip3 install Pillow # pillow 是一个图形处理的模块,功能很强强大 # 生成一张图片,第一个参数是模式:RGB,第二个参数是图片大小,第三个参数是图片颜色 img = Image.new('RGB', (320, 35), color=get_random_color()) # 保存到本地 with open('valid_code.png', 'wb') as f: # 直接用img的save方法,第一个参数是空文件,第二个参数图片格式 img.save(f, 'png') # 打开文件,再返回 with open('valid_code.png', 'rb') as f: data = f.read() return HttpResponse(data) #from io import BytesIO #BytesIO 是在内存中生成空文件进行管理 能自动清理 速度更快 # 第三种方式 # 在内存中生成一个空文件(把它想象成 open('valid_code.png', 'wb') as f:) # 一个是在硬盘上,一个是在内存中 img = Image.new('RGB', (320, 35), color=get_random_color()) f = BytesIO() # 把图片保存到f中 # 放到内存中,存取比较快,而且有自动清理 img.save(f, 'png') data = f.getvalue() return HttpResponse(data) # 第四种方式,在图片上写文字 img = Image.new('RGB', (320, 35), color=get_random_color()) # 拿到画笔,把图片传入画笔 img_draw=ImageDraw.Draw(img) # 生成一个字体对象,第一个参数是字体文件的路径,第二个参数是字体大小 font=ImageFont.truetype('static/font/ss.TTF',size=25) # 第一个参数,xy的坐标,第二个参数:要写的文字,第三个参数:写文字的颜色,第四个参数:字体 # 不同的字体是不同的ttf文件 img_draw.text((0,0),'python',get_random_color(),font=font) f = BytesIO() # 把图片保存到f中 # 放到内存中,存取比较快,而且有自动清理 img.save(f, 'png') data = f.getvalue() return HttpResponse(data)