Django 用户中心的编写(五)

一、用户中心

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())

模板中显示错误信息
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/h1751541643/article/details/108836425