获取cookie:
设置cookie:
这中设置cookie,关闭浏览器就失效了。
实例:
res = redirect('/index/')
res.set_cookie('username', 'liao', max_age=10) # 10秒之后失效
return res
或者:
import datetime
current_date = datetime.datetime.utcnow()
expires_date = current_date + datetime.timedelta(seconds=10) # 10秒之后过期
res.set_cookie('username', 'liao', expires=expires_date)
session:
Session依赖于Cookie,
服务端session:
request.session.get()
request.session[x] = x
request.session.clear()
配置文件中设置默认操作:
SESSION_COOKIE_NAME = "seesionid"
SESSION_COOKIE_PATH = "/"
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_SECURE = False
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_AGE = 1209600 # session的cookie失效日期
SESSION_COOKIE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得session失效。
======
一、Cookie
如果禁用cookie,那么在所有的需要登录网站,都不能使用了。
实质是:客户端浏览器上的一个文件。
类似于键值对的形式存在,像字典。
比如liao用户登录了服务器,服务器返回了一个键值对:
{ "is_login": "etrashdkjndas6ioiwdgvqjbwhkje"}
如果liao用户保留了这个字符串,存在于本地。
cookie的保存与浏览器的特点,我们可以使用这个特征来实现用户登录的功能。
示例:
设置cookie:
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
elif request.method == 'POST':
u = request.POST.get('username')
p = request.POST.get('pwd')
dic = user_info.get(u)
if not dic:
return render(request, 'login.html')
if dic['pwd'] == p:
res = redirect('/index/')
res.set_cookie('username', u)
return res
else:
return render(request, 'login.html')
注意我们的res.set_cookie()
,就给浏览器设置了cookie。return之后就设置了。
示例:
取的cookie:
def index(request):
# 获取当前已经登录的用户名
v = request.COOKIES.get('username')
print v
if not v:
return redirect('/cookie/login/')
return render(request, 'cookie/index.html', {'current_user':v})
上面两个例子,实现了用户验证。
登录成功,set cookie,然后再判断cookie是否存在。
1)获取cookie:
request.COOKIES.get('username')
request.COOKIES['username']
2)设置cookie的时候需要注意:
返回的时候,需要设置cookie:
response = request.POST.get('username')
response.set_cookie('key', 'value')
return response
注意,这里是服务端的写入。
3)注销的时候,清除掉cookie:
我们设置过期时间为当前时间,就清除了。
res.set_cookie('key', 'value', max_age=0)
如果按照上面的方式,关闭浏览器,再开启浏览器cookie就会失效。
Cookie实现用户登录
cookie的用法:
1)设置cookie过期时间
方式一:
response = reidrect('/cookie/index/')
response.set_cookie('key', 'value', max_age=10) # 过期时间为10秒
return response
方式二:
import datetime
current_date = datetime.datetime.utcnow()
#res.set_cookie('username', u, max_age=4)
res.set_cookie('username', u, expires=current_date + datetime.timedelta(seconds=10)) # 10秒之后过期
return res
2)设置生效的路径:path
比如分页的时候,分页的cookie生效路径只能是那里。
3)设置生效的域名:domain
4)设置只能是httponly的情况:
稍微安全一点点。
res.set_cookie('user_type', 'asdqwe', httponly=True)
5)在客户端读写cookie。
对比上面的服务端的读写cookie。
实例,通过js实现写cookie。
jquery的插件jquery.cookie.js.
6)js中设置cookie的path。
那么此cookie只能在这个path中使用。
function change_page_size(ths){
var v = $(ths).val(); // 这个$(this)是拥有此方法的html元素
$.cookie('per_page_size', v, {'path':'/cookie/user_list/'}); // 设置cookie
location.reload(); // 重新刷新页面
}
7)设置带签名的cookie
服务端设置带签名的cookie,加盐。
res = HttpResponse('xxx')
res.set_signed_cookie('username', 'liao' , salt=‘asdasa’)
# 取出加盐后的cookie
request.get_signed_cookie('username', salt='asdasa')
Session
引子:基于Cookie做用户验证的时候,敏感信息最好不要放在Cookie中。
Session原理:是保存在服务器端的键值对。
注意:要使用session,必须先做以下的步骤创建django_sesseion表:
python manage.py makemigrations
python manage.py migrate
示例:
# 服务端设置session
def login1(request):
if request.method == 'GET':
return render(request, 'cookie/login1.html')
elif request.method == 'POST':
username = request.POST.get('username')
pwd = request.POST.get('pwd')
print ('username:'+username, 'pwd:'+pwd)
if username == 'root' and pwd == '123':
# 生成随机字符串
# 携带到用户浏览器cookie
# 保存到session中
# 在随机字符串的字典中设置相关内容
request.session['username'] = username # 上面的四件事情,这一句就做了
request.session['is_login'] = True
return redirect('/cookie/index1/')
else:
return render(request, 'cookie/login1.html')
# 服务端取得session
def index1(request):
if request.session.get('is_login', None) == True:
return HttpResponse('index1')
else:
return HttpResponse('you did not login')
我们可以看到Cookie中有一个sessionid,说明session依赖于cookie:
操作session比操作cookie简单多了,因为django已经帮我们做了很多事情。
session的操作:
request.session['key'] = value # 设置
request.session.get('key', None) # 取得session
request.session.setdefault('k1', 123) # 存在则不设置
del request.session['key'] # 删除session
# 所有的键、值、键值对
request.session.keys()
request.session.values()
request.session.items() # 键值对
request.session.iterkeys()
# 用户session的随机字符串
reques.session.session_key
# 将所有session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查 用户session的随机字符串 在数据库中是否存在
request.session.exists("session_key")
# 删除session
1. request.session.delete("session_key") # 删除此用户所有session
2.del request.session['k1'] # 删除session中的k1对应的item
3.request.session.clear() # 效果和1相同,不过更加简单。在注销的时候使用。
# 设置失效时间
request.session.set_expiry(value)
如果value是个证书,session会在这些秒数之后失效。
如果value是个datatime或者timedelta,session就会在这个时间后失效
如果value是0,那么用户关闭浏览器session就会失效
如果value是None,session会依赖全局session失效策略
eg:
request.session.set_expiry(60*60) # 设置保存一个小时
模板中使用session:
可以有2种方式,第一是views.py传递过来,第二是从request.session中取出
welcome {{ username }}!
{{ request.session.username }}
session与cookie
在settings.py
中的配置:
这些是默认值,配置文件中没有写的话,就默认是这些。
但是注意,一般会将:
SESSION_SAVE_EVERY_REQUEST = True
每次请求,都会向后推迟过期时间。
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 这个是默认的配置,说明将session存于数据库
如果你想要将session放到缓存中,只需要改为:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名,也可以是memcache
有三种缓存的方式:
1)数据库db
2)缓存 memcache
3)文件级别 file
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = os.path.join(BASE_DIR, 'cache') # 在根目录新建一个cache目录
4)缓存+数据库Session
django内部不支持redis,只支持MemcachedCache.
经验
1.注意:
session存在于服务器里面,前端是获取不到的。