session保存状态
理论
1. http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态2. 客户端与服务器端的一次通信, 就是一次会话实现状态保持的方式:在客户端或服务器端存储与会话有关的数据3. 存储方式包括cookie、session,会话一般指session对象4. 使用cookie,所有数据存储在客户端,注意不要存储敏感信息5. 使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_ id6. 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据注意:不同的请求者之间不会共享这个数据,与请求者一对应
settings中应用支持的session机制
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth', # 用户与权限认证应用'django.contrib.contenttypes', # 为Model提供更高层次抽象接口应用,被auth依赖'django.contrib.sessions', # 保存用户状态的会话应用'django.contrib.messages', # 消息应用'django.contrib.staticfiles','look.apps.LookConfig','book.apps.BookConfig','common','user','doc','news','course',]
settings中中间件支持的session机制
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware', # 实现会话应用的会话中间件'django.middleware.common.CommonMiddleware', # 对URL执行重写的中间件'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware', # 验证用户身份的认证中间件'django.contrib.messages.middleware.MessageMiddleware', # 用来支持消息应用的中间件'django.middleware.clickjacking.XFrameOptionsMiddleware',]
注意:
在使用session之前需要先执行makemigrations,migrate的模型映射文件命令,在数据库中有生成django_session表格
查看数据库表
Django的form表单
注意
该案例在项目look下演示
表单使用介绍
登录页面和注册页面都会用到form表单来提交数据 当数据提交到后台后,需要在视图函数中去验证数据的合法性.django中提供了一个form表单的功能,这个表单可以用来验证数据的合法性,还可以用来生成HTML代码
表单引用
1. 创建一个forms.py的文件,放在指定的app当中,然后在里面写表单.2. 表单是通过类实现的,继承自forms.Form,然后在里面定义要验证的字段.3. 在表单中,创建字段跟模型是一模一样的,但是没有null= True或者blank=True等这几种参数了,有的参数是required=True/False.4. 使用is_valid()方法可以验证用户提交的数据是否合法,而且HTML表单元素的name必须和django中的表单的name保持一致, 否则匹配不到.5. is_bound属性:用来表示form是否绑定了数据,如果绑定了,则返回True,否则返回False.6. cleaned data:这个是在is_valid()返回True的时候,保存用户提交I来的数据.
示例代码
### 创建form.py 并写入数据from django import formsclass AddForm (forms. Form)first = forms. IntegerField()second = forms. IntegerField()### 创建注册表单from django import formsclass RegisterFrom(forms.Form):username = forms.CharField(max_length=20,min_length=6)password = forms.Charfield(max_length=8,min_length=6,widget=forms.PasswordInput(attrs={ placeholder':请输入密码}),error.messages={'min_length': '密码长度小于6,'max_length': 密码长度超过8了'})password_repeat = forms.Charfield(widget=forms.PasswordInput()email = forms.EmailField()#--------add_form.html---------<form method='post'>{% csrf token %}{{ form }}<input type="submit" value= “提交"></form>#-------ts22/view.py-------------from .form import AddFormdef add_form(request):if request.method == ' POST': # 当提交表单时form.AddForm( request.POST) # form包含提交的数据if form.is_ valid(): # 如果提交的数据合法a = form. cleaned_ data['a']b = form. cleaned_ data['b']return HttpResponse(str(int(a) + int(b)))else:form = AddForm()return render(request, 'ts22/add2.html', {'form': form})### 注册视图函数from .forms import RegisterFromfrom .models import UserModeldef register(request):if request.method == 'GET':form = RegisterFrom()return render(request, ts22/register.html', context={'form':form})elif request.method == 'POST':form = RegisterFrom(request.POST)if form.is__valid():username = form.cleaned_data.get('username')password = form.cleaned_data.get('password')password_repeat = form.cleaned_data.get('password_repeat')email = form.cleaned data.get('email)if password == password_ repeat:user = UserModel.objects.create(username=username,password=password,email=email)return HttpResponse(注册成功!)else:return HttpResponse('注册失败!)else:return HttpResponse('注册失败!")
表单参数说明
max_length 最大长度min_length 最小长度widget 负责渲染网页上HTML表单的输入元素和提取提交的原始数据attrs 包含渲染后的Widget将要设置的HTML属性error_messages 报错信息
实战代码
登录注册案例
示例代码
### views.pyfrom django.shortcuts import render, redirect, reversefrom django.http import HttpResponse# Create your views here.def home (request) :username = request.session.get ('username','未登录')return render (request,'ts22/home. html', context = {'username':username})def login (request) :if request.method =='GET':return render (request,'ts22/ login_test.html')elif request.method =='POST':username = request.POST.get ('username')request.session[username] = usernamereturn redirect (reverse('ts22_home')) # 使用重定向,注册完成自动跳转至登录页面def logout (request) :request. session. flush ()return redirect (reverse('ts22_home'))###备注1. 一个既可读又可写的类似于字典的对象,表示当前的会话.2. 在登录中使用request.session设置一个登录的信息,3. 在主页面中获取设置的值,然后传给模板.4. 使用request.session.flush()清除会话数据.
HTML5模板
#-----------------------urls.py--------------------------------from django.urls import pathfrom .import viewsurlpatterns = [path('home/' , views.home, name='ts22_home'),path('login/',views.login, name='ts22_login'),path('logout/' ,views.logout, name='ts22_ logout'),]#-----------------------home.html-------------------------------<body>你好! {{ username }}<br><a href="{% url 'ts22_ login’%}">登录</a><a href="{% url 'ts22_ _logout'%}">退出</a></body>#---------------------- login.html------------------------------<form method= "post" >{% csrf token %}<input type="text" name= "username"/><input type=" submit" value="登录"/></form></body>
实战代码
### views.pydef home1(request):username = request.session.get('username', '未登录')return render(request, 'user/home.html', context={'username':username})def login(request):if request.method == 'GET':return render(request, 'user/login2.html')elif request.method == 'POST':username = request.POST.get('username')# 使用session状态保持request.session['username'] = username# 重定向return redirect(reverse('home1'))def logout(request):# 退出登录的逻辑# 1. 退出状态,在sessionrequest.session.flush()return redirect(reverse('home1'))### HTML5###---------------------home.html--------------------------<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>主页面</title></head><body>您好! {{ username }}<br><h5>views下home1类</h5><a href="{% url 'home1' %}">登录</a><h5>用模板标签定向函数</h5><a href="{% url 'logout' %}">退出</a></body></html>###------------------------------log2.html--------------------<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>登录注册案例</title></head><body><form method="post">{% csrf_token %}<input type="text" name="username"/><input type="submit" value="登录"/></form></body></html>
设置session保持登录时间
### views.pydef login(request):if request.method == 'GET':return render(request, 'user/login2.html')elif request.method == 'POST':username = request.POST.get('username')# 使用session状态保持request.session['username'] = usernamerequest.session.set_expiry(3600) # 设置过期时间,如果设置为None则为14天有效期# 重定向return redirect(reverse('home1'))
效果
总结
cookie 存储在浏览器 session 存储在服务器 session_id 存储在浏览器,服务器发送给用户
作用:状态保持。浏览器访问服务器,用户携带cookie 每个用户的session都不一样,已加密
cookie和session的区别和相同点
都是字典对象;存储位置不一样;session是做状态保持的;cookie是做身份验证的
session给浏览器的cookie中生成一个session_id,它相当于一个密钥,浏览器下次访问服务器时就会携带session_id
登录注册和退出
使用的是表单,method == ‘POST’
form是Django自带的表单
作业
- 将上课敲的代码完成
- 把cookie以及session调试完成,理解概念
- 笔记截图,提交作业
