一、用户中心
def userinfo(request):
# 获取用户信息 get 请求
userinfo = QUser.objects.get(id = 1)
# 处理post 请求
if request.method == "POST":
print(request.POST)
# 获取数据 更新信息
userinfo.nickname = request.POST.get("nick_name")
gender = request.POST.get("gender")
if gender == "男":
gender = 1
else:
gender = 0
userinfo.gender = gender
userinfo.phone = request.POST.get("phone")
userinfo.email = request.POST.get("email")
# userinfo.picture = models.ImageField(upload_to="images",
verbose_name="头像", default="1.jpg")
userinfo.address = request.POST.get("address")
userinfo.save()
return render(request,"userinfo.html",locals())
get_属性_display
和select 结合
模型
二、会话机制
创建cookie
def setcookie(request):
# 设置 cookie 需要设置在响应对象中
resp = HttpResponse("设置cookie")
resp.set_cookie("username","zhangsan",expires=120)
return resp
2获取cookie
def getcookie(request):
data = request.COOKIES # 字典
print(data)
data.get("username")
return HttpResponse("get cookie")
3删除cookie
def deletecookie(request):
resp = HttpResponse("get cookie")
resp.delete_cookie("username")
return resp
(二)session
创建session
def setsession(request):
request.session["username"] = "lisi"
request.session.set_expiry(120) # 设置有效期
return HttpResponse("set session")
获取session
def getsession(request):
data = request.session.get("username")
print(data)
return HttpResponse("get session")
删除session
def deletesession(request):
del request.session["username"]
return HttpResponse("delete session")
(三)
2登录效验 装饰器
def LoginValid(func):
def inner(request,*args,**kwargs):
#
cookie_userid = request.COOKIES.get("userid")
session_userid = request.session.get("userid")
cookiusername = request.COOKIES.get("username")
if cookie_userid and session_userid:
# 查询
flag = QUser.objects.filter(
id = session_userid,
username=cookiusername
).exists()
if flag:
return func(request, *args, **kwargs)
return HttpResponseRedirect("/login/")
登出
视图
def logout(request):
"""
退出
:param request:
:return:
"""
resp = HttpResponseRedirect("/login/")
resp.delete_cookie("userid")
resp.delete_cookie("username")
del request.session["userid"]
return resp
密码加密
def setPassword(password):
"""
密码加密
:param password:
:return:
"""
md5 = hashlib.md5()
md5.update(password.encode())
result = md5.hexdigest()
return result
三, 图片上传
django中使用 imageFiled字段处理图片上传,upload_to 和 settings中的 MEDIA_ROOT 决定图片上传的路径
form表单发送上传图片
下载安装pillow
setting中设置媒体文件路径
模型中使用imagefiled字段,并指明图片上传的路径(upload_to)
视图获取图片,完成保存
imagefiled字段,完成图片上传(将图片保存到指定的目录),并且数据库中保存图片的路径
四、form 表单类
Djando自带的类似于Flask 中的flask-wtf插件,能够完成数据校验的功能
- 前端校验(了解内容)
- 使用前端的技术,例如:js,jquery,正则等,对前端数据进行校验,主要包括数据的长度,是否必填,类型进行校验
- 用户体验更好
- 后端校验
- 后端编写,在获取到数据之后,对数据的类型,长度,是否为空,是否已存在等进行校验
- 需要通过和后端进行交互,完成校验,安全性较高,但是效率是较前端校验低
- 开发中需要前端+后端校验
创建页面
1 form表单类,可以通过实例化的方式,提供前端页面
2编写forms类
# 编写forms表单类
# 注册用户 username password
from django import forms
class PersonForm(forms.Form):
username = forms.CharField()
password = forms.CharField()
3视图实例化,并返回
from .forms import PersonForm
def registerdemo(request):
personfrom = PersonForm()
return render(request,"registerdemo.html",locals())
4 页面中使用实例
{
{ personfrom }}
<h2>p标签</h2>
{
{ personfrom.as_p }}
<h2>ul</h2>
{
{ personfrom.as_ul }}
<h2>table</h2>
{
{ personfrom.as_table }} table样式,被废弃,但是可以使用
前端校验
通过选择字段类型和字段属性,指定校验规则。通过实例化forms类,将部分校验规则体现在input输入框中的属性,从而完成前端校验
from django import forms
class PersonForm(forms.Form):
username = forms.CharField()
password = forms.CharField(max_length=8,min_length=6)
使用前端效验
- 创建froms.py文件
- 编写froms类,指定字段和字段类型,字段属性
- 视图实例化froms类,并返回
- 前端使用实例
(三)后端校验
后端:获取到数据,由froms类编写校验规则进行校验
froms通过选择字段类型,字段属性,校验器(validators),自定义校验器编写校验规则,完成后端校验
常用的字段类型
步骤:
1、创建froms.py 并编写forms类
2、指定froms的校验规则
3、视图获取数据,将数据交由froms类进行后端校验
1、通过
获取校验之后的数据进行处理
2、不通过
处理异常
forms类,指定校验规则
from django import forms
from django.core.validators import RegexValidator,EmailValidator
class PersonForm(forms.Form):
username = forms.CharField(
validators=[
EmailValidator(message="必须为邮箱格式")
],
error_messages={"required":"必填"}
)
password = forms.CharField(max_length=8,min_length=6,required=True)
``’
视图接受数据,并进行后端校验
from .forms import PersonForm
def registerdemo(request):
# personfrom = PersonForm()
if request.method == “POST”:
print(request.POST)
# 获取数据
# 后端校验
personform = PersonForm(request.POST) # 实例化forms类,并传递获取的数据
if personform.is_valid(): # 进行数据校验
# True 代表校验通过
print(“success”)
# 处理数据 获取通过校验器之后的数据
data = personform.cleaned_data
print(data)
# 处理 保存数据
else:
# False 代表校验失败
print("error")
errors = personform.errors
print(errors)
# 处理校验结果
return render(request,"registerdemo.html",locals())
(四) 自定义校验器
方法一
from django.core.exceptions import ValidationError
# 函数方式
def checkusername(values):
"""
# 校验 账号中不能包含敏感字
:param values: 获取到的数据
:return: 抛出异常
"""
data_list = ["sb","admin"]
for one in data_list:
if one in values:
# 不通过
raise ValidationError("账号中不能包含敏感字")
方法二
总结
forms类
1、前端校验
- 创建forms文件
- 编写forms类,指定规则
- 视图实例化,并返回到前端模板
- 模板使用forms提供的页面,实际上是将forms类的规则,加入到input输入框的属性
2、后端校验
- 创建forms文件
- 创建forms类
- 编写校验规则(字段类型,字段属性,校验器,自定义校验器)
- 视图将获取的数据,由froms类进行校验
- 处理校验结果
- 成功
- 获取到校验之后的数据,处理
- 失败
- 处理异常
(五)个人中心后端校验
编写forms
- 处理异常
- 成功
# 编写forms表单类
# 注册用户 username password
from django import forms
from django.core.validators import RegexValidator,EmailValidator
from django.core.exceptions import ValidationError
class UserInfoForm(forms.Form):
nick_name = forms.CharField(
error_messages={"required":"必填"}
)
# 1 3\5\7\8 9位
phone = forms.CharField(
validators=[
RegexValidator("^1[3578]\d{9}$",message="手机号格式不正确")
],
error_messages={"required": "必填"}
)
email = forms.CharField(
validators=[
EmailValidator(message="邮箱格式不正确")
]
)
address = forms.CharField(
error_messages={"required": "必填"}
)
视图获取数据 完成后端校验
from .forms import UserInfoForm
def userinfo(request):
# 获取用户信息 get 请求
userinfo = QUser.objects.get(id = 1)
# 处理post 请求
if request.method == "POST":
userinfoform = UserInfoForm(request.POST)
if userinfoform.is_valid():
data = userinfoform.cleaned_data
# 获取数据 更新信息
userinfo.nickname =data.get("nick_name")
gender = request.POST.get("gender")
if gender == "":
gender = userinfo.gender
userinfo.gender = gender
userinfo.phone = data.get("phone")
userinfo.email = data.get("email")
# userinfo.picture = models.ImageField(upload_to="images", verbose_name="头像", default="1.jpg")
userinfo.address = data.get("address")
if request.FILES.get("picture"):
userinfo.picture = request.FILES.get("picture")
userinfo.save()
else:
errors = userinfoform.errors
print(errors)
return render(request,"userinfo.html",locals())
模板中显示错误信息