Django进阶之使用Session保持HTTP状态

HTTP协议是无状态的,每次请求都是新的请求;

客户端与服务器端的一次通信就是一次会话。

可使用cookie和session在客户端或者服务端存储有关会话的数据,来进行状态保持;

cookie使用在上篇。本篇是使用session进行状态保持及使用Redis存储session的笔记。

存储方式

Cookie:所有的数据存储在客户端,不要存储敏感的数据。

Session:所有数据存储在服务端,在客户端用cookie存储session_id。

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

注意:

不同请求者之间不会共享这个数据,与请求者一一对应。

启用session

settings.py文件中

session中间件

使用session

启用session后,每个HttpRequest对象都有一个类似字典对象的session数据。

使用方法

get(key, default=None) 根据键值获取session值

clear() 清空所有的会话

flush() 删除当前会话并删除会话的cookie

使用示例

设置路由

# session使用
path('blog', views.blog, name='blog'),
path('login', views.login, name='login'),
path('loginHandle', views.login_handle, name='loginHandle'),
path('checkout', views.checkout, name='checkout'),

 设置视图

from django.shortcuts import redirect
def blog(request):
    """blog网站"""

    username = request.session.get('name', '游客')
    return render(request, 'blog/index.html', {'username': username})


def login(request):
    """ 登录页面 """

    return render(request, 'blog/login.html')


def login_handle(request):
    """ 登录操作 """

    username = request.POST.get('username')

    # 存储session
    request.session['name'] = username
    return redirect('blog')

def checkout(request):
    """ 退出 """

    # request.session.clear()
    request.session.flush()

    return redirect('blog')

创建模板

首页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <style>
        #user {
            margin-left:100px;
        }
        .nav ul li{
            float:left;
            list-style:none;
            width:50px;
            border-left:1px solid #000;
            padding-left:20px;
        }
        .nav > ul > li.first{
            border:none;
        }

        .clear {
            clear:both;
        }
        .content {
            margin-top:10px;
        }
    </style>
</head>
<body>
    <div class="header">
        <b>blog首页</b>
        <span id="user">
            当前登录:
            {% if username == '游客' %}
                {{username}}  <a href="/myapp/login">去登录</a>
            {% else %}
                {{username}}  <a href="/myapp/checkout">退出</a>
            {% endif %}
        </span>
    </div>
    <div class="nav">
        <ul>
            <li class="first"><a href="#">推荐</a></li>
            <li><a href="#">Python</a></li>
            <li><a href="#">PHP</a></li>
            <li><a href="#">Java</a></li>
            <li><a href="#">Go</a></li>
        </ul>
    </div>
    <div class="clear"></div>
    <div class="content">
        网站内容网站内容网站内容网站内容网站内容网站内容
    </div>
</body>
</html>

登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>blog登录</title>
</head>
<body>
    <h2>blog登录</h2>
    <form action="/myapp/loginHandle" method="post">
        名称:<input type="text" name="username">
        <br/>
        密码:<input type="password" name="pwd">
        <br/>
        <input type="submit" value="登录">
    </form>
</body>
</html>

效果

未登录

登录页面

登录后

设置过期时间

set_expiry(value)

如果不设置,两个星期后过期

参数为整数

request.session.set_expiry(10)

参数:时间对象

0 关闭浏览器时失效

None 永不过期

存储session位置

数据库:默认存储在数据库中

SESSION_ENGINE = 'django.contrib.sessions.backends.db'

缓存:只存储在本地,如果丢失不能找回,比数据库快

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

数据库和缓存:优先从本地缓存中获取,读取不到再从数据库中获取

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

redis缓存session

安装

pip install django-redis-sessions

配置settings.py

在settings.py最后一行增加,配置可按照使用redis修改

SESSION_ENGINE = 'redis_sessions.session'

SESSION_REDIS_HOST = 'localhost'

SESSION_REDIS_PORT = 6379

SESSION_REDIS_DB = 0

SESSION_REDIS_PASSWORD = ''

SESSION_REDIS_PREFIX = 'session'

验证redis存储

通过redis客户端连接取数据

首先从cookie中拿到session_id

然后通过redis中取session数据

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值