众所周知,HTTP是无状态的,就是这一次请求和下一次请求之间没有任何状态保持。我们无法直接识别来自同一人的连续请求。实现状态保持的方法就是在客户端或服务器器端存储与会话有关的数据,这就是cookie和session,这篇将介绍如何使用django实现cookie和session的设置社使用。

cookie

我们可以设计一个简单的登录系统来说说cookie的设置和使用
先设置路由:

app_name = 'two'

urlpatterns = [
    path('login/', views.login, name='login'),
    path('mine/', views.mine, name='mine'),
    path('logout/', views.logout, name='logout'),
]

分别对应登录,主页和退出登录

在登陆的方法中我们先判断它的亲求方式,如果是get类型则渲染登录界面,如果是post类型则将post过来的值设置cookie

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        username = request.POST.get('user')
        request = HttpResponse('登陆成功')
        request.set_cookie('user',username)   # 设置cookie
    return request

login.html:

<form action="{% url 'two:login' %}" method="post">
    <span>用户名:</span><input type="text" placeholder="请输入用户名" name="user">
    <br>
    <button>登录</button>

然后主页用于显示登录的用户名

def mine(request):
    user = request.COOKIES.get('user')   # 获取cookie值
    return render(request, 'mine.html',locals())

通过获取的cookie来获取登录的用户名
mine.html:

<h1>
    {{ user }},你好
</h1>
<hr>
<a href="{% url 'two:logout' %}">退出登录</a>

退出登录则需要删除cookie:

def logout(request):
    response = render(request, 'logout.html')
    response.delete_cookie('user')   # 删除cookie
    return response

html中显示退出成功即可

session

  • 服务端会话技术,数据存储在服务器中
  • 默认Session存储在内存中,但Django中默认会把Session持久化到数据库中
  • Session依赖于Cookie

同样我们依然使用登录, 显示, 退出登录 界面来介绍session

登录的方法和设置cookie的差不多

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        username = request.POST.get('user')
        request.session['user'] = username # 设置session
    return HttpResponse('登陆成功')

展示界面也差不多,只需把COOKIES换成session即可

def mine(request):
    user = request.session.get('user')
    return render(request, 'mine.html',locals())

退出登录界面也大同小异:

def logout(request):
    request.session.flush()   # 同时删除session和cookes
    response = render(request, 'logout.html')
    return response

token

  • 自定义的Session
  • 如果Web页面开发中,使用起来和Session基本一致
  • 如果使用在移动端或客户端开发中,通常以Json形式传输,需要移动端自己存储Token,需要获取Token关联数据的时候,主动传递Token
最后修改:2020 年 07 月 10 日
如果觉得我的文章对你有用,请随意赞赏