django入门教程之cookie和session【六】
cookie
服务器在响应头中设置cookie,发给客户端,浏览器拿到响应头后会自动保存下来这个cookie,并在同一个域名后续的请求中将cookie作为请求头传给服务端。
新建一个app:
python manage.py startapp mycookie
代码编写
mycookie/views.py文件:
#coding=utf8
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
def set_cookie(request):
response = HttpResponse('这是设置cookie')
response.set_cookie("name", "lili", max_age=50)
return response
def get_cookie(request):
print(request.COOKIES)
print(request.COOKIES.get("name"))
return HttpResponse('这是读取cookie')
def del_cookie(request):
response = HttpResponse('这是删除cookie')
response.set_cookie("name", "lili", max_age=0)
return response
mycookie/urls.py文件:
from django.urls import path
from . import views
# app_name = 'cookie'
urlpatterns = [
path('set/', views.set_cookie),
path('get/', views.get_cookie),
path('del/', views.del_cookie)
]
根项目/urls.py文件
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('cookie/', include('mycookie.urls'))
]
浏览器访问
浏览器中访问:http://127.0.0.1:1992/cookie/get/
这时没有任何cookie。
再访问:http://127.0.0.1:1992/cookie/set/
响应头中有返回set_cookie字段。 此时Application中也有了cookies值。
设置的max_age是50s,50s后cookie过期,如果访问http://127.0.0.1:1992/cookie/del/ 会立刻过期。过期后,再次访问网页,cookie字段就为空。
同一个域名下,访问其它路由地址,可以发现在cookie有效期内,请求头中会带有我们设置的cookie。
session
代码编写
settings.py文件中,增加2个属性值。
# session存储引擎,默认是db,默认设置查询在本机python默认路径的global_settings.py文件:C:\Users\用户\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\conf\global_settings.py
SESSION_ENGINE = "django.contrib.sessions.backends.file"
# 设置session文件存储目录,必须是已存在的目录
SESSION_FILE_PATH = BASE_DIR / "session_path"
以下代码中我们并未设置session的过期时间,django在global_settings.py中有默认的过期时间,14天。 还有默认存储引擎,只是这次举例改为file引擎。
代码如下:
# views.py文件代码
def set_session(request):
request.session['id'] = 10
request.session['meta'] = 'V'
return HttpResponse('这是设置session')
def get_session(request):
print(request.session) # <django.contrib.sessions.backends.file.SessionStore object at 0x000001DF88B1E610>
print(request.session.get("id")) # 10
print(request.session.items()) # dict_items([('id', 10), ('meta', 'V')])
print(request.session.get_session_cookie_age()) # 1209600s == 14天
return HttpResponse('这是读取session')
def del_session(request):
# 注意重复删除会报错
# print(request.session.pop('id'))
# print(request.session.items())
request.session.clear()
print(request.session.items()) # dict_items([])
return HttpResponse('这是删除session')
# urls.py文件代码
from django.urls import path
from . import views
urlpatterns = [
path('set/', views.set_cookie),
path('get/', views.get_cookie),
path('del/', views.del_cookie),
path('set_s/', views.set_session),
path('get_s/', views.get_session),
path('del_s/', views.del_session)
]
浏览器访问
1、访问set_s时,响应头中返回了set-cookie,同时设置的session_path目录下生成了sessionid文件。
2、访问get_s时,会发现请求头的cookie字段加上了sessionid。
3、访问del_s时,会将request.session里的字段清空,注意这里只是清空字段值,并不是删除session。不论是cookie还是session,一旦返回给浏览器,就由浏览器控制是否删除,要么到过期时间自动删除,要么通过浏览器设置中的清空浏览记录来删除。