什么是Cookies

什么是Cookies

cookies设置的原因: 1. http请求的无记忆性; 2.加快访问速度  3. 减少服务器压力

cookies特点:

cookies保存在客户端浏览器上的键值对,且每次访问页面都会带着cookies

cookies可以主动清除

cookies也可以被"伪造",可以被别人带着cookies操作你的账号

cookies会根据域名进行分类,不能跨域共享,也就是说百度有百度的,JD有京东的

cookies必须请求数据成功后才能有用哈

浏览器可以设置不接收Cookies

服务器端设置的cookies

cookies可以设置超时时间, max_age=10

Django下设置Cookie的函数 :

def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
               domain=None, secure=False, httponly=False):


服务端Cookie学习

1、获取Cookie:

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数:
default: 默认值
salt: 加密盐
max_age: 后台控制过期时间

2、设置Cookie:

rep = HttpResponse(...) 或 rep = render(request, ...)
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密盐',...)
参数:
key, 键
value='', 值
max_age=None, 超时时间
expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
domain=None, Cookie生效的域名
secure=False, https传输
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可
注意:document.cookie 获取,也能设置内容,httponly告诉我们只能http传输且不能修改。
document.cookie='fdafjklfjksaljfsakjflkfaffdfs' 设置/覆盖cookies

获取Cookie实例:

settings.py

INSTALLED_APPS = [
...
'app01', # 注册app
]
STATICFILES_DIRS = (os.path.join(BASE_DIR, "statics"),) # 现添加的配置,这里是元组,注意逗号
TEMPLATES = [
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
]

urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^login.html/', views.login),
url(r'^index.html/', views.index),
]

views.py

from django.shortcuts import render, redirect
from app01 import models
def login(request):
print(request.method)
# models.Administrator.objects.create(
# username = 'admin',
# password = 'admin'
# ) 数据库内保存数据
message = ''
if request.method == 'POST':
username = request.POST.get("user")
password = request.POST.get("pass")
print('username: %s, password:%s' % (username, password))
# obj = models.Administrator.objects.filter(username=username, password=password).count()
# if obj: 从数据库内取出数据,进行判断也可以
if username == 'root' and password == 'root':
req = redirect('/index.html/') # 接收redirect对象,# 这里是浏览器路径,伪静态
req.set_cookie('username', username)
# req.set_cookie('username', username, max_age=10) # 设置超时时间10s
return req
# return redirect('/index.html') # 与上面3行同,只是添加了Cookie
else:
message = '用户名或密码错误'
return render(request, 'login.html', {'message': message}) # 这里是网页html def index(request):
print(request.method)
username = request.COOKIES.get("username")
if username:
return render(request, 'index.html', {'username': username})
return redirect('/login.html/') # 这里是浏览器路径,伪静态

