一 . Cookie
1.cookie 是什么?
  保存在浏览器端的键值对!
  服务端在返回响应的时候,告诉浏览器保存的键值对!浏览器可以拒绝保存Cookie.

2. 为什么要有cookie?
  HTTP请求是无状态的,我们需要保存状态 --> cookie

3. Django中cookie的使用
  1. 设置cookie
  rep = HttpResponse("ok")
  rep.set_cookie("key", "value", max_age=xx秒)
  rep.set_signed_cookie("key", "value", salt="ooxx", max_age=xx秒)
  2. 获取cookie
  request.COOKIES.get("key")
  request.get_signed_cookie("key", default="", salt="ooxx")

  参数:

  • default: 默认值
  • salt: 加密盐
  • max_age: 后台控制过期时间

4. cookie有失效时间
  1. Django中不设置,关闭浏览器就失效了
  2. 通过max_age设置超时时间

5. 补充3点:
1. 如何登陆后再跳转回之前访问的页面

写个登录函数:例子

 def login(request):
if request.method == "POST":
path = request.GET.get("path")
print(path)
username = request.POST.get("username")
pwd = request.POST.get("pwd")
if username == "alex" and pwd == "":
if path:
rep = redirect(path)
else:
rep = redirect("/publisher_list/")
rep.set_signed_cookie("hu", "hao", salt="ooxx", max_age=7)
return rep
else:
return HttpResponse("用户名或者密码错误")
else: return render(request, "login.html")

写个装饰器

from functools import wraps

# 装饰器版本登录认证
def login_check(func):
@wraps(func)
def inner(request, *args, **kwargs):
path = request.path_info
# 登录验证
v = request.get_signed_cookie("hu", default="", salt="ooxx") # 获取加盐的cookie
if v == "hao":
return func(request, *args, **kwargs)
else:
return redirect("/login/?path={}".format(path)) return inner

你想要访问那个页面,把装饰器加到它的上面

@login_check
def book_list(request):
data = models.Book.objects.all()
return render(request, "book_list.html", {"book_list": data})

最后访问,book_list这个页面,会让你先登录,并且在url后面拼接一个目录

http://127.0.0.1:8001/login/?path=/book_list/,然后登陆成功,跳转到book_list

注意:login.html文件里面的action一定要写空,否则不能跳转,或者写成{{request.get_path_info}}

2. 如何将FBV的装饰器应用到CBV上?

在views里面导入

from django.utils.decorators import method_decorator

就是

 @method_decorator(login_check) 括号里面是你写的装饰器函数

例子:

class AddBook(views.View):

    @method_decorator(login_check)  # login_check是刚才写的装饰器函数
def get(self, request):
data = models.Publisher.objects.all()
return render(request, "add_book.html", {"publisher_list": data}) def post(self, request):
book_name = request.POST.get("title")
publisher_id = request.POST.get("publisher")
publisher_obj = models.Publisher.objects.get(id=publisher_id)
# 创建书籍
models.Book.objects.create(
title=book_name,
publisher_id=publisher_id
# publisher=publisher_obj
)
return redirect("/book_list/")

3. 装饰器修复技术 --> from functools import wraps

在inner函数的上面加上@wraps(func),默认不加是不影响使用的,只是被装饰的函数名字和注释信息都不能查看了

例子:

from functools import wraps

def wrapper(func):
@wraps(func) # 借助内置的工具修复被装饰的函数
def inner(*args, **kwargs):
print("呵呵")
func(*args, **kwargs)
return inner @wrapper
def foo(arg):
"""
这是一个测试装饰器的函数
:param arg: int 必须是int类型
:return: None
"""
print("嘿嘿嘿" * arg) foo(10)
print(foo.__doc__)

二  session

为什么要有session
1. Cookied额缺点:
  1. 数据量只有4096
  2. 数据都保存在客户端(浏览器)上,不安全

2. Session
保存在服务端的键值对

  1. 请求来了之后,还是生成随机字符串
  2. 以随机字符串为key,在服务端生成一个大字典,真正保存数据是value
  3. 把随机字符串以cookie的形式回复给浏览器

  4. 下一次请求再来的时候,会携带上一步的随机字符串
  5. 从请求中拿到随机字符串,
  6. 去后端以 该随机字符串为key找对应的value
  7. value里面存的就是真正有用的数据

3. Django中如何使用Session
  1. 无论设置Session还是获取Session都是针对request对象来操作

  2. 设置Session
  request.session["key"] = "value"
  3. 获取session
  request.session.get("key")

4. 其他常用命令
  1. # 将所有Session失效日期小于当前日期的数据删除
  request.session.clear_expired()
  2. # 删除当前的会话数据并删除会话的Cookie。
  request.session.flush()

  3. 设置超时时间
  request.session.set_expiry(7)

5. 常用配置项(写在Settings.py中)
# 全局配置session超时时间
SESSION_COOKIE_AGE = 60 * 60 * 24 * 2 #7天

# 是否每次请求都刷新session超时时间
SESSION_SAVE_EVERY_REQUEST = True

例子:

