码迷,mamicode.com
首页 > 编程语言 > 详细

python学习day——22

时间:2017-11-11 18:59:09      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:char   key   check   body   ons   内存缓存   header   display   mem   

django之路_day5

session(使用session前一定要先python manage.py makemigration+migrate)

基于cookie做用户验证的时候,敏感的信息不适合放在cookie中,所以引出session

a.session原理

  • cookie是保存在用户浏览器端的键值对
  • session是保存在服务器端的键值对,session是基于cookie做的

session相当于内存中的一个大字典

session = {
	随机字符串1 : {‘username‘:‘alex1‘,‘pwd‘:‘123‘,...}
	随机字符串2 : {‘username‘:‘alex2‘,‘pwd‘:‘1234‘,...}
	...
}

1.生成随机字符串
2.写到用户浏览器的cookie中
3.保存到session中
4.在对应字典中设置相关内容(私密信息)

实际上Django就是做的以上的操作

设置session

技术分享

获取session

技术分享

技术分享
 1 def login(request):
 2     if request.method == GET:
 3         return render(request,login.html)
 4 
 5     elif request.method == POST:
 6         u = request.POST.get(user)
 7         p = request.POST.get(pwd)
 8         if u == root and p == 123:
 9             request.session[username] = u
10             request.session[is_login] = True
11             if request.POST.get(rmb,None) == 1:
12                 print(123)
13                 request.session.set_expiry(2)
14 
15             return redirect(/index/)
16         else:
17             return redirect("/login/")
18 
19 def index(request):
20     if request.session[is_login]:
21         return HttpResponse(OK)
22     else:
23         return HttpResponse()
设置+获取session

b.session的使用

# 获取Session中数据
request.session[‘k1‘]
request.session.get(‘k1‘,None) ***

# 设置Session中数据
request.session[‘k1‘] = 123
request.session.setdefault(‘k1‘,123) # 存在则不设置

# 删除Session中数据
del request.session[‘k1‘]	#只删除k1内的
request.session.clear()		#清除session中所有的数据 

# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()	#返回一个迭代器,不可以print,数据量大的时候for循环效率高
request.session.itervalues()
request.session.iteritems()

********** 知道就行 **********

# 用户session的随机字符串
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")

# 删除当前用户的所有Session数据
request.session.delete("session_key")


********** 重点 **********

# 设置服务器+浏览器端的超时时间
# 可以加个判断条件对某一个人设置超时时间

request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。

示例

技术分享
 1 views.py
 2 
 3 def login(request):
 4     if request.method == GET:
 5         return render(request,login.html)
 6 
 7     elif request.method == POST:
 8         u = request.POST.get(user)
 9         p = request.POST.get(pwd)
10         if u == root and p == 123:
11             request.session[username] = u
12             request.session[is_login] = True
13             if request.POST.get(rmb,None) == 1:
14                 print(123)
15                 request.session.set_expiry(2)   #将服务器和浏览器的超时时间都设置成2s
16 
17             return redirect(/index/)
18         else:
19             return redirect("/login/")
20 
21 def index(request):
22     if request.session.get(is_login,None):
23         return HttpResponse(OK)
24     else:
25         return HttpResponse()
26 
27 
28 login.html
29 
30 <!DOCTYPE html>
31 <html lang="en">
32 <head>
33     <meta charset="UTF-8">
34     <title>Title</title>
35 </head>
36 <body>
37     <form action="/login/" method="post">
38         <input type="text" name="user" />
39         <input type="text" name="pwd" />
40         <input type="checkbox" name="rmb" value="1"/>2s免登陆
41         <input type="submit" value="提交" />
42         <input id=btn1 type="button" value="ajax" />
43     </form>
44 
45 </body>
46 </html>
View Code

c.配置(settings)文件中设置默认操作(通用配置):

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(默认不是https传输)

SESSION_COOKIE_HTTPONLY = True               
# 是否Session的cookie只支持http传输(默认是http传输)

SESSION_COOKIE_AGE = 1209600                 
# Session的cookie失效日期(默认超时时间是两周)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False      
# 是否关闭浏览器使得Session过期(如果为True就是不帮我们写超时时间)(默认)

