Django组件之cookie和session
Django组件之cookie和session
cookie
本质为在浏览器端保存的键值对,由服务端写在浏览器端,以后每次请求的时候,浏览器都携带着cookie来访问,cookies的使用之处非常多,比如用户验证,登陆界面,右侧菜单隐藏,控制页面列表显示条数等,已经后面的session都是基于cookie的。cookie从设置方面来说可以由tronado和前端js设置。
在Django中获取cookie的方式
1 request.COOKIES.get("islogin",None) #如果有就获取,没有就默认为none
设置cookie的方式
1 obj = redirect("/index/") 2 obj.set_cookie("islogin",True) #设置cookie值,注意这里的参数,一个是键,一个是值 3 obj.set_cookie("haiyan","344",20) #20代表过期时间 4 obj.set_cookie("username", username)
删除cookie
1 obj.delete_cookie("cookie_key",path="/",domain=name)
注意:form表单的action走的路径还是/login/
第一次请求:url:http://127.0.0.1:8080/login get请求
第一次请求:url:http://127.0.0.1:8080/login post请求 user pasw
第一次请求:url:http://127.0.0.1:8080/index post请求 携带着cookie的了
所以在index页面中就会取到cookie,因为这是的index里面已经有cookie了
由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。
1 <script src='/static/js/jquery.cookie.js'></script> 2 $.cookie("list_pager_num", 30,{ path: '/' });
cookie存储到客户端
优点:数据存储在客户端。减轻服务端的压力,提高网站的性能
缺点:安全性不高,在客户端很容易被查看或破解用户会话信息
session
cookie保存单一键值对,如果需要保存其他内容,则需要写多个cookie,而每次请求的话都会发送所有的cookie这样的话,会造成网络拥堵,此外,cookies是保存在浏览器端,如果保存用户名密码的cookie也放在浏览器端的话,也不够安全,这样就引出了session,session是人为生成的。session也是基于cookie来做的,但是只在浏览器端生成一个cookie(随机字符串,sessionId,token),而在服务端也保存着这段cookie,此外服务端还根据这段cookie可以生成一个字典,字典里面就可以放置用户的其他信息,服务端将这段cookie(sessionId)写到浏览器端,以后浏览器端来访问的时候,服务端根据sessionId从其相应的字典里面获取相应的信息来做相应用户认证机制。session可以保存在全局变量里,放在数据库,文件里面,memcached radis但是不能放在局部变量里。
设置session
1 设置session值 2 request.session["session_name"]="admin" 3 获取session值 4 session_name = request.session("session_name") 5 删除session值 6 del request.session["session_name"] 删除一组键值对 7 request.session.flush() 删除一条记录 8 检测是否操作session值 9 if "session_name" is request.session:
删除session
1 request.session.flush() 2 删除当前的会话数据并删除会话的Cookie。这用于确保前面的会话数据不可以再次被用户的浏览器访问 3 例如,django.contrib.auth.logout() 函数中就会调用它。
其他关于session的操作
1 用户session的随机字符串 2 request.session.session_key 3 # 将所有Session失效日期小于当前日期的数据删除 4 request.session.clear_expired() 5 # 检查 用户session的随机字符串 在数据库中是否 6 request.session.exists("session_key") 7 # 删除当前用户的所有Session数据 8 request.session.delete("session_key") 9 request.session.set_expiry(value) 10 * 如果value是个整数,session会在些秒数后失效。 11 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 12 * 如果value是0,用户关闭浏览器session就会失效。 13 * 如果value是None,session会依赖全局session失效策略。
session在django中的实现原理
1 由于cookie会把所有的信息都保存在客户端,也就是浏览器上,这样会导致不安全,所以引用了session,但是只是单单的session也不好用,必须session和cookie配合这去用。 2 3 session会把信息保存在服务端。 4 5 session原理分析流程: 6 7 {"sessionID":"dfhasdjfhkjlcn4352kjdsfhkjsd"} 8 9 if post: 10 request.session["is_login"]=True 11 request.session["user"]=username 12 return redirect("/index/”) 13 14 Django会做三件事: 15 1、创建随机字符串。假如s="sdgsdfg4565dfgsdfgsdf" 16 2、 在django-session表中,添加一条记录 17 django-session有三个字段,分别是:session_key,session_data,expire_data 18 SQL: 语句: insert into django-session values (s,"{"IS_LOGON":True,"USER":egon}",12321) 19 3、给浏览器设置sessionID: obj.set_cookie("sessionID",s) 20 21 执行完之后重定向: 22 /home/ ----> {"sessionID":"fasdlkfjsakdl324ada2adhdjlka99"} 23 request.session.get("IS_LOGON",None) 24 在django-session表中,进行查询: 25 s=requset.COOKIE.get("sessionID") 26 select session-data from django-session where session-key=s
session流程图:
一个浏览器只能维护一条记录(一个人的信息),多个人时会被覆盖。
session的存储类型
1 1.Django默认是将session存储在数据库中的django_session表中: 2 配置 settings.py设置session存储 3 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 4 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) 5 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) 6 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) 7 SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) 8 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) 9 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认) 10 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) 11 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认) 12 13 14 2.将session存放在缓存数据库 15 配置 settings.py 16 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 17 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 18 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 19 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 20 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 21 SESSION_COOKIE_SECURE = False # 是否Https传输cookie 22 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 23 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) 24 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 25 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存 26 27 3.将session信息存放在文件中 28 配置 settings.py 29 SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 30 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 31 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 32 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 33 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 34 SESSION_COOKIE_SECURE = False # 是否Https传输cookie 35 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 36 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) 37 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 38 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
1 #view.py 2 def log_user(request): 3 username = request.POST.get('user') 4 passwd = request.POST.get('passwd') 5 print(username,passwd) 6 user = User.objects.filter(username=username).filter() 7 if request.method == 'GET': 8 return HttpResponse("404") 9 elif request.method == 'POST': 10 if user and passwd == user.values("passwd")[0]['passwd']: 11 msg = {"status":200,"msg":"登陆成功!"} 12 request.session['user_id'] = user[0].id 13 request.session['username'] = user[0].username 14 res = HttpResponse(json.dumps(msg)) 15 else: 16 msg = {"status":502,"msg":"登陆失败!"} 17 res = HttpResponse(json.dumps(msg)) 18 return res 19 20 def index(request): 21 if request.method == 'GET': 22 res = request.COOKIES.get('sessionid') #获取cookie 23 print(res) 24 if res: 25 return render(request,'index.html') 26 else: 27 # 没有cookie不准访问index 28 return redirect('/login/') 29 elif request.method == 'POST': 30 return HttpResponse("OK") 31 32 #url.py 33 urlpatterns = [ 34 # url(r'^admin/', admin.site.urls), 35 url(r'^login/', login), 36 url(r'^index/', log_user), 37 url(r'^api-img/', index), 38 39 ]


浙公网安备 33010602011771号