def login_check(func):
@wraps(func)
def inner(request, *args, **kwargs):
next = request.path_info
# 登录验证
# 取Session
v = request.session.get("s21")
if v == "hao":
return func(request, *args, **kwargs)
else:
return redirect("/login/?next={}".format(next)) return inner # 登录 session验证
def login(request):
if request.method == "POST":
next = request.GET.get("next")
username = request.POST.get("username")
pwd = request.POST.get("pwd")
if username == "alex" and pwd == "":
if next:
rep = redirect(next)
else:
rep = redirect("/secode/")
request.session["s21"] = "hao"
request.session.set_expiry(70)
return rep
else:
return HttpResponse("走吧")
else:
return render(request, "login.html") @login_check
def index(request):
return render(request, "index.html") @login_check
def secode(request):
return render(request, "secode.html")

17-3 cookie和session的更多相关文章

  1. Django实现表单验证、CSRF、cookie和session、缓存、数据库多表操作(双下划綫)

    通常验证用户输入是否合法的话,是前端js和后端共同验证的,这是因为前端js是可以被禁用的,假如被禁用了,那就没法用js实现验证合法与否了,也就是即使用户输入的不合法,但是也没提示,用户也不知道怎么输入 ...

  2. Django之Form、CSRF、cookie和session

    Django是一个大而全的web框架,为我们提供了很多实用的功能,本文主要介绍Form.CSRF.cookie和session 一.Form 在web页面中form表单是重要的组成部分,为了数据安全和 ...

  3. python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)

    python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...

  4. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

  5. 会话Cookie及session的关系(Cookie & Session)

    会话Cookie及session的关系(Cookie & Session) 在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用sess ...

  6. 深入理解cookie和session

    cookie和session在java web开发中扮演了十分重要的作用,本篇文章对其中的重要知识点做一些探究和总结. 1.cookie存在于浏览器 随意打开一个网址,用火狐的调试工具,随意选取一个链 ...

  7. Django学习笔记(5)——cookie和session

    一,前言 1.1,什么是会话跟踪技术 在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束.在一个会话的多个请求中共享数据,这就是会话跟踪技术. 例如在一 ...

  8. JSP(3)—Cookie和Session

    HTTP是一个无状态的协议,web服务器无法分辨出那些请求是同一个浏览器发出的,浏览器每一次请求都是孤立的 即使HTTP1.1支持持续链接,但当用户有一段时间没有请求时,连接也会关闭. 如何实现网上的 ...

  9. python---django使用cookie和session

    在views中的调用: def login(req): message='' if req.method == "POST": user = req.POST.get(" ...

  10. cookie和session在Django中的应用

    1 会话跟踪技术 什么是会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而1008 ...

随机推荐

  1. vmware的Linux虚拟机ping不通外网的解决办法

    转载自:https://blog.csdn.net/l_l_b_/article/details/79409843 1.点击此处编辑 2.选择虚拟网络编辑器 3.点击更改设置 4.选择v8 并将使用本 ...

  2. LAMP环境搭建和配置(2)

    配置httpd 默认虚拟主机 编辑hpptd的主配置文件 搜索httpd-vhost,把行首的#号删除 保存主配置文件,然后编辑虚拟主机配置文件 重新编辑配置段(第一段为默认虚拟主机) ServerA ...

  3. Java处理正则验证手机号-详解

    参考博客:https://www.cnblogs.com/wangzn/p/7212587.html https://www.cnblogs.com/go4mi/p/6426215.html pack ...

  4. div覆盖div DIV相互重叠如何解决

    div覆盖div,出现div与div盒子之间产生重叠覆盖现象,而内容没有出现覆盖重叠现象原因与解决方法.DIVCSS5通过CSS图文案例介绍产生原因与解决方法.DIV与DIV覆盖原因与解决方法. 可能 ...

  5. sqlserver 2008 R2 安装教程(心得记录)

    在这里简单的记录下自己安装sqlserver的过程吧(本人以前安装失败过,然后卸载了,就一直没用,现在由于工具原因,重新安装,过程相对第一次安装会复杂点) 1.首先,把以前安装的注册表的对应c盘的文件 ...

  6. IO流3 --- File类的常用方法2 --- 技术搬运工(尚硅谷)

    File类的判断功能 @Test public void test5(){ File file = new File("hello.txt"); //判断是否是文件目录 Syste ...

  7. Win7下设置WiFi热点

    Win7下设置WiFi热点 今天研究了下Win7设置WIFI热点,Connectify神马的都是浮云~亲測可用,现拿出来分享下~ 1.点击"開始",再点击"执行" ...

  8. centos下彻底删除mysql

    打算重新试试安装两个mysql,就把老的删除了. yum remove mysql mysql-server mysql-libs compat-mysql51 rm -rf /var/lib/mys ...

  9. CF573E (平衡树)

    CF573E 题意概要 给出一个长度为\(n\)的数列,从中选出一个子序列\(b[1...m]\)(可以为空) 使得\[ \sum_{i=1}^m{b_i*i}\]最大,输出这个最大值. 其中\(n\ ...

  10. 30分钟学webpack实战

    阅读目录 一:什么是webpack? 他有什么优点? 二:如何安装和配置 三:理解webpack加载器 四:理解less-loader加载器的使用 五:理解babel-loader加载器的含义 六:了 ...