Django进阶

 内容简介:

  • cookie介绍
  • session介绍
  • 分页
  • CSRF
  • 中间件
  • 缓存
  • 信号
一、cookie介绍 1、cookie机制

,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。

由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。

  •  获取cookie
说明:request.COOKIES
request.COOKIES[]    
request.COOKIES.get() 
  • 设置cookie
=render(request,=redirect( ,value) response.set_signed_cookie(key,value,salt=,...) ===None,cookie失效时间戳(IE requires expires,so set it hasn path=,Cookie生效的路径,/===False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖
  • 带签名的cookie:设置时候加签,cookie内容是加密的
response.set_signed_cookie(,,salt=<span style="color: #008000;">#<span style="color: #008000;">从请求中获取cookie,salt参数要一致
request.get_signed_cookie(<span style="color: #800000;">'
<span style="color: #800000;">username
<span style="color: #800000;">'
,salt=<span style="color: #800000;">'
<span style="color: #800000;">adada
<span style="color: #800000;">'
)

  • 使用javascript操作cookie,前提不能设置httponly=True(使用js,需要下载引人jquery.cookie.js插件)
  • 示例代码一:使用cookies做用户认证
  • 示例代码二:基于Cookie实现定制显示数据条数(包含juery操作cookie)
    
    

模版代码:

视图代码:

基础篇中的django视图提到了,对于view函数中我们可以定义两种视图,一种是函数(FBV),一种是类(CBV)

所以对于认证的装饰器也有两种:

  • FBV
inner(reqeust,*args,**= reqeust.COOKIES.get( redirect( func(reqeust,**<span style="color: #008000;">#<span style="color: #008000;">装饰需要登录验证的函数
<span style="color: #000000;">@auth
<span style="color: #0000ff;">def
<span style="color: #000000;"> index(reqeust):
<span style="color: #0000ff;">return
render(reqeust,{<span style="color: #800000;">'
<span style="color: #800000;">current_user
<span style="color: #800000;">'
: v})

  • CBV
inner(reqeust,**<span style="color: #008000;">#<span style="color: #008000;">使用装饰器,方法有三种

<span style="color: #0000ff;">from django <span style="color: #0000ff;">import<span style="color: #000000;"> views
<span style="color: #0000ff;">from django.utils.decorators <span style="color: #0000ff;">import<span style="color: #000000;"> method_decorator

@method_decorator(auth,name=<span style="color: #800000;">'<span style="color: #800000;">dispatch<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;"> 第三种方法,name="dispatch",就是给dispatch方法加上此装饰器,作用在于在执行post、get方法之前就验证,避免在给post和get方法加装饰器
<span style="color: #0000ff;">class<span style="color: #000000;"> Order(views.View):

<span style="color: #008000;">#<span style="color: #008000;"> @method_decorator(auth) # 第二种方法,作用等同于等三种
<span style="color: #008000;">#<span style="color: #008000;"> def dispatch(self,request,kwargs):
<span style="color: #008000;">#<span style="color: #008000;"> return super(Order,self).dispatch(request,
kwargs)

<span style="color: #008000;">#<span style="color: #008000;"> @method_decorator(auth) # 第一种方法,作用可以用针对性,可以只给get方法加装饰器
<span style="color: #0000ff;">def<span style="color: #000000;"> get(self,reqeust):<span style="color: #0000ff;">return render(reqeust,{<span style="color: #800000;">'<span style="color: #800000;">current_user<span style="color: #800000;">'<span style="color: #000000;">: v})

<span style="color: #0000ff;">def<span style="color: #000000;"> post(self,{<span style="color: #800000;">'<span style="color: #800000;">current_user<span style="color: #800000;">': v})

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

<tr>
<td><span style="font-size: 16px;">二、session介绍</td>
</tr></table>

 1、session机制

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。,使用上比Cookie简单一些,相应的也

2、session工作原理

 3、Django中使用session

  • 基本操作
request.session[] request.session[]

<span style="color: #008000;">#<span style="color: #008000;">设置session
request.session[<span style="color: #800000;">'<span style="color: #800000;">k1<span style="color: #800000;">']=<span style="color: #800000;">'<span style="color: #800000;">wd<span style="color: #800000;">'<span style="color: #000000;">
request.session.setdefault(<span style="color: #800000;">'<span style="color: #800000;">key<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">value<span style="color: #800000;">') <span style="color: #008000;">#<span style="color: #008000;">存在则不设置

<span style="color: #008000;">#<span style="color: #008000;">删除某个session键值
<span style="color: #0000ff;">del request.session[<span style="color: #800000;">'<span style="color: #800000;">key<span style="color: #800000;">'<span style="color: #000000;">]

<span style="color: #008000;">#<span style="color: #008000;">循环session中的字典,与字典循环类似
request.session.keys() <span style="color: #008000;">#<span style="color: #008000;">所有的key
request.session.values() <span style="color: #008000;">#<span style="color: #008000;">所有的value
request.session.items() <span style="color: #008000;">#<span style="color: #008000;">k,v形式
request.session.iterkeys() <span style="color: #008000;">#<span style="color: #008000;">所有的key
request.session.itervalues() <span style="color: #008000;">#<span style="color: #008000;">所有的value
request.session.iteritems() <span style="color: #008000;">#<span style="color: #008000;">k,v形式

<span style="color: #008000;">#<span style="color: #008000;">获取用户session中的随机字符串
<span style="color: #000000;">request.session.session_key

<span style="color: #008000;">#<span style="color: #008000;">删除所有session失效日期小于当前日志的数据(删除同一用户制造的脏数据)
<span style="color: #000000;">request.session.clear_expired()

<span style="color: #008000;">#<span style="color: #008000;">删除当前用户的所有session数据(在用户退出登录时候使用)
request.session.delete(<span style="color: #800000;">'<span style="color: #800000;">用户随机字符串<span style="color: #800000;">')<span style="color: #008000;">#<span style="color: #008000;">使用比较麻烦,因为还的获取用户随机字符串
request.session.clear()<span style="color: #008000;">#<span style="color: #008000;">该方法会先获取用户的随机字符串,然后把其对应的所有数据删除,推荐注销(退出登录)时候使用<span style="color: #008000;">

<span style="color: #008000;">设置seesion失效时间

<span style="color: #000000;">request.session.set_expiry(value)
<span style="color: #000000;"> 如果value是个整数,session会在些秒数后失效。
<span style="color: #000000;"> 如果value是个datatime或timedelta,session就会在这个时间后失效。
<span style="color: #000000;"> 如果value是0,用户关闭浏览器session就会失效。
如果value是None,session会依赖全局session失效策略,默认全局两周失效

 4、Django中session相关配置

django默认session存储位置在数据库表中,表名为django_session,当然django还提供了多样化存储session,有以下几种:

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

1、数据库Session配置

SESSION_ENGINE </span>= <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;django.contrib.sessions.backends.db</span><span style="color: #800000;"&gt;'</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 引擎(默认)</span>

<span style="color: #000000;">
SESSION_COOKIE_NAME = <span style="color: #800000;">"<span style="color: #800000;">sessionid<span style="color: #800000;">" <span style="color: #008000;">#<span style="color: #008000;"> Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认
SESSION_COOKIE_PATH = <span style="color: #800000;">"<span style="color: #800000;">/<span style="color: #800000;">" <span style="color: #008000;">#<span style="color: #008000;"> Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None <span style="color: #008000;">#<span style="color: #008000;"> Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False <span style="color: #008000;">#<span style="color: #008000;"> 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True <span style="color: #008000;">#<span style="color: #008000;"> 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 <span style="color: #008000;">#<span style="color: #008000;"> Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False <span style="color: #008000;">#<span style="color: #008000;"> 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False <span style="color: #008000;">#<span style="color: #008000;"> 是否每次请求都保存Session,默认修改之后才保存(默认),最好设置为True,这样超时时间都是最新的

2、缓存session(memchache)配置

SESSION_ENGINE </span>= <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;django.contrib.sessions.backends.cache</span><span style="color: #800000;"&gt;'</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 引擎</span> SESSION_CACHE_ALIAS = <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;default</span><span style="color: #800000;"&gt;'</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置</span>

<span style="color: #000000;">

SESSION_COOKIE_NAME = </span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;sessionid</span><span style="color: #800000;"&gt;"</span>                        <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串</span>
SESSION_COOKIE_PATH = <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;/</span><span style="color: #800000;"&gt;"</span>                                <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; Session的cookie保存的路径</span>
SESSION_COOKIE_DOMAIN = None                              <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; Session的cookie保存的域名</span>
SESSION_COOKIE_SECURE = False                             <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 是否Https传输cookie</span>
SESSION_COOKIE_HTTPONLY = True                            <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 是否Session的cookie只支持http传输</span>
SESSION_COOKIE_AGE = 1209600                              <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; Session的cookie失效日期(2周)</span>
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                   <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 是否关闭浏览器使得Session过期</span>
SESSION_SAVE_EVERY_REQUEST = False                        <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 是否每次请求都保存Session,默认修改之后才保存</span></pre>

3、文件session配置

SESSION_ENGINE </span>= <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;django.contrib.sessions.backends.file</span><span style="color: #800000;"&gt;'</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 引擎</span> SESSION_FILE_PATH = None <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T</span>

4、数据库+缓存session配置

4、缓存+a. 配置 settings.py

SESSION_ENGINE </span>= <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;django.contrib.sessions.backends.cached_db</span><span style="color: #800000;"&gt;'</span>        <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 引擎</span></pre>

5、加密cookie session配置

SESSION_ENGINE </span>= <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;django.contrib.sessions.backends.signed_cookies</span><span style="color: #800000;"&gt;'</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 引擎</span></pre>

5、基于session的用户验证装饰器

wrap(request,** request.session.get( redirect( func(request,** wrap

 6、session和cookie区别

1.作用

当你要登录京东和天猫的时候,当登录成功的时候。我点击其他功能例如购物车 订单等功能的时候是如何判断你已经登录的呢。那就是用的cookie或者session功能。

2.区别

cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

3.session流程

1、自动生成一段字符串

2、将字符串发送到客户端的浏览器,同时把字符串当做key放在session里。(可以理解为session就是一个字典)

3、在用户的session对应的value里设置任意值

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

<tr>
<td><span style="font-size: 16px;">三、分页</td>

</tr>

</table>

一、Django自带的分页

视图:

模版文件

扩展内置分页:

二、自定义分页

先介绍下XSS(跨站脚本攻击):

跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

原因:我们在自定义分页时候会额外的给页面添加html代码,默认Django会认为这些代码是不安全的属于XSS攻击,所以会当作字符串处理不会作为html代码显示,所以我们需要告诉Django这个代码是安全的。

方法有两种:

1.在html模板中方法:

{{ html_str|safe }}

2.在后台函数中使用

django.utils.safestring =mark_safe(html_str)

 3.自定义分页(可以作为一个工具类,作为公共模块使用)

4.使用示例

.utils request.method=== int(request.GET.get(,1)) mypage = page.PagiNation(current_index=current_index,data_num=500=mypage.page_str( render(request,:page_str})

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

<tr>
<td><span style="font-size: 16px;">四、跨站请求伪造(CSRF)</td>
</tr>
</table>

 1、简介:

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比更具危险性。

2、Django中防护CSRF模块

Django中的CSRF防护是通过中间件的手段来达到防护的目的,中间件路径:django.middleware.csrf.CsrfViewMiddleware ,配置文件settings中指定了全局配置,单也可以单独针对某个views函数来配置,具体配置:

中间件 django.middleware.csrf.CsrfViewMiddleware

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

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

TIPS:配置模块导入from django.views.decorators.csrf import csrf_exempt,csrf_protect

 3、原理

当我们向Django后台post数据时,在Django中防护CSRF是通过获取用户请求头中是否含有X-CSRFtoken请求头所对应的随机字符串(),如果有并且是正确的,则可以提交,否则则返回Forbidden(403)错误。

4、提交数据

form表单提交数据:在form表单中加上{% csrf_token %},默认会在表单中生成隐藏的input标签

提交过程:

用户访问页面,{% csrf_token %}模版语言生成CSRF随机随机字符串,并且cookie中也生成了该字符串,当用户提交数据时候cookie中会带着这个字符串进行提交,如果没有该字符串则提交失败

通过ajax提交数据时候,和form表单一样,我们提交数据时需要在请求头中加上X-CSRFtoken,所以提交的时候需要利用js获取cookie中的该随机字符串进行提交:

$("#btn").click("/login/""POST""user":"wd","pwd":"1234""X-CSRFtoken":$.cookie("csrftoken")}, success: } }) })</span></pre>

但是如果页面中有多个ajax请求的话就在每个ajax中添加headers信息,所以可以在页面框架加载完时候通过以下方式提交,这样会在页面中所有ajax提交数据之前加上csrftoken信息

xhr.setRequestHeader("X-CSRFtoken",$.cookie("csrftoken"

最后,一般我们只希望post提交数据时候才会使用csrf验证,所以官网推荐

(/^(GET|HEAD|OPTIONS|TRACE)$/ } $.ajaxSetup({ beforeSend: (!csrfSafeMethod(settings.type) && !"X-CSRFToken"

5、Django后台验证过程

csrf在前端的key为X-CSRFtoken,通过form或者ajax提交到后台,后端的django会自动添加HTTP_,并且最后为的key变成HTTP_X_CSRFtoken,如果随机字符串通过验证则数据提交,否则报错(403)。

五、Django中间件 1、简介

django中的中间件,在其他web框架中,有的叫管道或者httphandle,Django中很多功能都是通过中间件实现的,实际上中间件就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。在工程中的settings.py中由变量MIDDLEWARE控制,请求从上到下依次穿过中间件,每个中间件中都可以有5个方法:

  • process_request(self,request)#请求最开始执行的方法
  • process_response(self,response)#请求返回时候执行的方法
  • process_view(self,callback,callback_args,callback_kwargs)#请求到达views视图之前执行的方法
  • process_exception(self,exception)  # 默认不执行,除非Views方法出错
  • process_template_response(self,response)   # 默认不执行,除非Views中的函数返回的对象中,具有render方法(区别于模板渲染的render)

2、请求在中间件中的方法请求过程

  1. 用户请求先中间件,由上到下先后执行每个中间件process_request方法;
  2. 执行完每个中间件的process_request方法之后,请求到达urls路由关系映射;
  3. 到达urls路由映射以后,由下至上执行每个中间件的process_views方法;
  4. 执行完process_views,请求到达views函数,此时若views函数有错误信息,则由下到上执行process_exception方法,直到错误被抓住停止,都没有抓住页面包错;
  5. 如果views函数中没有出错,那么请求由下到上执行每个中间件的process_response方法,最后响应客户;

大致的请求过程:

 3、自定义中间件

自定义中间件,我们至少包括两个方法,一个是process_request,还有一个是process_response,创建一个py文件,在工程中创建MyMiddleWare目录(与tempates同级),创建文件md.py,注意使用process_response必须返回response:

django.utils.deprecation django.shortcuts <span style="color: #008000;">#<span style="color: #008000;">中间件1
<span style="color: #0000ff;">class
<span style="color: #000000;"> Row1(MiddlewareMixin):
<span style="color: #0000ff;">def
<span style="color: #000000;"> process_request(self,request):
<span style="color: #0000ff;">print
(<span style="color: #800000;">"<span style="color: #800000;">中间件1请求<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">def<span style="color: #000000;"> process_response(self,response):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件1返回<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">return<span style="color: #000000;"> response

</span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; process_view(self,callback_kwargs):
    </span><span style="color: #0000ff;"&gt;print</span>(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;中间件1view</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)

<span style="color: #008000;">#<span style="color: #008000;">中间件2
<span style="color: #0000ff;">class<span style="color: #000000;"> Row2(MiddlewareMixin):
<span style="color: #0000ff;">def<span style="color: #000000;"> process_request(self,request):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件2请求<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;"> return HttpResponse("走")
<span style="color: #0000ff;">def<span style="color: #000000;"> process_response(self,response):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件2返回<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">return<span style="color: #000000;"> response
<span style="color: #0000ff;">def<span style="color: #000000;"> process_view(self,callback_kwargs):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件2view<span style="color: #800000;">"<span style="color: #000000;">)

<span style="color: #008000;">#<span style="color: #008000;">中间件3
<span style="color: #0000ff;">class<span style="color: #000000;"> Row3(MiddlewareMixin):
<span style="color: #0000ff;">def<span style="color: #000000;"> process_request(self,request):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件3请求<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">def<span style="color: #000000;"> process_response(self,response):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件3返回<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">return<span style="color: #000000;"> response
<span style="color: #0000ff;">def<span style="color: #000000;"> process_view(self,callback_kwargs):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">中间件3view<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">def<span style="color: #000000;"> process_exception(self,exception):
<span style="color: #800000;">"""<span style="color: #800000;">只有出现异常时才会执行<span style="color: #800000;">"""
<span style="color: #0000ff;">if<span style="color: #000000;"> isinstance(exception,ValueError):
<span style="color: #0000ff;">return HttpResponse(<span style="color: #800000;">'<span style="color: #800000;">出现异常》。。<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">elif<span style="color: #000000;"> isinstance(exception,TemplateDoesNotExist):
<span style="color: #0000ff;">print<span style="color: #000000;">(request.path_info)
<span style="color: #0000ff;">return render(request,<span style="color: #800000;">"<span style="color: #800000;">404.html<span style="color: #800000;">"<span style="color: #000000;">)

</span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; process_template_response(self,response):
    </span><span style="color: #800000;"&gt;"""</span><span style="color: #800000;"&gt;如果Views中的函数返回的对象中,具有render方法才会执行</span><span style="color: #800000;"&gt;"""</span>
    <span style="color: #0000ff;"&gt;print</span>(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;-----------------------</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)
    </span><span style="color: #0000ff;"&gt;return</span> response</pre>

注册中间件:使用中间件需要在settings.py中注册你的中间件,配置就是你的中间件文件路径

MIDDLEWARE =

4、版本变化

上面所说的Django中间件请求过程是在1.10版本之后(包括1.10),而在1.10版本之前稍微有些区别,区别就在请求异常时候,

六、缓存 简介

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

Django提供了6种缓存方式:

  • 开发调试
  • 内存
  • 文件
  • 数据库
  • Memcache缓存(python-memcached模块)
  • Memcache缓存(pylibmc模块)

缓存方式配置

 通用配置

CACHES =: , : 300, : 300, : 3, : , : 1, 函数名 </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 自定义key</span> <span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; default_key_func(key,key_prefix,version): </span><span style="color: #800000;"&gt;"""</span><span style="color: #800000;"&gt; Default function to generate keys. Constructs the key used by all other methods. By default it prepends the `key_prefix'. KEY_FUNCTION can be used to specify an alternate function with custom key making behavior. </span><span style="color: #800000;"&gt;"""</span> <span style="color: #0000ff;"&gt;return</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;%s:%s:%s</span><span style="color: #800000;"&gt;'</span> %<span style="color: #000000;"&gt; (key_prefix,version,key) </span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; get_key_func(key_func): </span><span style="color: #800000;"&gt;"""</span><span style="color: #800000;"&gt; Function to decide which key function to use. Defaults to ``default_key_func``. </span><span style="color: #800000;"&gt;"""</span> <span style="color: #0000ff;"&gt;if</span> key_func <span style="color: #0000ff;"&gt;is</span> <span style="color: #0000ff;"&gt;not</span><span style="color: #000000;"&gt; None: </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; callable(key_func): </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; key_func </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;: </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; import_string(key_func) </span><span style="color: #0000ff;"&gt;return</span> default_key_func</pre>

使用内存

CACHES =: : </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 注:其他配置同开发调试版本</span></pre>

使用文件

=: :

使用数据库

<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 配置:</span>
    CACHES =<span style="color: #000000;"&gt; {
        </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;default</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;: {
            </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;BACKEND</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;django.core.cache.backends.db.DatabaseCache</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;LOCATION</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;my_cache_table</span><span style="color: #800000;"&gt;'</span>,<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 数据库表</span>

<span style="color: #000000;"> }
}

</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 注:执行创建表命令 python manage.py createcachetable</span></pre>

使用memcache缓存(python-memcached模块)

=: : CACHES </span>=<span style="color: #000000;"&gt; { </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;default</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;: { </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;BACKEND</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;django.core.cache.backends.memcached.MemcachedCache</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;LOCATION</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;unix:/tmp/memcached.sock</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,} } CACHES </span>=<span style="color: #000000;"&gt; { </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;default</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;: { </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;BACKEND</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;django.core.cache.backends.memcached.MemcachedCache</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;LOCATION</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;: [ </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;172.19.26.240:11211</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;172.19.26.242:11211</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,] } }</span></pre>

使用Memcache缓存(pylibmc模块)

=: CACHES </span>=<span style="color: #000000;"&gt; { </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;default</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;: { </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;BACKEND</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;django.core.cache.backends.memcached.PyLibMCCache</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;LOCATION</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;/tmp/memcached.sock</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,} } CACHES </span>=<span style="color: #000000;"&gt; { </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;default</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;: { </span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;BACKEND</span><span style="color: #800000;"&gt;'</span>: <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;django.core.cache.backends.memcached.PyLibMCCache</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,] } }</span></pre>

缓存应用

 单独视图缓存

局部使用

全站缓存

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

<tr>
<td><span style="font-size: 16px;">七、Django中的信号</td>
</tr>
</table>

简介

Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

内置信号

post_init pre_save post_save pre_delete post_delete m2m_changed class_prepared post_migrate Request/ request_finished got_request_exception template_rendered

因为这些信号中并没有注册函数,所以运行时并没有调用触发这些信号

对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数

django.core.signals request_finished django.core.signals request_started django.core.signals got_request_exception

<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import class_prepared <span style="color: #008000;">#<span style="color: #008000;"> 程序启动时,检测已注册的app中的modal类,对于每一个类,自动触发
<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import pre_init,post_init <span style="color: #008000;">#<span style="color: #008000;"> 构造方法前和构造方法后
<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import pre_save,post_save <span style="color: #008000;">#<span style="color: #008000;"> 对象保存前和对象保存后
<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import pre_delete,post_delete <span style="color: #008000;">#<span style="color: #008000;"> 对象删除前和对象删除后
<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import m2m_changed <span style="color: #008000;">#<span style="color: #008000;"> 操作第三张表前后
<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import pre_migrate,post_migrate <span style="color: #008000;">#<span style="color: #008000;"> 执行migrate命令前后

<span style="color: #0000ff;">from django.test.signals <span style="color: #0000ff;">import setting_changed <span style="color: #008000;">#<span style="color: #008000;"> 使用test测试修改配置文件时
<span style="color: #0000ff;">from django.test.signals <span style="color: #0000ff;">import template_rendered <span style="color: #008000;">#<span style="color: #008000;"> 使用test测试渲染模板时

<span style="color: #0000ff;">from django.db.backends.signals <span style="color: #0000ff;">import connection_created <span style="color: #008000;">#<span style="color: #008000;"> 创建数据库连接时

<span style="color: #0000ff;">def callback(sender,**<span style="color: #000000;">kwargs):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">xxoo_callback<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">print<span style="color: #000000;">(sender,kwargs)

xxoo.connect(callback)
<span style="color: #008000;">#<span style="color: #008000;"> xxoo指上述导入的内容#示例

from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender,**kwargs):
print("Request finished!")<span style="color: #008000;">########################说明####################

自定义信号

步骤:

  • 定义信号
  • 触发信号
  • 注册信号

示例:

=django.dispatch.Signal(providing_args=[,<span style="color: #008000;">#<span style="color: #008000;">注册信号
<span style="color: #0000ff;">def
callback(sender,**<span style="color: #000000;">kwargs):

</span><span style="color: #0000ff;"&gt;print</span>(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;callback</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)

</span><span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(sender,kwargs)

pizza_done.connect(callback)

<span style="color: #008000;">#<span style="color: #008000;">触发信号
<span style="color: #0000ff;">from 路径 <span style="color: #0000ff;">import<span style="color: #000000;"> pizza_done

pizza_done.send(sender=<span style="color: #800000;">'<span style="color: #800000;">seven<span style="color: #800000;">',toppings=123,size=456)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有需要的朋友自行下载。
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet在开发接口中不经常用。
一、Django介绍Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django学习线路Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。这个MVT模式并
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小白快速搭建django项目,并对可能出现的报错进行了分析
uniapp微信小程序订阅消息发送服务通知
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的MysqlDB连接,Python3 支持支持pymysql 所有需要在app里面的__init__加上下面配置:
url: re_path(&#39;authors/$&#39;, views.AuthorView.as_view()), re_path(&#39;book/(?P\d+)/$&#39;, vie
前提 关于html寻找路线: template 如果在各个APP中存在, Django 会优先找全局template 文件下的html文件,如果全局下的template文件没有相关的html Djan
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
from bs4 import BeautifulSoup#kindeditordef kindeditor(request): s = &#39;&#39;&#39; &lt;li&gt;&lt;s
view.py 配置 html 配置
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况
自动发送 &gt; 依赖jQuery文件 实例--&gt;GET请求: 手动发送 &gt; 依赖浏览器XML对象(也叫原生ajax) Ajax主要就是使用 【XmlHttpRequest】对象来完成请
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render