• Django进阶(路由系统、中间件、缓存、Cookie和Session、Ajax发送数据


    路由系统

    1、每个路由规则对应一个view中的函数

    url(r'^index/(d*)', views.index),
    url(r'^manage/(?P<name>w*)/(?P<id>d*)', views.manage),
    url(r'^manage/(?P<name>w*)', views.manage,{'id':333}),
    

    2、根据app对路由规则进行一次分类

    rl(r'^web/',include('web.urls')),
    

      



    1、每个路由规则对应一个view中的函数


     

    2、根据app对路由规则进行一次分类


    django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。
    通过反射机制,可以为django开发一套动态的路由系统Demo
     
     
     
    中间件

    django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

    在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图。

     

    中间件中可以定义四个方法,分别是:

    • process_request(self,request)
    • process_view(self, request, callback, callback_args, callback_kwargs)
    • process_exception(self, request, exception)
    • process_response(self, request, response)

    自定义中间件

    1、创建中间件类

    2、注册中间件

    3、执行顺序
    4、view出错,时执行
    process_exception(self, request, exception)
     
     




    缓存

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者Redis中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回,

     
    一、配置 settings.py
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CACHES = {
        'default': {
            'BACKEND''django.core.cache.backends.filebased.FileBasedCache',
            'LOCATION': os.path.join(BASE_DIR, 'cache'),
            'TIMEOUT'600,
            'OPTIONS': {
                'MAX_ENTRIES'1000
            }
        }
    } 
     
     
    2、应用,已装饰器的方式调用
     
    3、缓存
    第一次刷新页面后,会得到一个用户存放缓存文件的文件夹
     15分钟内,再次刷新页面,都会从缓存文件中读取内容,页面不会再有变化。
     

    更多参考资料:

      https://docs.djangoproject.com/en/1.9/topics/cache/
      http://djangobook.py3k.cn/2.0/chapter15/

    Cookie和Session

    一、操作Cookie

      获取cookie:request.COOKIES[key]

      设置cookie:response.set_cookie(key,value)

    由于cookie保存在客户端的电脑上,所以,jquery也可以操作cookie。

    <script src='/static/js/jquery.cookie.js'></script>
    $.cookie("list_pager_num", 30,{ path: '/' });
    

      

    cookie保存时间

    cookie默认在浏览器中保存 1209600秒,

    设置cookie保存时间,在setting.py    

     SESSION_COOKIE_AGE = 10秒

        

    关闭即失效

        设置后,关闭浏览器,cookie即失效
        SESSION_EXPIRE_AT_BROWSER_CLOSE = False

    二、操作Session

      获取session:request.session[key]

      设置session:reqeust.session[key] = value

      删除session:del request[key]

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

      

    通过session来持久登陆
    准备工作:
        1、注释
           #'django.middleware.csrf.CsrfViewMiddleware',
        2、创建并同步数据库
       python manage.py makemigrations
            python manage.py migrate
    测试页面
    直接访问 home页,会被跳转到login页面
    用户登陆及退出登陆了状态
    不同用户返回不同页面,标记用户名,并且可以注销登陆状态
     
     
     
    Ajax发送数据
    Ajax发送简单数据类型数据
    <body>
            <table border="1">
                <thead>
                    <tr>
                        <th>主机</th><th>端口</th>
                    </tr>
                </thead>
                <tbody id="tb01">
                    <tr>
                        <td>10.0.0.1</td><td>22</td>
                    </tr>
                </tbody>
            </table>
            <input type="button" onclick="AjaxSubmit();" value="Ajax提交">
            <script src="/static/jquery-1.11.1.min.js"></script>
            <script>
                function AjaxSubmit(){
                    var host = '10.0.0.1'   {#通过js获取表格中的数据#}
                    var port = '22'
                    $.ajax({
                        url:'/ajax_data/',
                        type:'POST',
                        data:{h:host,p:port},
                        success:function(arg){}
                    });
                };
            </script>
    </body>

    成功接收到ajax提交的数据

    Ajax发送复杂数据类型(数组、字典)
    def index(request):
        return render(request,'index.html')
    
    import json
    def ajax_data(request):
        ret = {'status':True,'error':''}
        try:
            print request.POST
        except Exception,e: #异常处理
            ret['status'] = False
            ret['error'] = str(e)
        return HttpResponse(json.dumps(ret))
        #默认只能发送字符串,用json把字典转换成字符穿
    <script>
        function AjaxSubmit(){
            var user_list = [
                {'username':'yangmv','age':18},
                {'username':'wj','age':28},
            ]
            $.ajax({
                url:'/ajax_data/',
                type:'POST',
                tradition:true, {#对数据原生处理,不做加工#}
                data:{data:JSON.stringify(user_list)}, {#以字符串的方式#}
                success:function(arg){
                    //json.loads
                    var callback_dict = $.parseJSON(arg); {#把返回的数据json.load成字典#}
                    if(callback_dict.status){
                        alert('成功');
                    }else{
                        alert(callback_dict.error);
                    }
                }
            });
        };
    </script>
    

    成功获取到字典数据。并返回执行结果

      

      

     
     
     
     
     
     
     
    Django上传文件的实例:
    <body>
        <p>上传实例</p>
        <form action="/upload/" method="POST" enctype="multipart/form-data">
            <p><input type="file" name="f1" /></p>
            <p><input type="text" name="hostname" /></p>
            <input type="submit" value="提交" />
        </form>
    </body>
    
    #enctype="multipart/form-data" 是指分片上传
     
    def upload(request):
        if request.method == "POST":
            #inp_post = request.POST #捕获提交来的数据
            inp_file = request.FILES #捕获提交来的文件数据
            get_file = inp_file.get('f1')
            #print get_file.name     #获取上传文件的文件名
            #print get_file.size     #获取上传文件的大小
            f_obj = open(get_file.name,'wb')
            for line in get_file.chunks():
                f_obj.write(line)
            f_obj.close()
        return render(request,'home/upload.html')
    

     效果:

     

     
    上传成功
     
     
     
     
     
  • 相关阅读:
    关于一位程序员入门的面试经验
    Outpro的博客测试
    优先队列
    linux (centos 6.2)在输入查询或者操作命令时提示-bash: fork: cannot allocate memory
    win10下JDK环境变量
    Mac OS如何安装IDEA
    解决下载github代码慢的问题
    vue 模板语法之指令
    vue的基本介绍以及第一个程序
    消息中间的几大应用场景
  • 原文地址:https://www.cnblogs.com/yangmv/p/5327303.html
Copyright © 2020-2023  润新知