浏览器存储cookie的方式不太安全,那有没有更好些的来存储登入状态的方式呢???

状态保持----cookie和session:

状态保持:

1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态

2.客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务器端存储与会话有关的数据

3.存储方式包括cookie、session,会话一般指session对象

\4. 使用cookie,所有数据存储在客户端,注意不要存储敏感信息

5.使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_id

6状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据

- 注意:不同的请求者之间不会共享这个数据,与请求者一一对应

启用session:

默认是都有的启用的

在settings.py文件中

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

使用session:

启用会话后,每个HttpRequest对象将具有一个session属性,它是一个类字典对象

- get(key, default=None):根据键获取会话的值

- clear():清除所有会话

- flush():删除当前的会话数据并删除会话的Cookie

- del request.session['member_id']-:删除

用户登录状态例子:

1.一个既可读又可写的类似于字典的对象,表示当前的会话.

2.在登录中使用request.session设置一个登录的信息.

3.在主页面中获取设置的值,然后传给模板.

4.使用request.session.flush()清除会话数据.

用户登录例子:

会话过期时间:

  • set_expiry(value):设置会话的超时时间

  • 如果没有指定,则两个星期后过期

  • 如果value是一个整数,会话将在values秒没有活动后过期

  • 若果value是一个timedelta对象,会话将在当前时间加上这个指定的日期/时间过期

  • 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期

  • 如果value为None,那么会话永不过期

可以不配置,那么都是默认的选项

我们实现了登录状态的保持了, 接下来,如果需要注册登录呢?

登录注册实现思路:

登录注册第一步--创建模型生成数据表:

执行映射文件生成数据表

form表单的引用:

登录页面和注册页面都会用到form表单来提交数据

当数据提交到后台后,需要在视图函数中去验证数据的合法性.

django中提供了一个form表单的功能,这个表单可以用来验证数据的合法性还可以用来生成HTML代码

今天的登录注册案例我们就来使用这个django自带的form来生成前端页面以及验证数据.

关于django form表单的使用:

  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的时候,保存用户提交上来的数据.

form表单例子:

可以生成前端页面,也可以用来验证数据的合法性.

注册的form表单:

form表单中的一些参数说明:

max_length 最大长度

min_length 最小长度

widget 负责渲染网页上HTML 表单的输入元素和提取提交的原始数据

attrs 包含渲染后的Widget 将要设置的HTML 属性

error_messages 报错信息

注:虽然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('注册失败!')

将RegisterForm类生成实例,传入模板渲染前端页面d

将获取到的参数传入RegisterForm类,用is_valid()方法验证提交数据的合法性

用cleaned_data获取单个数据对象值

登录的form表单及模板:

登录视图函数:

form.as_p,加p标签

定义模型表单:

from teacher.models import Student,StudentDetails
class StudentForm(forms.ModelForm):
  class Meta:
      model = Students
      exclude = ['is_deleted']
      class StudentDetailForm(forms.ModelForm):
  class Meta:
      model = StudentDetails
      exclude = ['student']

也可以用fields方法指定想要的字段.列表格式.

detail_form = StudentDetailForm(request.POST)

student.detail = detail_form.save(commit=False)

这样就不会真的提交.因为还要加上外键关联对象.

form = StudentForm(instance=student)

说明这个表单是student实例的表单,如果没有实例,在执行save()的时候会创建.

括号中不写instance就会生成一个新的实例,写instance就会修改instance

Django框架基础知识11-会话状态保持及表单的更多相关文章

  1. Django框架基础知识07-常用查询及表关系的实现

    1.常用的模型字段类型 https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types 2.字段的常用参数 官方文档:http ...

  2. Django框架基础知识08-表关联对象及多表查询

    1.自定义主键字段的创建 AutoFiled(pirmary_key=True) # 一般不会自定义,int类型,自增长 一般不自定义主键. 2.order_by asc desc from djan ...

  3. Django框架基础知识01-配置环境

    Django框架 Django是个怎样的东西呢? Web应用框架----Django  http服务器:用来接受用户请求,并将请求转发给web应用框架进行处理. Web应用框架处理完以后再发送给htt ...

  4. Django框架基础知识13-auth系统

    我们昨天登录admin时创建的用户信息是存放在哪里了呢? auth系统的数据表: 从表的名称我们就能看出, auth_user,auth_group,auth_permission分别存放了用户,用户 ...

  5. Django框架基础知识09-请求与响应

    视图函数接受到的request到底是个什么对象呢? HttpRequest对象: 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象视图函数的第一个参数是HttpRequest ...

  6. Django框架基础知识06-模型基础

    1.数据库的连接配置 django 连接mysql的配置流程: 安装 pymysql pip install pymysql 创建数据库用户 有创建数据库权限的用户 创建数据库 crm 修改配置 se ...

  7. Django框架基础知识14-类视图

    MTV view视图 wsgi函数 def index(request): .... return HttpResponse() 特定的HTTP方法.get,post可以定义单独的方法 继承,多继承, ...

  8. Django框架基础知识12-中间件及上下文处理器

    Django中间件(Middleware) 是一个轻量级.底层的“插件”系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出. django 中的中间件(middleware) ...

  9. Django框架基础知识10-内置分页系统

    from django.shortcuts import render, redirect, reversefrom datetime import datetime# Create your vie ...

随机推荐

  1. bzoj3343 教主的魔法【分块入门】By cellur925

    题意:维护一个数列,给出维护区间加法,询问区间内大于等于某个值的元素个数. 算法:分块.因为本题第二问显然可以用二分的思想,但是这貌似并不符合区间可加性,线段树好像就不好用了呢.所以本蒟蒻学习了分块. ...

  2. 51Nod 1092 回文字符串

    最开始毫无头绪,然后参照了一位dalao的博客,思路是一个正序的字符串将其逆序,然后求最长公共子序列(LCS),emm也属于动态规划. #include <iostream> #inclu ...

  3. Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) C

    Description In the army, it isn't easy to form a group of soldiers that will be effective on the bat ...

  4. 洛谷 P3455 [POI2007]ZAP-Queries || 洛谷P2522,bzoj2301

    https://www.luogu.org/problemnew/show/P3455 就是https://www.cnblogs.com/hehe54321/p/9315244.html里面的方法2 ...

  5. usb被占用时,可以用这些方法进行adb无线调试

    转自: http://www.cnblogs.com/shangdawei/p/4480278.html 可用wifi.网口. 1.先要获取root权限 如果手机没有命令行工具,请先在手机端安装终端模 ...

  6. C#方法拓展

    作用: “扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 要求: 1.拓展方法必须是在一个非嵌套.非泛型的静态类中定义.2.他至少有一个参数.3. ...

  7. 进度条--ProgressBar和BackgroundWorker

    1) 需求:就餐打卡数据处理后,插入数据库中,用进度条显示过程 2) 思路:总进度为txt文本文件的行数(数据都是按照行写入),文本文件的大小 //BackgroundWorker对象有三个主要的事件 ...

  8. 计算1至n的k次方的和

    package com.ywx.count; import java.util.Scanner; /** * @author Vashon * date:20150410 * 题目:计算1至n的k次方 ...

  9. Selenium私房菜系列2 -- XPath的使用【ZZ】

    在编写Selenium案例时,少不免是要用到XPath的,现在外面关于XPath使用的参考资料很多,下面我直接转一篇关于XPath使用的文档.如果对XPath不熟悉请参考下文,你不需要去百度/Goog ...

  10. 51nod 1031 骨牌覆盖

    基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 在2*N的一个长方形方格中,用一个1*2的骨牌排满方格.   问有多少种不同的排列方法.   例如: ...