SESSION_SAVE_EVERY_REQUEST = False           
# 是否每次请求都保存Session,默认修改之后才保存(默认设置10s,10s就退出,改为True就按最后一次操作时间计时)

 d.引擎的配置

a.数据库Session(默认)
	SESSION_ENGINESESSION_ENGINE = ‘django.contrib.sessions.backends.db‘   # 引擎(默认)
	# Django默认是将Session数据存储在数据库中,即:django_session 表中。

b.缓存Session
	SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘  # 引擎
    SESSION_CACHE_ALIAS = ‘default‘     # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

	配置memcache:
	CACHES = {
        ‘default‘: {
            ‘BACKEND‘: ‘django.core.cache.backends.dummy.DummyCache‘,     # 引擎
            ‘TIMEOUT‘: 300,                                               # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
            ‘OPTIONS‘:{
                ‘MAX_ENTRIES‘: 300,                                       # 最大缓存个数(默认300)
                ‘CULL_FREQUENCY‘: 3,                                      # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            },
            ‘KEY_PREFIX‘: ‘‘,                                             # 缓存key的前缀(默认空)
            ‘VERSION‘: 1,                                                 # 缓存key的版本(默认1)
            ‘KEY_FUNCTION‘ 函数名                                          # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
        }
    }
	
c.文件Session
	SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘    # 引擎
    SESSION_FILE_PATH = None        # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir

d.缓存+数据库Session
	SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db‘        # 引擎
 
e.加密cookie Session(我觉得和盐加密cookie没啥区别)
	SESSION_ENGINE = ‘django.contrib.sessions.backends.signed_cookies‘   # 引擎

CSRF

a.简介

  django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局:
  中间件 django.middleware.csrf.CsrfViewMiddleware

局部:
	from django.views.decorators.csrf import csrf_exempt,csrf_protect

	@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
	@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

b.form表单提交 / ajax提交

技术分享

技术分享
 1 login.html
 2 
 3 <!DOCTYPE html>
 4 <html lang="en">
 5 <head>
 6     <meta charset="UTF-8">
 7     <title>Title</title>
 8 </head>
 9 <body>
10     <form action="/login/" method="post">
11         {% csrf_token %}
12         <input type="text" name="user" />
13         <input type="text" name="pwd" />
14         <input type="checkbox" name="rmb" value="1"/>2s免登陆
15         <input type="submit" value="提交" />
16         <input id=btn1 type="button" value="ajax" />
17     </form>
18 
19     <script src="/static/jquery-1.12.4.js"></script>
20     <script src="/static/jquery.cookie.js"></script>
21     <script>
22 
23         $.ajaxSetup({
24             beforeSend:function (xhr,settings) {
25                 xhr.setRequestHeader(X-CSRFtoken,$.cookie(csrftoken));
26             }
27         });
28 
29         $(#btn1).click(function () {
30             $.ajax({
31                 url:/login/,
32                 type:POST,
33                 data:{user:root,pwd:123},
34 {#                headers:{‘X-CSRFtoken‘:$.cookie(‘csrftoken‘)},#}
35                 sucess:function (data) {
36 
37                 }
38             })
39         })
40 
41     </script>
42 </body>
43 </html>
44 
45 views
46 
47 def login(request):
48     if request.method == GET:
49         return render(request,login.html)
50 
51     elif request.method == POST:
52         u = request.POST.get(user)
53         p = request.POST.get(pwd)
54         if u == root and p == 123:
55             request.session[username] = u
56             request.session[is_login] = True
57             if request.POST.get(rmb,None) == 1:
58                 print(123)
59                 request.session.set_expiry(2)   #将服务器和浏览器的超时时间都设置成2s
60 
61             return redirect(/index/)
62         else:
63             return redirect("/login/")
64 
65 def index(request):
66     if request.session.get(is_login,None):
67         return HttpResponse(OK)
68     else:
69         return HttpResponse()
View Code

 

python学习day——22

标签:char   key   check   body   ons   内存缓存   header   display   mem   

原文地址:http://www.cnblogs.com/x54256/p/7819564.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!