【Django】Session 𶤞

目录

  • 介绍
  • Django中操作Session

原文: http://blog.gqylpy.com/gqy/266

"@

介绍



Cookie虽然在一定程度上解决了"保持状态"的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且它保存在服务器,有较高的安全性。这就是Session.

问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是"谁",因此上述的Cookie就起到了桥接的作用.

我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是"谁"了。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如"账号密码"等等.

总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是"谁",但是Cookie以文本的形式保存在本地,自身安全性较差。所以我们就通过Cookie识别不同的用户,对应的Session里保存私密的信息以及超过4096的文本.

上述所说的Cookie与Session,是共通性的"东西",不限于语言和框架.

Django中操作Session



获取、设置、删除Session中的数据:

def test(request):
    """设置键值对"""
    request.session['user'] = 'zyk'  # 设置键值对{'user': 'zyk'}
    request.session.setdefault('pwd', '123')  # 设置键值对{'pwd': '123'}, 如果存在则不设置

    """获取键值对"""
    user = request.session['user']  # 获取'user'的值
    pwd = request.session.get('pwd', None)  # 获取'pwd'的值, 如果不存在则返回None

    """删除键值对"""
    del request.session['user', 'pwd']  # 删除指定的键值对cookie
    # request.session.delete()  # 删除该用户的所有session, 不删除cookie
    # request.session.flush()  # 删除该用户的所有session, 删除cookie
    return HttpResponse('is ok')


获取所有键、值、键值对:

def test(request):
    """设置键值对"""
    request.session['user'] = 'zyk'  # 设置键值对{'user': 'zyk'}
    request.session.setdefault('pwd', '123')  # 设置键值对{'pwd': '123'}, 如果存在则不设置

    """获取所有键、值、键值对"""
    keys = request.session.keys()  # dict_keys(['user', 'pwd'])
    values = request.session.values()  # dict_values(['zyk', '123'])
    items = request.session.items()  # dict_items([('user', 'zyk'), ('pwd', '123')])

    return HttpResponse('is ok')


操作会话的session:

def test(request):
    """设置键值对"""
    request.session['user'] = 'zyk'  # 设置键值对{'user': 'zyk'}
    request.session.setdefault('pwd', '123')  # 设置键值对{'pwd': '123'}, 如果存在则不设置

    """会话session的key"""
    session_key = request.session.session_key  # liucwhvkrccdsgkcibvyu4ar5c56ssw1, 如果不存在则返回None

    """检查会话session的key在数据库中是否存在"""
    ret = request.session.exists(session_key)  # 存在返回True, 否则False

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

    """删除当前会话的所有Session数据(不会删除键值对)"""
    request.session.delete()

    """删除当前会话数据并删除会话的Cookie(会删除键值对)"""
    request.session.flush()
    # 这用于确保前面的会话数据不可以再次被用户的浏览器访问.
    # 例如, django,contrib.auth.logout()函数中就会调用它.

    return HttpResponse('is ok')


设置会话session与Cookie的超时时间:

def test(request):
    """设置键值对"""
    request.session['user'] = 'zyk'  # 设置键值对{'user': 'zyk'}
    request.session.setdefault('pwd', '123')  # 设置键值对{'pwd': '123'}, 如果存在则不设置

    """设置会话Session和Cookie的超时时间"""
    value = 0
    request.session.set_expiry(value)
    # 如果value是个整数, session会在value秒后失效;
    # 如果value是个datatime或timedelta, session会在这个时间后失效;
    # 如果value是0, 用户关闭浏览器后session就会失效;
    # 如果Value是None, session会依赖全局session失效策略.
    # 默认超时时间为两周: SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2

    # 设置超时时间后(非None), 可通过获取键值对获得失效时间('_session_expiry', 1):
    items = request.session.items()  # dict_items([('user', 'zyk'), ('pwd', '123'), ('_session_expiry', 1)])

    return HttpResponse('is ok')


Session流程解析:

*
Session版登陆验证:**

# 装饰器函数
def login_request(fn):
    """如果未登陆,将返回login页面"""
    def inner(request, *args, **kwargs):
        if request.session.get('is_login') != '1':
            # 获取当前url路径
            next = request.path_info
            return redirect('/login/?next=%s' % next)
        ret = fn(request, *args, **kwargs)
        return ret
    return inner

# 登陆功能
def login(request):
    if request.method == 'POST':
        user, pwd = request.POST.get('user'), request.POST.get('pwd')
        if models.Userinfo.objects.filter(name=user, pwd=pwd):
            # 设置session
            request.session['is_login'] = '1'
            # 设置session超时时间,0:关闭浏览器时失效
            request.session.set_expiry(0)
            next = request.GET.get('next')
            ret = redirect(next) if next else redirect('/index/')
            return ret
    return render(request, 'login.html')

