Django 的生命周期

文章目录

  • Django 的生命周期
    • 一. Django HTTP请求流程图
    • 二. 中间件
      • 什么是中间件
      • 中间件的五种方法
        • 1. process_request
        • 2. process_response
        • 3. process_view
        • 4. process_template_response
        • 5. process_exception
      • 中间件的执行流程
      • 中间件的执行顺序
    • 三. 权限认证(authenticate)
      • 创建用户
      • 修改密码
      • 认证过程
        • login_required 装饰器
        • 登陆访问限制
    • 四. 路由(urls)
      • 什么是路由
      • 基本格式
    • 五. 视图(views)
      • 什么是视图
      • Request 对象
        • 属性和方法
        • QueryDict对象
      • Response 对象
      • 状态保持(Session)
    • 六. 缓存(cache)
      • 设置缓存
      • 缓存
      • 虚拟缓存
      • 站点级缓存
      • 单个 view 缓存
      • 路由指定视图缓存
      • 底层的缓存API

Django 的生命周期

Django 的生命周期_第1张图片
Django 的生命周期_第2张图片

  1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端
    请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post,体现在url之中.

  2. url经过Django中的wsgi,再经过Django的中间件,最后url到过路由映射表,在路由中一条一条进行匹配,
    一旦其中一条匹配成功就执行对应的视图函数,后面的路由就不再继续匹配了.

  3. 视图函数根据客户端的请求查询相应的数据.返回给Django,然后Django把客户端想要的数据做为一个字符串返回给客户端.

  4. 客户端浏览器接收到返回的数据,经过渲染后显示给用户.

一. Django HTTP请求流程图

Django 的生命周期_第3张图片
Django 的生命周期_第4张图片


二. 中间件

什么是中间件

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

中间件的五种方法

1. process_request
  • 执行时间:在视图函数之前,在路由匹配之前
  • 参数:
    request:请求对象,与视图中用到的 request 参数是同一个对象
  • 返回值:
    None:按照正常的流程走
    HttpResponse:接着倒序执行当前中间件的以及之前执行过的中间件的 process_response 方法,不再执行其它的所有方法
  • 执行顺序:按照 MIDDLEWARE 中的注册的顺序执行,也就是此列表的索引值
2. process_response
  • 执行时间:最后执行
    参数:
  • request:请求对象,与视图中用到的 request 参数是同一个对象
    response:响应对象,与视图中返回的 response 是同一个对象
  • 返回值:
    response:必须返回此对象,按照正常的流程走
  • 执行顺序:按照注册的顺序倒序执行
3. process_view
  • 执行时间:在 process_request 方法及路由匹配之后,视图之前
  • 参数:
    request:请求对象,与视图中用到的 request 参数是同一个对象
    view_func:将要执行的视图函数(它是实际的函数对象,而不是函数的名称作为字符串)
    view_args:url 路径中将传递给视图的位置参数的元组
    view_kwargs:url 路径中将传递给视图的关键值参数的字典
  • 返回值:
    None:按照正常的流程走
    HttpResponse:它之后的中间件的 process_view,及视图不执行,执行所有中间件的 process_response 方法
  • 执行顺序:按照注册的顺序执行
4. process_template_response

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

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

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

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

中间件的执行流程

Django 的生命周期_第5张图片

中间件的执行顺序

Django 的生命周期_第6张图片


三. 权限认证(authenticate)

创建用户

>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', '[email protected]', 'johnpassword')

修改密码

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()

认证过程

  • 判断认证函数:is_authenticated()
  • 认证一个给定用户名和密码函数:authenticate()
  • 登入一个用户函数:login()
    from django.contrib.auth import authenticate, login
    
    def my_view(request):
        user = authenticate(username=request.POST['username'], password=request.POST['password'])
        if user is not None:
            if user.is_active:
                login(request, user)
                # Redirect to a success page.
            else:
                # Return a 'disabled account' error message
                ...
        else:
            # Return an 'invalid login' error message.
            ...
    
login_required 装饰器
from django.contrib.auth.decorators import login_required

@login_required(redirect_field_name='my_redirect_field')
def my_view(request):
	pass
登陆访问限制
from django.contrib.auth.decorators import user_passes_test

def email_check(user):
    return user.email.endswith('@example.com')
    
@user_passes_test(email_check)
def my_view(request):
	pass
	
SessionAuthenticationMiddleware 
update_session_auth_hash

四. 路由(urls)

什么是路由

本质是 URL 与要为该 URL 调用的视图函数之间的映射表。

基本格式

from django.conf.urls import url

urlpatterns = [
     url(正则表达式, views视图函数, 参数, 别名),
]

五. 视图(views)

什么是视图

本质是一个函数

  • 必须有一个 HttpRequest 实例(request)
  • 通过正则表达式组获取位置参数
  • 通过正则表达式组获取关键字参数

Request 对象

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

属性和方法

属性

  • path:一个字符串,表示请求的页面的完整路径,不包含域名
  • method:一个字符串,表示请求使用的 HTTP 方法,常用值包括:‘GET’、‘POST’
  • GET:一个类似于字典的对象,包含 get 请求方式的所有参数
  • POST:一个类似于字典的对象,包含 post 请求方式的所有参数
  • FILES:一个类似于字典的对象,包含所有的上传文件
  • COOKIES:一个标准的 Python 字典,包含所有的 cookie,键和值都为字符串
  • session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当 Django 启用会话的支持时才可用,详细内容见“状态保持”

方法

  • is_ajax():如果请求是通过 XMLHttpRequest 发起的,则返回 True
QueryDict对象

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

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

Response 对象

属性

  • 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,那么会话永不过期。

六. 缓存(cache)

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

设置缓存

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

缓存

settings.py 中配置

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
        'TIMEOUT': 60,
    }
}

虚拟缓存

CACHES = {
	'default': {
		'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
	}
}

站点级缓存

缓存整个网站

单个 view 缓存

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def my_view(request):
    ...

路由指定视图缓存

from django.views.decorators.cache import cache_page

urlpatterns = [
url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
]

底层的缓存API

>>> cache.set('add_key', 'Initial value'30)
>>> cache.add('add_key', 'New value')
>>> cache.get('add_key')
'Initial value'
>>> cache.set('a', 1)
>>> cache.set('b', 2)
>>> cache.get_many(['a', 'b'])
{'a': 1, 'b': 2}
>>> cache.delete_many(['a', 'b'])
>>> cache.incr('a')
>>> cache.decr('a')

你可能感兴趣的:(面试题)