天天看点

Python学习---Django拾遗180328

Python学习---Django拾遗

前台发送URL请求到Django的中间件进行内容校验,完成校验后到达路由映射文件url.py,然后调用视图函数views.py里面的函数进行内容处理【 1.操作数据库进行数据读写  2. 调用前台的模版内容】最后返回字符串给前台进行页面的渲染【这里回去的时候也会经过中间件】。

<b> </b>

Django中间件类似于Java框架中的拦截器之类的东西,就是在请求到达我们要操作的函数之前添加的一些判断之类的操作。

应用场景: 适用于全局的操作,对所有的用户请求/用户返回数据都需要处理的情况。process_request适用于请求到达之前已经执行的操作,类似防护的操作[例如,csrf中间件,过滤器,自定义请求头];

Django中间件即类中的方法执行顺序是Django固定的,不能更改执行顺序,函数名称也不能更改【如果自定义了MiddlewareMixin的话,可以不使用固定的名称】

注:这里的函数是不需要全部写的,也就是process_request和process_response可有可无

Python学习---Django拾遗180328

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

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

中间件实例

创建中间件路径【文件夹+文件】

Python学习---Django拾遗180328

settings.py

urls.py

views.py

plugin/handler.py

templates/XXX.html

    无

页面显示;

正常访问执行顺序:

Python学习---Django拾遗180328

中间件request请求中返回response效果:

Python学习---Django拾遗180328
Python学习---Django拾遗180328

另外其他的函数执行效果:

Python学习---Django拾遗180328

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

settings.py里面如果未注释掉CSRF验证【即需要CSRF验证】

我们的get请求可以通过,post请求会被拦截

Python学习---Django拾遗180328

Django里面使用form的post请求发送数据的时候,一定是return了一个render对象,且HTML的form表单内使用了{% csrf_token %}进行标记,此时前台的HTML里面会多出一行csrf的token同时会缓存一份到Cookie里面。同理,如果我们需要ajax发送post请求的时候,是需要从Cookie里面获取token[从截图可以看到Cookie里面token的key是csrftoken]并添加到请求头[request-header]里让Django进行验证的。

Python学习---Django拾遗180328
Python学习---Django拾遗180328

Ajax请求CSRF实例

templates/login.html

PS: 获取request里面的请求信息,可以使用断点打印,我们可以看出我们request里的header经过Django处理后在Meta里面呢,且字段名前添加了HTTP的前缀。

Python学习---Django拾遗180328
Python学习---Django拾遗180328

其他

Python学习---Django拾遗180328

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

缓存适用于固定内容且访问量大,大型文件内容,不具有实时性的内容。

Django中提供了6种缓存方式:

开发调试 --&gt;  什么都不干 内存 文件 数据库 Memcache缓存(python-memcached模块)   --&gt;在另外一台服务器上 Memcache缓存(pylibmc模块)

配置:

开发调试

内存:

文件:

数据库:

Memcache缓存(python-memcached模块)

Memcache可以理解为另外一个服务器的内存,是内存级别的缓存;

内容以Key-Value形式存储,整体的Memcache就是一个大字典

注:memache中如果有服务器故障,因为memacahe里面没有检测机制,只能自己监控该模块,更改模块里面的接口方法处理

Django中提供了3种缓存方式:

全栈使用缓存 单独视图缓存 局部视图使用

A. 全栈使用的配置

Python学习---Django拾遗180328

B.单独视图缓存

C.局部视图缓存

Html文件内写

单独视图和局部视图实例

templates/part.html

文件缓存之单独视图缓存 :

Python学习---Django拾遗180328

文件缓存之局部视图缓存 :

Python学习---Django拾遗180328

全栈使用实例

其余同部分的单独的使用...

Python学习---Django拾遗180328

全栈中间件代码分析:

from django.middleware.cache import FetchFromCacheMiddleware

Python学习---Django拾遗180328

from django.middleware.cache import UpdateCacheMiddleware

Python学习---Django拾遗180328

bootStrap 一个集成css,js的文件