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)
View Code
删除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: '/' });
View Code
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:
View Code
删除session
1 request.session.flush()  
2 删除当前的会话数据并删除会话的Cookie。这用于确保前面的会话数据不可以再次被用户的浏览器访问
3 例如,django.contrib.auth.logout() 函数中就会调用它。
View Code
其他关于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失效策略。
View Code
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        
View Code
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,默认修改之后才保存
View Code
 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 ]   
session登陆实例

 

 

 

posted @ 2018-05-05 23:03  健林  阅读(110)  评论(0)    收藏  举报