templates/loginx.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# 伪静态#}
<form action="/login.html/" method="post">
{% csrf_token %} {# 为跨站请求 #}
<div>
<label for="user">用户名</label>
<input id="user" name="user" type="text">
</div>
<div>
<label for="pass">密&nbsp;&nbsp;&nbsp;&nbsp;码</label>
<input id="pass" name="pass" type="password">
</div>
<div>
<label></label>
<input value="登录" type="submit">
<span style="color: red">{{ message }}</span>
</div>
</form>
</body>
</html>

templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<h2>hello, {{ username }}</h2>
</body>
</html>

页面显示;

初始化数据库

  python manage.py makemigrations
python manage.py migrate

设置Cookies实例:

set_cookies默认是使用当前域名,所以使用默认的即可,一般子域名不需用domain参数[path另说]

用户登录的操作可以设置顶级域名[baidu.com],所有子域名都可以访问读取数据

注意:域名和IP是2个概念哈,cookie绑定的是域名而不是IP

settings.py

INSTALLED_APPS = [
...
'app01', # 注册app
]
STATICFILES_DIRS = (os.path.join(BASE_DIR, "statics"),) # 现添加的配置,这里是元组,注意逗号
TEMPLATES = [
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
]

urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from app01 import views
urlpatterns = [
url(r'^test.html/', views.test),
url(r'^gettest.html/', views.get_test),
]

views.py

from django.shortcuts import render, redirect
from app01 import models
# 设置Cookie测试
# from django.shortcuts import render, redirect, HttpResponse
def test(request):
obj = HttpResponse("ok,设置Cookie成功")
import datetime
timeout = datetime.datetime.utcnow() + datetime.timedelta(seconds=10)
obj.set_cookie('name', "FTL", expires=timeout, max_age=10, path='/') # 设置Cookie,默认path=/
obj.set_cookie('SEX', "HHH", expires=timeout, max_age=10, path='/test.html') # 设置Cookie,path=/test.html
# baidu.com顶级域名,下面的crm.baidu.com,也可以访问
# domain,默认是NONE,当前域名,有domain参数但没有path,默认域名下找cookie
# 不能给同级设置
obj.set_cookie('SEX', "HHH", expires=timeout, max_age=10, domain='baidu.com') # 设置域名,domain='/',默认当前域名
# 使用https访问安全加密,端口8443,需要证书
obj.set_cookie('SEX', "HHH", expires=timeout, max_age=10 , secure=True) # 安全加密,端口8443,需要证书
# httponly,用于安全,但是不能做到绝对的安全,仅http传输用,防止JS获取数据[但是抓包可以获取数据]
obj.set_cookie('SEX', "HHH", expires=timeout, max_age=10 ,httponly=True) # 防止JS获取Cookie数据[document.cooki]
return obj
# 取出Cookie测试
def get_test(request):
name = request.COOKIES.get('name')
sex = request.COOKIES.get('SEX')
print(name, sex)
return HttpResponse(name, sex)

templates/index.html

页面显示

客户端的Cookie设置

客户端设置:  document.cookie
      客户端获取: document.cookie='name=FTL'
                  e = new Date()
--------------------------------------------------------------------------------------------------------------------------------
      dom            --> 自己写,document.cookie="name=FTL",获取的时候用split切分             
      jquery插件    -->  jquery.cookie.js   +  jquery-3.2.1.js
         <script src='/static/js/jquery.cookie.js'></script>
         $.cookie("list_pager_num", 30,{ path: '/' });

JS插件内配合Jquery设定cookie

JS插件内配合Jquery设定cookie
唯一不同的是Cookie的超时属性只有expires,可以通过d=new Date()来操作时间
<script src="/static/jquery-2.1.4.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
$.cookie(); {# 获取值 #}
$.cookie('name','FTL'); {# 设置新值 #}
$.cookie('name', 'FTL', {'paht':'/index.html'}); {# 设置新值 + cookie属性[属性同cookie] #}
</script> ----------------------------------------views.py
# 服务端调用JS插件写的Cookie
def js_cookie(request):
print('request.COOKIES', request.COOKIES)
obj = render(request, 'js_cookie.html')
obj.set_cookie('HELLO', 'FTL')
return obj

浏览器DOM设定cookie:

刷新页面,观察后台的cookie:

基于Cookie的加密:

基于Cookie的加密:

views.py

from django.shortcuts import render, redirect, HttpResponse
def test(request):
obj = HttpResponse("ok,设置Cookie成功")
obj.set_signed_cookie('name', 'FTL')
obj.set_signed_cookie('age', '24')
return obj
# 取出Cookie测试
def get_test(request):
name = request.get_signed_cookie('name')
age = request.get_signed_cookie('age')
print(name, age)
return HttpResponse(name, age)

【更多参考】http://www.cnblogs.com/wupeiqi/articles/5246483.html

Python学习---django下的cookie操作 180201的更多相关文章

  1. Python学习---django下的Session操作 180205

    和Cookie一样,都是用来进行用户认证.不同的是,Cookie可以吧明文/密文的信息都会KV返回给客户段,但是session可以吧用户的Value[敏感信息]保存在服务器端,安全. Django中默 ...

  2. Python学习---Django下的Sql性能的测试

    安装django-debug-tools Python学习---django-debug-tools安装 性能测试: settings.py INSTALLED_APPS = [ ... 'app01 ...

  3. PHP与JavaScript下的Cookie操作

    下面的例子列出几种情形交互场景,列出JS和php交互的方法.总结下,以免日后再为cookie问题困扰. setcookie.php getcookie.php 总结: php用自身函数读取php 的c ...

  4. python学习笔记(二)、字符串操作

    该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于 ...

  5. 《转》Python学习(15)-对文件的操作(二)

    转自 http://www.cnblogs.com/BeginMan/p/3169020.html 一.文件系统 从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进 ...

  6. 《转》python学习--基础下

    转自http://www.cnblogs.com/BeginMan/archive/2013/04/12/3016323.html 一.数字 在看<Python 核心编程>的时候,我就有点 ...

  7. Python学习---django模板语法180122

    django模板语法[Template] 模版的组成:  HTML代码+逻辑控制代码  <h1> {{ user_name }} </h1> 逻辑控制代码的组成: 1.变量: ...

  8. 【python】-- Django 分页 、cookie、Session、CSRF

    Django  分页 .cookie.Session.CSRF 一.分页 分页功能在每个网站都是必要的,下面主要介绍两种分页方式: 1.Django内置分页 from django.shortcuts ...

  9. python学习二,字符串常用操作

    字符串可以说是在日常开发中应用最广泛的了,现在来总结下有关python中有关字符串一些常用操作 首先我们声明一个字符串变量 str = "hello world" 下面我们来依次介 ...

随机推荐

  1. 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较

    几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较 来源   XFire VS Axis XFire是与Axis2 并列的新一代WebService平台.之所 ...

  2. master线程的主循环,后台循环,刷新循环,暂停循环

    InnoDB存储引擎的主要工作都是在一个单独的后台线程master thread中完成的.master thread的线程优先级别最高.其内部由几个循环(loop)组成:主循环(loop).后台循环( ...

  3. Java线程池及其底层源码实现分析

    1.相关类 Executors  ExecutorService   Callable   ThreadPool     Future 2.相关接口 Executor Executor接口的使用: p ...

  4. mysql-5.6.31安装(单实例 Linux)

    安装版本:mysql-5.6.31 安装环境:Linux RHEL6.5.x86 安装要求:单实例,端口为默认:3306              (1) 要求安装Mysql数据库版本号及包名为:my ...

  5. [转]从客户端中检测到有潜在危险的Request.Form值的详细解决

    本文转自:http://www.knowsky.com/887593.html asp.net1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力.当用户试图用之类的输入影响页面返回结 ...

  6. 撩课-Java每天10道面试题第1天

    1.简述JDK.JRE.JVM? 一.JDK JDK(Java Development Kit) 是整个JAVA的核心, 包括了Java运行环境(Java Runtime Envirnment), 一 ...

  7. python学习之老男孩python全栈第九期_day025知识点总结——接口类、抽象类、多态、封装

    一. 接口类 java:面向对象编程 设计模式 -- 接口类 接口类:python原生不支持 抽象类:python 原生支持的 from abc import abstractclassmethod, ...

  8. PhpStorm 自定义快捷键

    PhpStorm 两个重要快捷键 1.CTRL+SHIFT+A 用于恢复隐藏项 2.文件之间的快速跳转 CTRL+SHIFT+N 3.自定义快捷键 第一步:打开左上角file-setting 第二步: ...

  9. axios使用初涉

    看vue的时候,vue2.0推荐使用axios做http请求,今天就学一下axios基本使用. 安装 axios 推荐npm方法(npm是node.js环境下的包管理器): npm install a ...

  10. NGINX本地服务器解析域名

    1.找到hosts文件 ,添加需要解析的域名 2.在cmd命令窗口中检测解析是否生效 3 找到本地服务器的域名配置文件:添加绑定的域名,更改访问的目录 4.添加pathinfo.隐藏index.php ...