session保存状态

理论

  1. 1. http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
  2. 2. 客户端与服务器端的一次通信, 就是一次会话实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
  3. 3. 存储方式包括cookiesession,会话一般指session对象
  4. 4. 使用cookie,所有数据存储在客户端,注意不要存储敏感信息
  5. 5. 使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_ id
  6. 6. 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
  7. 注意:不同的请求者之间不会共享这个数据,与请求者一对应

settings中应用支持的session机制

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth', # 用户与权限认证应用
  4. 'django.contrib.contenttypes', # 为Model提供更高层次抽象接口应用,被auth依赖
  5. 'django.contrib.sessions', # 保存用户状态的会话应用
  6. 'django.contrib.messages', # 消息应用
  7. 'django.contrib.staticfiles',
  8. 'look.apps.LookConfig',
  9. 'book.apps.BookConfig',
  10. 'common',
  11. 'user',
  12. 'doc',
  13. 'news',
  14. 'course',
  15. ]

settings中中间件支持的session机制

  1. MIDDLEWARE = [
  2. 'django.middleware.security.SecurityMiddleware',
  3. 'django.contrib.sessions.middleware.SessionMiddleware', # 实现会话应用的会话中间件
  4. 'django.middleware.common.CommonMiddleware', # 对URL执行重写的中间件
  5. 'django.middleware.csrf.CsrfViewMiddleware',
  6. 'django.contrib.auth.middleware.AuthenticationMiddleware', # 验证用户身份的认证中间件
  7. 'django.contrib.messages.middleware.MessageMiddleware', # 用来支持消息应用的中间件
  8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9. ]

注意:

在使用session之前需要先执行makemigrations,migrate的模型映射文件命令,在数据库中有生成django_session表格

查看数据库表

Django的form表单

注意

该案例在项目look下演示

表单使用介绍

  1. 登录页面和注册页面都会用到form表单来提交数据 当数据提交到后台后,需要在视图函数中去验证数据的合法性.
  2. django中提供了一个form表单的功能,这个表单可以用来验证数据的合法性,还可以用来生成HTML代码

表单引用

  1. 1. 创建一个forms.py的文件,放在指定的app当中,然后在里面写表单.
  2. 2. 表单是通过类实现的,继承自forms.Form,然后在里面定义要验证的字段.
  3. 3. 在表单中,创建字段跟模型是一模一样的,但是没有null= True或者blank=True等这几种参数了,有的参数是required=True/False.
  4. 4. 使用is_valid()方法可以验证用户提交的数据是否合法,而且HTML表单元素的name必须和django中的表单的name保持一致, 否则匹配不到.
  5. 5. is_bound属性:用来表示form是否绑定了数据,如果绑定了,则返回True,否则返回False.
  6. 6. cleaned data:这个是在is_valid()返回True的时候,保存用户提交I来的数据.

