Django生命周期

Posted 乐观python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django生命周期相关的知识,希望对你有一定的参考价值。

一、Django生命周期流程图

二、中间件

什么是中间件

中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件负责做一些特定的功能。

中间件的五种方法

process_request

执行时间:在视图函数之前,在路由匹配之前
参数:request:请求对象,与视图中用到的request参数是同一个对象
返回值:None:按照正常的流程走,HttpResponse:接着倒序执行当前中间件以及之前执行过的中间件,process_response方法,不再执行其它的所有方法
执行顺序:按照MIDDLEWARE中的注册的顺序执行,也就是此列表的索引值

process_response

执行时间:最后执行
参数:request:请求对象,与视图中用到的request参数是同一个对像,response:响应对象,与视图中返回的response是同一个对象
返回值:response:必须返回此对象,按照正常的流程走
执行顺序:按照注册的顺序倒序执行

process_view

执行时间:在process_request方法及路由匹配之后,视图之前
参数:request:请求对象,与视图中用到的request参数是同一个对象,view_func:将要执行的视图函数(它是实际的函数对象,而不是函数的名称作为字符串)
   view_args:url路径中将传递给视图的位置参数的元组,view_kwargs:url路径中将传递给视图的关键值参数的字典 返回值:None:按照正常的流程走,HttpResponse:它之后的中间件的process_view,及视图不执行,执行所有中间件的process_response方法 执行顺序:按照注册的顺序执行

process_template_response
此方法必须在视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)时,才被执行

执行时间:视图之后,process_exception之前
参数:request:请求对象,与视图中用到的request参数是同一个对象,response:是TemplateResponse对象(由视图函数或者中间件产生)
返回值:response:必须返回此对象,按照正常的流程走
执行顺序:按照注册的顺序倒序执行

process_exception
此方法只在视图中触发异常时才被执行.

执行时间:视图之后,process_response之前
参数:request:请求对象,与视图中用到的request参数是同一个对象,exception:视图函数异常产生的Exception对象
返回值:None:按照正常的流程走,HttpResponse对象:不再执行后面的process_exception方法
执行顺序:按照注册的顺序倒序执行

三. 认证系统

创建用户

