nitrome官网,网王之暗夜王者,穿越千年梦之欢颜
目录
http协议 是无状态的,每次请求连接都是不保存客户端状态的,cookie就是用来保存客户端状态的。试想一下,如果每次登录一个网站,每次跳转页面都不会记录我的信息,都要求重新输入密码,是不是很不爽?
cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。 简单来说,就是保存在客户端浏览器的键值对。
当你登录一个网站后,服务端会把你的用户名、密码等信息发到你的浏览器上保存起来,下次再访问请求的时候,浏览器会自动带上这些cookie,服务器就会认识。
上述的cookie本身保存在客户端,容易被拦截,不是很安全,所以就有了session。 浏览器登录网站成功后,服务器会根据某种算法生成一个随机字符串,发给浏览器,浏览器保存在本地。服务器记录了随机字符串与用户信息的对应关系,之后浏览器 再来访问,就带着字符串就来了,然后服务器识别这个字符串比对 对应关系,如果有这个关系,就知道是你来了。
session虽然相对安全,数据保存在服务端,一个用户保存一份,多个用户保存多份,一旦用户量非常大,会占用服务端大量的资源,占用服务器硬盘空间。
所以就有了token,先提前规定好加密算法。当用户来的时候,比如说username,就会用加密算法对username生成一个随机字符串,然后把username+随机字符串发送给浏览器保存。当这个用户再来的时候,服务器会拿到username再去用加密算法加密,得到的随机字符串与保存在浏览器本地的字符串做比对,判断是否是合法用户。
obj = httpresponse() # 利用obj对象才可以操作cookie return obj obj.set_cookie('k1', 'v1') # 告诉浏览器设置键值对
设置cookie过期时间:
obj.set_cookie('k1','v1',max_age=3) obj.set_cookie('k1','v1',expires=3) # expires参数 是为ie浏览器准备用的
cookie超时时间是以秒 作为单位的
一些参数:
request.cookies.get('k1') # 获取浏览器携带的cookie值
简单的测试:
from django.shortcuts import render, httpresponse, redirect # create your views here. def login(request): if request.method == 'post': username = request.post.get('username') password = request.post.get('password') if username == 'cwz' and password =='123': obj = redirect('/home/') obj.set_cookie('whoami', 'cwz') return obj return render(request, 'login.html') def home(request): if request.cookies.get('whoami'): return httpresponse('只有登录成功才能到这儿') return redirect('/login/')
用delete_cookie
def logout(request): obj = redirect('/login/') obj.delete_cookie('whoami') return obj
request.get_full_path() # 获取用户输入的url request.path_info # 获取用户输入的url
from django.shortcuts import render, httpresponse, redirect # create your views here. def login(request): if request.method == 'post': username = request.post.get('username') password = request.post.get('password') if username == 'cwz' and password == '123': old_path = request.get.get('next') if old_path: obj = redirect(old_path) else: obj = redirect('/home/') obj.set_cookie('whoami', 'cwz') return obj return render(request, 'login.html') from functools import wraps def auth_login(func): @wraps(func) def inner(request, *args, **kwargs): res = func(request, *args, **kwargs) if request.cookies.get('whoami'): # print(request.get_full_path()) # print(request.path_info) return res else: current_path = request.path_info return redirect('/login/?next=%s' % current_path) # 没有登录的用户,跳转到登录页面 return inner @auth_login def home(request): if request.cookies.get('whoami'): return httpresponse('只有登录成功才能到这儿') return redirect('/login/') @auth_login def index(request): return httpresponse('index页面,登录之后才能访问') @auth_login def reg(request): return httpresponse('reg页面,登录之后才能访问') @auth_login def logout(request): obj = redirect('/login/') obj.delete_cookie('whoami') return obj
# 获取、设置、删除session中数据 request.session['k1'] request.session.get('k1',none) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 del request.session['k1'] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 会话session的key request.session.session_key # 将所有session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查会话session的key在数据库中是否存在 request.session.exists("session_key") # 删除当前会话的所有session数据 request.session.delete() # 删除当前的会话数据并删除会话的cookie。 request.session.flush() 这用于确保前面的会话数据不可以再次被用户的浏览器访问 例如,django.contrib.auth.logout() 函数中就会调用它。 # 设置会话session和cookie的超时时间 request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是none,session会依赖全局session失效策略。
注意事项:
由于session是保存在服务器数据库的,所以django在操作session时要先执行数据库迁移命令, 生成django_session表
django 默认的session失效时间是14天
request.session['k1'] = 'v1'
def get_session(request): res = request.session.get('k1') print(res) return httpresponse('获取成功')
django内部处理的事情
request.session.delete() # 客户端与服务端的session都会删除 request.session.flush() # 建议使用
删除session只会根据浏览器的不同删出对应的数据
request.session.set_expiry(value) # 如果value是个整数,session会在些秒数后失效。 # 如果value是个datatime或timedelta,session就会在这个时间后失效。 # 如果value是0,用户关闭浏览器session就会失效。 # 如果value是none,session会依赖全局session失效策略。
django中默认支持session,其内部提供了5种类型的session。
1. 数据库session session_engine = 'django.contrib.sessions.backends.db' # 引擎(默认) 2. 缓存session session_engine = 'django.contrib.sessions.backends.cache' # 引擎 session_cache_alias = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 3. 文件session session_engine = 'django.contrib.sessions.backends.file' # 引擎 session_file_path = none # 缓存文件路径,如果为none,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存+数据库 session_engine = 'django.contrib.sessions.backends.cached_db' # 引擎 5. 加密cookie session session_engine = 'django.contrib.sessions.backends.signed_cookies' # 引擎 其他公用设置项: session_cookie_name = "sessionid" # session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) session_cookie_path = "/" # session的cookie保存的路径(默认) session_cookie_domain = none # session的cookie保存的域名(默认) session_cookie_secure = false # 是否https传输cookie(默认) session_cookie_httponly = true # 是否session的cookie只支持http传输(默认) session_cookie_age = 1209600 # session的cookie失效日期(2周)(默认) session_expire_at_browser_close = false # 是否关闭浏览器使得session过期(默认) session_save_every_request = false # 是否每次请求都保存session,默认修改之后才保存(默认) django中session相关设置
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
新手学习Python2和Python3中print不同的用法
Python基于os.environ从windows获取环境变量
网友评论