django之forms提交

  session缓存

  基于Cookie做用户验证时,敏感信息不适合放在cookie中,session原理:cookie是保存在用户游览器端的键值对,Session是保存在服务器端的键值对;

  django中默认支持Session,其内部提供5种类型Session供开发者使用(redis需自行安装插件):

  • 数据库(默认)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

  1、数据库Session

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
 
a. 配置 settings.py
 
     SESSION_ENGINE  =  'django.contrib.sessions.backends.db'    # 引擎(默认)
     
     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,默认修改之后才保存(默认)
 
 
 
b. 使用
 
     def  index(request):
         # 获取、设置、删除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的随机字符串
         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失效策略。

 

  2、缓存Session

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
a. 配置 settings.py
 
     SESSION_ENGINE  =  'django.contrib.sessions.backends.cache'   # 引擎
     SESSION_CACHE_ALIAS  =  'default'                             # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
 
 
     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,默认修改之后才保存
 
 
 
b. 使用
 
     同上

 

3、文件Session

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
a. 配置 settings.py
 
     SESSION_ENGINE  =  'django.contrib.sessions.backends.file'     # 引擎
     SESSION_FILE_PATH  =  None                                     # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
 
 
     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,默认修改之后才保存
 
b. 使用
 
     同上

 

4、缓存+数据库Session

 

1
2
3
4
5
6
7
8
9
数据库用于做持久化,缓存用于提高效率
 
a. 配置 settings.py
 
     SESSION_ENGINE  =  'django.contrib.sessions.backends.cached_db'         # 引擎
 
b. 使用
 
     同上

 

5、加密cookie Session

 

1
2
3
4
5
6
7
a. 配置 settings.py
     
     SESSION_ENGINE  =  'django.contrib.sessions.backends.signed_cookies'    # 引擎
 
b. 使用
 
     同上

 

更多参考:猛击这里 和 猛击这里

 

扩展:Session用户验证

 

1
2
3
4
5
6
7
def  login(func):
     def  wrap(request,  * args,  * * kwargs):
         # 如果未登陆,跳转到指定页面
         if  request.path  = =  '/test/' :
             return  redirect( 'http://www.baidu.com' )
         return  func(request,  * args,  * * kwargs)
     return  wrap

 

CSRF(跨站请求伪造)

一、简介

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

全局:

  中间件 django.middleware.csrf.CsrfViewMiddleware

局部:

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

注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

1、from提交

    <form action="/login/" method="POST">
        {% csrf_token %}
        <input type="text" name="user" />
        <input type="password" name="pwd"/>
        <input type="submit" value="提交"/>
    </form>

2、ajax提交(多)

<body>
    <form action="/login/" method="POST">
        {% csrf_token %}
        <input type="text" name="user" />
        <input type="password" name="pwd"/>
        <input type="submit" value="提交"/>
        <input id="btn1" type="button" value="ajax提交">
        <input id="btn2" type="button" value="ajax提交">
    </form>
    <script src="/static/jquery-1.12.4.js"></script>
    <script src="/static/jquery.cookie.js"></script>
    <script>
        $(function(){
            $.ajaxSetup({
                beforeSend:function(xhr,setting){
                    xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'));
                }
            })
        });
        $('#btn1').click(function() {
            $.ajax({
                url: '/login/',
                type: 'POST',
                data: {'user': 'root', 'pwd': '123'},
                //headers: {'X-CSRFtoken': $.cookie('csrftoken')},
                success: function(arg){
                    
                }
            })
        })
        $('#btn2').click(function() {
            $.ajax({
                url: '/login/',
                type: 'POST',
                data: {'user': 'root', 'pwd': '123'},
                //headers: {'X-CSRFtoken': $.cookie('csrftoken')},
                success: function(arg){
                    
                }
            })
        })
    </script>
</body>

3、ajax提交

<body>
    <form action="/login/" method="POST">
        {% csrf_token %}
        <input type="text" name="user" />
        <input type="password" name="pwd"/>
        <input type="submit" value="提交"/>
        <input id="btn" type="button" value="ajax提交">
    </form>
    <script src="/static/jquery-1.12.4.js"></script>
    <script src="/static/jquery.cookie.js"></script>
    <script>

        $('#btn').click(function() {
            $.ajax({
                url: '/login/',
                type: 'POST',
                data: {'user': 'root', 'pwd': '123'},
                headers: {'X-CSRFtoken': $.cookie('csrftoken')},
                success: function(arg){

                }
            })
        })
    </script>
</body>

4、请求(GET/HEAD/OPTIONS/TRACE)

<!DOCTYPE html>
<html>
<head lang = "en" >
     <meta charset = "UTF-8" >
     <title>< / title>
< / head>
<body>
     { %  csrf_token  % }
  
     < input  type = "button"  onclick = "Do();"   value = "Do it" / >
  
     <script src = "/static/plugin/jquery/jquery-1.8.0.js" >< / script>
     <script src = "/static/plugin/jquery/jquery.cookie.js" >< / script>
     <script  type = "text/javascript" >
         var csrftoken  =  $.cookie( 'csrftoken' );
  
         function csrfSafeMethod(method) {
             / /  these HTTP methods do  not  require CSRF protection
             return  ( / ^(GET|HEAD|OPTIONS|TRACE)$ / .test(method));
         }
         $.ajaxSetup({
             beforeSend: function(xhr, settings) {
                 if  (!csrfSafeMethod(settings. type ) && !this.crossDomain) {
                     xhr.setRequestHeader( "X-CSRFToken" , csrftoken);
                 }
             }
         });
         function Do(){
  
             $.ajax({
                 url: "/app01/test/" ,
                 data:{ id : 1 },
                 type : 'POST' ,
                 success:function(data){
                     console.log(data);
                 }
             });
  
         }
     < / script>
< / body>
< / html>

更多:https://docs.djangoproject.com/en/dev/ref/csrf/#ajax

 

转载于:https://www.cnblogs.com/patrick0715/p/6366233.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值