示例代码

  1. ### 创建form.py 并写入数据
  2. from django import forms
  3. class AddForm (forms. Form)
  4. first = forms. IntegerField()
  5. second = forms. IntegerField()
  6. ### 创建注册表单
  7. from django import forms
  8. class RegisterFrom(forms.Form):
  9. username = forms.CharField(max_length=20,min_length=6)
  10. password = forms.Charfield(max_length=8,min_length=6,
  11. widget=forms.PasswordInput(
  12. attrs={ placeholder':请输入密码}),
  13. error.messages={'min_length': '密码长度小于6
  14. 'max_length': 密码长度超过8'})
  15. password_repeat = forms.Charfield(widget=forms.PasswordInput()
  16. email = forms.EmailField()
  17. #--------add_form.html---------
  18. <form method='post'>
  19. {% csrf token %}
  20. {{ form }}
  21. <input type="submit" value= “提交">
  22. </form>
  23. #-------ts22/view.py-------------
  24. from .form import AddForm
  25. def add_form(request):
  26. if request.method == ' POST': # 当提交表单时
  27. form.AddForm( request.POST) # form包含提交的数据
  28. if form.is_ valid(): # 如果提交的数据合法
  29. a = form. cleaned_ data['a']
  30. b = form. cleaned_ data['b']
  31. return HttpResponse(str(int(a) + int(b)))
  32. else:
  33. form = AddForm()
  34. return render(request, 'ts22/add2.html', {'form': form})
  35. ### 注册视图函数
  36. from .forms import RegisterFrom
  37. from .models import UserModel
  38. def register(request):
  39. if request.method == 'GET':
  40. form = RegisterFrom()
  41. return render(request, ts22/register.html', context={'form':form})
  42. elif request.method == 'POST':
  43. form = RegisterFrom(request.POST)
  44. if form.is__valid():
  45. username = form.cleaned_data.get('username')
  46. password = form.cleaned_data.get('password')
  47. password_repeat = form.cleaned_data.get('password_repeat')
  48. email = form.cleaned data.get('email)
  49. if password == password_ repeat:
  50. user = UserModel.objects.create(username=username,password=password,email=email)
  51. return HttpResponse(注册成功!)
  52. else:
  53. return HttpResponse('注册失败!)
  54. else:
  55. return HttpResponse('注册失败!")

表单参数说明

  1. max_length 最大长度
  2. min_length 最小长度
  3. widget 负责渲染网页上HTML表单的输入元素和提取提交的原始数据
  4. attrs 包含渲染后的Widget将要设置的HTML属性
  5. error_messages 报错信息

实战代码

登录注册案例

示例代码

  1. ### views.py
  2. from django.shortcuts import render, redirect, reverse
  3. from django.http import HttpResponse
  4. # Create your views here.
  5. def home (request) :
  6. username = request.session.get ('username','未登录')
  7. return render (request,'ts22/home. html', context = {'username':username})
  8. def login (request) :
  9. if request.method =='GET':
  10. return render (request,'ts22/ login_test.html')
  11. elif request.method =='POST':
  12. username = request.POST.get ('username')
  13. request.session[username] = username
  14. return redirect (reverse('ts22_home')) # 使用重定向,注册完成自动跳转至登录页面
  15. def logout (request) :
  16. request. session. flush ()
  17. return redirect (reverse('ts22_home'))
  18. ###备注
  19. 1. 一个既可读又可写的类似于字典的对象,表示当前的会话.
  20. 2. 在登录中使用request.session设置一个登录的信息,
  21. 3. 在主页面中获取设置的值,然后传给模板.
  22. 4. 使用request.session.flush()清除会话数据.

HTML5模板

  1. #-----------------------urls.py--------------------------------
  2. from django.urls import path
  3. from .import views
  4. urlpatterns = [
  5. path('home/' , views.home, name='ts22_home'),
  6. path('login/',views.login, name='ts22_login'),
  7. path('logout/' ,views.logout, name='ts22_ logout'),
  8. ]
  9. #-----------------------home.html-------------------------------
  10. <body>
  11. 你好! {{ username }}<br>
  12. <a href="{% url 'ts22_ login’%}">登录</a>
  13. <a href="{% url 'ts22_ _logout'%}">退出</a>
  14. </body>
  15. #---------------------- login.html------------------------------
  16. <form method= "post" >
  17. {% csrf token %}
  18. <input type="text" name= "username"/>
  19. <input type=" submit" value="登录"/>
  20. </form>
  21. </body>

实战代码

  1. ### views.py
  2. def home1(request):
  3. username = request.session.get('username', '未登录')
  4. return render(request, 'user/home.html', context={'username':username})
  5. def login(request):
  6. if request.method == 'GET':
  7. return render(request, 'user/login2.html')
  8. elif request.method == 'POST':
  9. username = request.POST.get('username')
  10. # 使用session状态保持
  11. request.session['username'] = username
  12. # 重定向
  13. return redirect(reverse('home1'))
  14. def logout(request):
  15. # 退出登录的逻辑
  16. # 1. 退出状态,在session
  17. request.session.flush()
  18. return redirect(reverse('home1'))
  19. ### HTML5
  20. ###---------------------home.html--------------------------
  21. <!DOCTYPE html>
  22. <html lang="en">
  23. <head>
  24. <meta charset="UTF-8">
  25. <title>主页面</title>
  26. </head>
  27. <body>
  28. 您好! {{ username }}<br>
  29. <h5>viewshome1类</h5>
  30. <a href="{% url 'home1' %}">登录</a>
  31. <h5>用模板标签定向函数</h5>
  32. <a href="{% url 'logout' %}">退出</a>
  33. </body>
  34. </html>
  35. ###------------------------------log2.html--------------------
  36. <!DOCTYPE html>
  37. <html lang="en">
  38. <head>
  39. <meta charset="UTF-8">
  40. <title>登录注册案例</title>
  41. </head>
  42. <body>
  43. <form method="post">
  44. {% csrf_token %}
  45. <input type="text" name="username"/>
  46. <input type="submit" value="登录"/>
  47. </form>
  48. </body>
  49. </html>

设置session保持登录时间

  1. ### views.py
  2. def login(request):
  3. if request.method == 'GET':
  4. return render(request, 'user/login2.html')
  5. elif request.method == 'POST':
  6. username = request.POST.get('username')
  7. # 使用session状态保持
  8. request.session['username'] = username
  9. request.session.set_expiry(3600) # 设置过期时间,如果设置为None则为14天有效期
  10. # 重定向
  11. return redirect(reverse('home1'))

效果

总结

cookie 存储在浏览器 session 存储在服务器 session_id 存储在浏览器,服务器发送给用户

作用:状态保持。浏览器访问服务器,用户携带cookie 每个用户的session都不一样,已加密

cookie和session的区别和相同点

都是字典对象;存储位置不一样;session是做状态保持的;cookie是做身份验证的

session给浏览器的cookie中生成一个session_id,它相当于一个密钥,浏览器下次访问服务器时就会携带session_id

登录注册和退出

使用的是表单,method == ‘POST’

form是Django自带的表单

作业

  1. 将上课敲的代码完成
  2. 把cookie以及session调试完成,理解概念
  3. 笔记截图,提交作业