@login_request
def home(request):
    return HttpResponse("我是home页面")

# @login_request
def index(request):
    # 获取session的key
    # session_key = request.session.session_key
    return render(request, 'index.html')

@login_request
def logout(request):
    # 删除当前会话数据并删除会话的Cookie
    request.session.flush()
    return redirect('/login/')


Django中Session配置:
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用.

Django中Session相关配置:

1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

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

3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 

4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

其他公用设置项:
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,默认修改之后才保存(默认)

"

原文: http://blog.gqylpy.com/gqy/266

原文地址:https://www.cnblogs.com/gqy02/p/11367496.html

时间: 2024-11-06 11:35:34

【Django】Session 𶤞的相关文章

【Django】Session -- 2019-08-08 18:01:28

目录 介绍 Django中操作Session 原文: http://106.13.73.98/__/40/ @ 介绍 Cookie虽然在一定程度上解决了"保持状态"的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且它保存在服务器,有较高的安全性.这就是Session. 问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是"谁",因此上述的Cooki

【Django】Django命令(Manager.py)

django-admin.py startproject mysite 该命令在当前目录创建一个 mysite 目录. django-admin.py这个文件在C:\Python27\Lib\site-packages\django\bin文件夹里,可以把该目录添加到系统Path里面. Django内置一个轻量级的Web服务器. 进入 mysite 目录的话,现在进入其中,并运行 python manage.py runserver 命令 启动服务器,用http://127.0.0.1:8000

【Django】RROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)

刚刚启动项目的时候,突然报了这个错误.之前一直正常 后来百度一下,让我在window的host文件下,把被注释的127.0.0.1   localhost这个的注释取消 然鹅并木有用 直接用cmd连接MySQL都失败了 后来去服务里面查,发现MySQL的服务没有启动(或者说不知道为啥停了...) 然后就正常了... [Django]RROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) 原文地址:https:

【Django】Form组件

目录 Form组件介绍 常用字段与插件 Form组件中所有内置字段 从数据库中获取数据 校验示例 检验手机号是否合法 方式一(基本操作) 方式二(自定义验证规则) 方式三(利用钩子) 验证密码一致性 钩子 局部钩子 全局钩子 进阶 批量添加样式 ModelForm Form套Form @ *** Form组件介绍 在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,

【Django】ORM操作#2 񓼺

目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 关于Mate类 聚合查询 aggregage() 分组查询 annotate() F查询 Q查询 事务 其它鲜为人知的操作 原文: http://blog.gqylpy.com/gqy/264 @ *** 必知必会的13条查询方法 ==1. all()== 查询所有结果 . ==2. get(kw

【Django】优化小技巧之清除过期session

事情是这样的,大概也就几万注册用户的站点(使用django1.6), session 存储在关系型数据库,这次上线之后发现session表几十万数据了,过期session没有被自动删除 思考 官网 session文档 django的 session是可以存储在多种介质下的,db,文件,cache(缓存也可以定义)都行,也可以使用cookie base的session 默认的序列化方式是BaseJSONSerializer,1.5和以前的版本使用的是pickle 默认的session时间是2周,1

【Django】Cookie与Session

cookie与session 会话跟踪技术 在一个会话的多个请求中共享数据,比如: - 请求银行主页: - 请求登录(请求参数是用户名和密码): - 请求转账(请求参数与转账相关的数据): - 请求信誉卡还款(请求参数与还款相关的数据) 在这上会话中当前用户信息必须在这个会话中共享的 Cookie Cookie规范 Cookie大小上限为4KB: 一个服务器最多在客户端浏览器上保存20个Cookie: 一个浏览器最多保存300个Cookie: Cookie与HTTP头 Cookie是通过HTTP

【Django】--Model字段

所有字段 AutoField(Field) --int自增列,必须填入参数primary_key=True BigAutoField(AutoField) --bigint自增列,必须填入参数primary_key=True 注意:当model中没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): #自动创建一个列名为id的且为自增的整数列 username = models.CharFi

【Django】不知道为什么就是想学一下 01

1. Django安装.项目创建及服务器连接 系统:Ubuntu 14.04.4 > cat /etc/issue //查看系统版本 安装Django > sudo pip install django 确定进入了root模式,进入django-admin.py所在目录,运行以下指令 > django-admin.py startproject mysite 在当前目录生成mysite文件夹,进入文件夹(哦,项目名可以随意取,不一定非得mysite...) > manage.py