session保存状态
理论
1. http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
2. 客户端与服务器端的一次通信, 就是一次会话实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
3. 存储方式包括cookie、session,会话一般指session对象
4. 使用cookie,所有数据存储在客户端,注意不要存储敏感信息
5. 使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_ id
6. 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
注意:不同的请求者之间不会共享这个数据,与请求者一对应
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 forms
class AddForm (forms. Form)
first = forms. IntegerField()
second = forms. IntegerField()
### 创建注册表单
from django import forms
class 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 AddForm
def 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 RegisterFrom
from .models import UserModel
def 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.py
from django.shortcuts import render, redirect, reverse
from 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] = username
return 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 path
from .import views
urlpatterns = [
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.py
def 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. 退出状态,在session
request.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.py
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
request.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调试完成,理解概念
- 笔记截图,提交作业