Django中利用cookie或session实现状态保持

本文介绍了在Django框架中如何使用cookie和session来实现状态保持。详细讲解了设置、获取及删除cookie的步骤,并对比了cookie的局限性。同时,文章阐述了session的工作原理,包括在服务端存储用户数据并利用sessionid,以及session数据的添加、查询和删除操作。
摘要由CSDN通过智能技术生成

cookie

cookie把会话数据保存在客户端浏览器中。
但是要注意,cookie不能跨浏览器使用,并且不能保存汉字。

Django中的实现方式:

首先在应用的urls.py中设置路由

urlpatterns = [
    path('login/', views.login, name='login'), # 测试设置cookie
    path('index/', views.index, name='index'), # 测试获取cookie
    path('logout/', views.logout, name='logout'), # 测试删除cookie
]
  1. 设置cookie
    应用的views.py
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username, password)
        # 生成响应对象
        res = HttpResponse('set cookie')
        # 参数依次是cookie名称、cookie值、cookie的持续有效时间
        res.set_cookie('username', username, max_age=3*60*60)
        return res
    return render(request, 'app01/login.html')

前端login.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
<form action="{% url 'App01:login' %}" method="post">
    {% csrf_token %}
    username: <input type="text" name="username"> <br>
    password: <input type="password" name="password"> <br>
    <input type="submit">
</form>
</body>
</html>

结果
在这里插入图片描述
输入信息,点击提交,可以看到已经生成了cookie。
在这里插入图片描述
2. 获取cookie
应用的views.py

def index(request):
    # 从cookie中获取用户名
    username = request.COOKIES.get('username')
    return render(request, 'app01/index.html', context=locals())

前端index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% if username %}
<p>
    welcome {{ username }} ! <a href="{% url 'App01:logout' %}">logout</a>
</p>

{% else %}
<p>
    please <a href="{% url 'App01:login' %}">login</a>
</p>
{% endif %}
</body>
</html>

结果:
如果没有cookie信息
在这里插入图片描述
获取到cookie则显示为
在这里插入图片描述
3. 删除cookie
应用的views.py

def logout(request):
    res = redirect(reverse('App01:index'))
    res.delete_cookie('username')
    return res

session

关于用户的数据保存在服务端,在客户端cookie中加上sessionid。
可保存任意类型的数据。

注意,django中使用时,需要首先进行数据迁移,生成session使用的数据库表。

python manage.py makemigrations
python manage.py migrate

Django中的实现方式:

首先在应用的urls.py中设置路由

urlpatterns = [
    path('login/', views.login, name='login'), # 测试session设置
    path('index/', views.index, name='index'), # 测试session获取
    path('logout/', views.logout, name='logout'), # 测试session删除
]
  1. session设置
    应用的views.py
def login(request):
    if request.method == 'POST':
        # 获取用户名和密码
        username = request.POST.get('username')
        password = request.POST.get('password')

        # 设置session
        request.session['username'] = username
        request.session['password'] = password
        return redirect(reverse('App02:index'))
    return render(request, 'app02/login.html')

前端login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>app02</title>
</head>
<body>
<form action="{% url 'App02:login' %}" method="post">
    {% csrf_token %}
    username: <input type="text" name="username"> <br>
    password: <input type="password" name="password"> <br>
    <input type="submit">
</form>
</body>
</html>

结果
在这里插入图片描述
输入信息,提交后生成sessionid
在这里插入图片描述
2. session获取
应用的views.py

def index(request):
    # 获取session信息
    username = request.session.get('username')
    password = request.session.get('password')
    return render(request, 'app02/index.html', context=locals())

前端index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>app02</title>
</head>
<body>
{% if username %}
<p>
    welcome {{ username }} ! <a href="{% url 'App02:logout' %}">logout</a>
</p>

{% else %}
<p>
    please <a href="{% url 'App02:login' %}">login</a>
</p>
{% endif %}
</body>
</html>

结果:
如果未获取到session信息
在这里插入图片描述
如果存在session信息
在这里插入图片描述

  1. session删除
    应用的views.py
def logout(request):
    # 从session中删除单个键值对
    del request.session['username']
    del request.session['password']
    # 清空所有session,但是不会将session表中的数据删除
	request.session.clear()
    # 清空并删除session表中的数据
	request.session.flush()
    return redirect(reverse('App02:index'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值