欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

django进阶之cookie和session的使用示例

程序员文章站 2022-05-13 21:26:04
cookies :是浏览器为 web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它收到服务器回发送过来的cookies。它保存在浏览器下的某个文件夹下。...

cookies :是浏览器为 web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它收到服务器回发送过来的cookies。它保存在浏览器下的某个文件夹下。

session:django的session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,django默认会把session存入到数据库中。

session依赖于cookie,如果浏览器不能保存cookies那么session就失效了。因为它需要浏览器的cookie值(sessionid)去session里做对比。session就是用来在服务器端保存用户的会话状态。

django进阶之cookie和session的使用示例

cookie

1、获取cookie:

request.cookies[key]
request.cookies.get(key)
# 普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看
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,...)
# 给cookie签名
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 true只能http协议传输,无法被javascript获取(不是绝对,底层抓包可以获取到也可以被覆盖),防止xss攻击

由于cookie保存在客户端的电脑上,所以,javascript和jquery也可以操作cookie。

<script src='/static/js/jquery.cookie.js'></script>
$.cookie("list_pager_num", 30,{ path: '/' });

session

django中默认支持session,其内部提供了5种类型的session供开发者使用:

数据库(默认)
缓存
文件
缓存+数据库
加密cookie

1、数据库session

django默认支持session,并且默认是将session数据存储在数据库中,即:django_session 表中。

a. 配置 settings.py

session_engine = 'django.contrib.sessions.backends.db' # 引擎(默认)

session_cookie_name = "sessionid" # session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)

session_cookie_path = "/" # session的cookie保存的路径(默认)

session_cookie_domain = none # session的cookie保存的域名(默认)

session_cookie_secure = false # 是否https传输cookie(默认)

session_cookie_httponly = true # 是否session的cookie只支持http传输(默认)

session_cookie_age = 1209600 # session的cookie失效日期(2周)(默认)

session_expire_at_browser_close = false # 是否关闭浏览器使得session过期(默认)

session_save_every_request = false # 是否每次请求都保存session,默认修改之后才保存(默认)

b. 使用

def index(request):
# 获取、设置、删除session中数据
request.session['k1']
request.session.get('k1',none)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']

# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

# 用户session的随机字符串
request.session.session_key

# 将所有session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")

# 删除当前用户的所有session数据
request.session.delete("session_key")

2、缓存session

a. 配置 settings.py

session_engine = 'django.contrib.sessions.backends.cache' # 引擎
session_cache_alias = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置


session_cookie_name = "sessionid" # session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
session_cookie_path = "/" # session的cookie保存的路径
session_cookie_domain = none # session的cookie保存的域名
session_cookie_secure = false # 是否https传输cookie
session_cookie_httponly = true # 是否session的cookie只支持http传输
session_cookie_age = 1209600 # session的cookie失效日期(2周)
session_expire_at_browser_close = false # 是否关闭浏览器使得session过期
session_save_every_request = false # 是否每次请求都保存session,默认修改之后才保存

b. 使用

同上

3、文件session

a. 配置 settings.py

session_engine = 'django.contrib.sessions.backends.file' # 引擎
session_file_path = none # 缓存文件路径,如果为none,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/t


session_cookie_name = "sessionid" # session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
session_cookie_path = "/" # session的cookie保存的路径
session_cookie_domain = none # session的cookie保存的域名
session_cookie_secure = false # 是否https传输cookie
session_cookie_httponly = true # 是否session的cookie只支持http传输
session_cookie_age = 1209600 # session的cookie失效日期(2周)
session_expire_at_browser_close = false # 是否关闭浏览器使得session过期
session_save_every_request = false # 是否每次请求都保存session,默认修改之后才保存

b. 使用

同上

4、缓存+数据库session

数据库用于做持久化,缓存用于提高效率

a. 配置 settings.py

session_engine = 'django.contrib.sessions.backends.cached_db' # 引擎

b. 使用

同上

5、加密cookie session

a. 配置 settings.py

session_engine = 'django.contrib.sessions.backends.signed_cookies' # 引擎

b. 使用

同上

示例:

from django.shortcuts import render,redirect

# create your views here.
import datetime

def login(request):
  print("cookies",request.cookies) #打印cookies 一个字典,里面多个键值对
  print("session",request.session) #session为服务器对应客户信息的键

  if request.method=="post":
    name=request.post.get("user")
    pwd=request.post.get("pwd")
    if name=="yuan" and pwd=="123":

      # ret=redirect("/index/")
      # 给对象ret设置cookie 安全性较差 ,设定有效时间max_age,expires,
      # ret.set_cookie("username",{"11":"22"},max_age=10,expires=datetime.datetime.utcnow()+datetime.timedelta(days=3))
      # return ret

      # cookie session一起使用
      # session 以字典存放在服务器端,发给客户端的是数据对应的键,
      request.session["is_login"]=true # 在session中增加键值对
      request.session["user"]=name

      return redirect("/index/")

  return render(request,"login.html")


def index(request):
  if request.cookies.get("username",none):  # 取不到设置默认值为none
    name = request.cookies.get("username",none)
    return render(request, "index.html", locals())

  # session验证 存在数据库中,所以要先makemigrations生成数据库
  if request.session.get("is_login",none):
    name=request.session.get("user",none)
    return render(request,"index.html",locals())
  else:
    return redirect("/login/")
##session获取
request.session.get("user",none)
# 设置
request.session["user"]=name
# 删除
del request.session.get("user")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。