美文网首页
Django的生命周期

Django的生命周期

作者: 三点四行间 | 来源:发表于2018-12-01 09:00 被阅读0次

    Django的生命周期

    image.png

    一. Django HTTP请求流程图

    Django HTTP请求流程图
    HTTP请求流程

    二. 中间件

    什么是中间件

    中间件是一个用来处理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方法
    • 执行顺序:按照注册的顺序倒序执行
    中间件的执行流程
    中间件的执行流程
    中间件的执行顺序
    中间件的执行顺序

    三. 认证系统

    创建用户
    >>> from django.contrib.auth.models import User
    >>> user = User.objects.create_user('john', 'lennon@thebeatles.com', '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):
    
    登陆访问限制
    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):
    ...
    SessionAuthenticationMiddleware 
    update_session_auth_hash
    
    #### 三. 路由系统
    ##### 什么是路由
    本质是URL与要为该URL调用的视图函数之间的映射表。
    ##### 基本格式
    ```python
    from django.conf.urls import url
    
    urlpatterns = [
         url(正则表达式, views视图函数,参数,别名),
    ]
    

    四. 视图

    什么是视图

    本质是一个函数

    • 必须有一个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表示缓存立即失效
    缓存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')
    

    相关文章

      网友评论

          本文标题:Django的生命周期

          本文链接:https://www.haomeiwen.com/subject/cvjeqqtx.html