1 from django.contrib.auth.models import User
2 user = User.objects.create_user(\'john\', \'lennon@thebeatles.com\', \'johnpassword\')

修改密码

1 from django.contrib.auth.models import User
2 u = User.objects.get(username=\'john\')
3 u.set_password(\'new password\')
4 u.save()

认证过程

判断认证函数:is_authenticated()

认证一个给定用户名和密码函数:authenticate()

登入一个用户函数:login()

 1 from django.contrib.auth import authenticate, login
 2 
 3 def my_view(request):
 4     user = authenticate(username=request.POST[\'username\'], password=request.POST[\'password\'])
 5     if user is not None:
 6         if user.is_active:
 7             login(request, user)
 8             # Redirect to a success page.
 9         else:
10             # Return a \'disabled account\' error message
11             ...
12     else:
13         # Return an \'invalid login\' error message.
14         ...

login_required 装饰器

1 from django.contrib.auth.decorators import login_required
2 
3 @login_required(redirect_field_name=\'my_redirect_field\')
4     def my_view(request):

登陆访问限制

 1 from django.contrib.auth.decorators import user_passes_test
 2 
 3 def email_check(user):
 4     return user.email.endswith(\'@example.com\')
 5     
 6 @user_passes_test(email_check)
 7     def my_view(request):
 8 ...
 9 SessionAuthenticationMiddleware 
10 update_session_auth_hash
11 
12 #### 三. 路由系统
13 ##### 什么是路由
14 本质是URL与要为该URL调用的视图函数之间的映射表。
15 ##### 基本格式
16 ```python
17 from django.conf.urls import url
18 
19 urlpatterns = [
20      url(正则表达式, views视图函数,参数,别名),
21 ]

四. 视图

什么是视图,视图本质是一个函数

必须有一个HttpRequest实例(request)

通过正则表达式组获取位置参数

通过正则表达式组获取关键字参数

Request对象

服务器接收到http协议的请求后,会根据报文创建HttpRequest对象

  1. 属性和方法

    属性 path:一个字符串,表示请求的页面的完整路径,不包含域名

    method:一个字符串,表示请求使用的HTTP方法,常用值包括:\'GET\'\'POST\' GET:一个类似于字典的对象,包含get请求方式的所有参数

    POST:一个类似于字典的对象,包含post请求方式的所有参数

    FILES:一个类似于字典的对象,包含所有的上传文件

    COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串

    session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见“状态保持”

    方法: is_ajax():如果请求是通过XMLHttpRequest发起的,则返回True

  1. QueryDict对象

request对象的属性GET、POST都是QueryDict类型的对象

get():根据键获取值,只能获取键的一个值,如果一个键同时拥有多个值,获取最后一个值 getlist():根据键获取值,将键的值以列表返回,可以获取一个键的多个值

Respone对象

属性: content:表示返回的内容,字符串类型 charset:表示response采用的编码字符集,字符串类型

status_code:响应的HTTP响应状态码
content-type:指定输出的MIME类型
方法:
init :使用页内容实例化HttpResponse对象
write(content):以文件的方式写
flush():以文件的方式输出缓存区
set_cookie(key, value=\'\', max_age=None, expires=None):设置Cookie
key、value都是字符串类型
max_age是一个整数,表示在指定秒数后过期
expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期,注意datetime和timedelta值只有在使用PickleSerializer时才可序列化
max_age与expires二选一
如果不指定过期时间,则两个星期后过期
delete_cookie(key):删除指定的key的Cookie,如果key不存在则什么也不发生

状态保持

Session

 

会话过期时间
set_expiry(value):设置会话的超时时间
如果没有指定,则两个星期后过期
如果value是一个整数,会话将在values秒没有活动后过期
若果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
如果value为None,那么会话永不过期

 

五. 缓存

缓存就是为了减少数据库IO,不重复消耗计算资源,Django拥有一套健壮的缓存系统来保存动态页面,避免每次请求都重新计算,Django提供了特定视图的输出、可以仅仅缓存那些很难生产出来的部分、或者可以缓存整个网站

设置缓存
Django数据缓可以存在数据库中、文件系统或者内存中
通过setting文件的CACHES配置来实现
参数TIMEOUT:缓存过期时间,以秒为单位,默认300秒;设置None表示永远不过期,设置成0表示缓存立即失效

虚拟缓存

1 CACHES = {
2         \'default\': {
3                 \'BACKEND\': \'django.core.cache.backends.dummy.DummyCache\',
4         }
5 }

站点级缓存

缓存整个网站

单个view缓存

1 from django.views.decorators.cache import cache_page
2 
3 @cache_page(60 * 15)
4 def my_view(request):
5     ...

路由指定视图缓存

1 from django.views.decorators.cache import cache_page
2 urlpatterns = [
3 url(r\'^foo/([0-9]{1,2})/$\', cache_page(60 * 15)(my_view)),
4 ]

底层的缓存API

 1 ache.set(\'add_key\', \'Initial value\', 30)
 2 cache.add(\'add_key\', \'New value\')
 3 cache.get(\'add_key\')
 4 \'Initial value\'
 5 cache.set(\'a\', 1)
 6 cache.set(\'b\', 2)
 7 cache.get_many([\'a\', \'b\'])
 8 {\'a\': 1, \'b\': 2}
 9 cache.delete_many([\'a\', \'b\'])
10 cache.incr(\'a\')
11 cache.decr(\'a\')

 





 

以上是关于Django生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Android片段生命周期:onResume调用了两次

在不存在的片段上调用片段生命周期和 onCreate 的问题

导航上的片段生命周期重叠

Android 片段生命周期

关于片段生命周期,何时调用片段的 onActivityResult?

理解片段事务期间片段的生命周期方法调用