Django进阶(路由系统、中间件、缓存、Cookie和Session

路由系统

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‘)

 效果:

 

上传成功

时间: 2024-10-03 15:01:28

Django进阶(路由系统、中间件、缓存、Cookie和Session的相关文章

Django进阶-路由系统

概述 URL配置就像Django所支撑网站的目录 本质:URL与视图函数的映射表 Django2.0 from django.urls import path url 换成了 path 基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 正则表达式: 一个正则表达式字符串 views视图函数: 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串 参数: 可选的要传递

Django之 路由系统

Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码. 基本格式 ''' urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 参数说明: 一个正则表达式字符串 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串 可选的要传递给视图函数的默认参数(字典形式) 一个

Django 的 路由系统

Django 的路由系统 URL 配置(URLconf)就像Django 锁支撑网站的目录. 它的本质就是URL 与要为该URL 调用的视图函数之间的映射表. 你就是以这种方式告诉Django, 对于这个URL 调用这段代码,  对于那个URL 调用那段代码. URLconf配置 基本格式: from django.conf.urls import url urlpatterns= [ url(正则表达式,views视图函数, 参数, 别名) ] 注意: Django 2.0版本中的路由已经替换

Django - - 基础 - - Django的路由系统

模板 Django的路由系统 URLconf配置 正则表达式详解 分组命名匹配 传递额外的参数给视图函数(了解) 命名URL和URL反向解析 命名空间模式 1, Django的路由系统 Django 1.11版本 URLConf官方文档:https://docs.djangoproject.com/en/1.11/topics/http/urls/ URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 1.1 URLconf配

python 之 Django框架(路由系统、include、命名URL和URL反向解析、命名空间模式)

12.36 Django的路由系统 基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] ? 正则表达式: 一个正则表达式字符串 views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串 参数: 可选的要传递给视图函数的默认参数(字典形式) 别名: 一个可选的name参数 12.361 路由正则表达式 from django.conf.urls imp

django的路由系统

在django生成的工程项目文件中urls.py文件用于指定路由信息 该文件默认导入以下模块 from confimport from import admin from confimport url,include 默认包含一个路由信息 r'^admin/'site.urls), 一个工程至少要包含一个app,而django中的mtv模式,view层相当于视图控制层,即相当于mvc中的controller,template相当于视图层,model层为数据处理层,当请求到达时将到时达指定的vie

Django之路由系统

前言: Django的工作流程 1.客户端发送请求到达 URL 2.路由系统 把客户端请求转发给请求函数 3.视图函数 使用原生SQL或者ORM去数据库拿到数据进行渲染(模板+数据渲染)4.return 返回给客户端 Django project目录中的urls.py文件中 记录了 可以访问到该站点的url 和 视图函数的对应关系,神似路由器中的路由表,顾淫王赐名----->路由系统; 本文主要介绍 Django路由系统(此乃淫王 赐名,暂且这样称呼!) 一.普通路由系统 1个URL对应1个视图

Django的Form、CSRF、cookie和session

Django是一个大而全的web框架,为我们提供了很多实用的功能,本文主要介绍Form.CSRF.cookie和session 一.Form 在web页面中form表单是重要的组成部分,为了数据安全和减少后台服务器的压力,通常我们在前端会对form表单进行数据合法性验证,但即使这样,后台的数据验证依然是必须不可省略的,原因很简单前端数据可以被伪造或js直接被禁用. Django内置了一个强大的Form功能,帮我们快速自定义后台数据验证,它的形式非常类似model类的定义方法,并且两者也具有内在联

Django之Form、CSRF、cookie和session

Django是一个大而全的web框架,为我们提供了很多实用的功能,本文主要介绍Form.CSRF.cookie和session 一.Form 在web页面中form表单是重要的组成部分,为了数据安全和减少后台服务器的压力,通常我们在前端会对form表单进行数据合法性验证,但即使这样,后台的数据验证依然是必须不可省略的,原因很简单前端数据可以被伪造或js直接被禁用. Django内置了一个强大的Form功能,帮我们快速自定义后台数据验证,它的形式非常类似model类的定义方法,并且两者也具有内在联

(进阶篇)浅谈COOKIE和SESSION关系和区别

COOKIE介绍 cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 PHP,您能够创建并取回 cookie 的值. 1.设置Cookie PHP用SetCookie函数来设置Cookie. SetCookie函数定义了一个Cookie,并且把它附加在HTTP头的后面,SetCookie函数的原型如下: int SetCookie(string name, string value, int exp