python-Django基本流程原理01

Python-Django基本流程原理

python之django框架的使用

一. 框架结构

项目名称 FruitCar

安装django 然后执行具指令

django-admin startproject FruitCar

生成如下目录结构:

Fruitcar   项目的容器(可以将它重命名)
    FruitCar 包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名
        __init__.py 一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包
        settings.py  Django 项目的配置文件
        urls.py 路由配置文件
        wsgi.py 项目的运行在 WSGI 兼容的Web服务器上的入口
    templates 项目模板文件夹(前后端不分离时前端页面部分放这里)
    manage.py 管理 Django 项目的命令行工具

创建项目后可以使用以下命令启动项目

 python manage.py runserver

特定端口广播式启动方式:

 python manage.py runserver 0.0.0.0:8001
 //0.0.0.0并不是一个真实的的IP地址,它表示本机中所有的IPV4地址。监听0.0.0.0的端口,就是监听本机中所有IP的端口

到这一步我们项目的框架基本是通了, 写几个静态页面放上去一个项目也算完成了。但我们的目的是开发功能所以我们需要出去创建app,习惯上每个大的功能分一个app 会是的项目清晰有利于项目管理和开发。
例如:我这个项目中有个我要进行车辆的管理和水果的管理我就创建一个car app 和一个fruit app 在每个app中处理它们各自的逻辑功能。

如果文件中有_init_.py 文件就表示改文件所在的文件夹是一个python可识别的Python包, 以后不再赘述

创建app指令

python manage.py startapp car
python manage.py startapp fruit

系统会自动生成app项目结构一个基本结构:

    __init__.py
    admin.py
    apps.py
    migrations 迁移文件 与数据库有关创建表执行迁移指令是自动生成
        __init__.py
    models.py 数据表设置文件相当于mvc中的m
    tests.py
    urls.py 自己创建文件,用来控制这个app中的api,也可以直接写在FruitCar文件的urls.py 文件中
    templates 自己创建文件夹 存放html等文件 
    views.py  视图文件相当于mvc中的v,c

二. Django生命周期

Django 生命周期为: 用户请求发起对url的请求→ wsgiref模块→django中间件→django(视图url对应函数,模型数据库交互,html模版渲染)→django中间件 → wsgiref模块 →用户看到的页面

请求到返回的全过程如下图所示:
python-Django基本流程原理

三. Django中间件

中间件

中间件是一个用来处理Django的请求和响应的框架级别的钩子, 用于在全局范围内改变Django的输入和输出.

中间件的五种方法

  1. process_request 方法
执行时间 参数 返回值 执行顺序
在视图函数之前,在路由匹配之前 请求对象,与视图中用到的request参数是同一个对象 None:按照正常的流程走 HttpResponse:接着倒序执行当前中间件的以及之前执行过的中间件的process_response方法,不再执行其它的所有方法 按照MIDDLEWARE中的注册的顺序执行,也就是此列表的索引值
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
allow_url = ["/admin/", "/car/", "/fruit/"]


class Test2(MiddlewareMixin):
    def process_request(self, request):
        print("可以用来控制请求的api等")
        if request.path_info in allow_url:
            return
        else:
            return HttpResponse("这里是 HttpResponse")
  1. process_response 方法
执行时间 参数 返回值 执行顺序
最后执行 1.request:请求对象,与视图中用到的 2. request参数是同一个对象response:响应对象,与视图中返回的response是同一个对象 response:必须返回此对象,按照正常的流程走 按照注册的顺序倒序执行
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class Test(MiddlewareMixin):
    def process_request(self, request):
        print("这是一个中间件 --> request test")

    def process_response(self, request, response):
        print("这里是 Test 的 HttpResponse")
        return HttpResponse("这是 Test 返回的 HttpResponse")

process_request和process_response 的执行流程如下图:
python-Django基本流程原理

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


class Test(MiddlewareMixin):
    def process_view(self, request, view_func, view_args, view_kwargs):
        '''
        :param request: 浏览器发来的 request 请求对象
        :param view_func: 将要执行的视图函数的名字
        :param view_args: 将要执行的视图函数的位置参数
        :param view_kwargs: 将要执行的视图函数的关键字参数
        :return:
        '''
        print("这里是 Test 的 process_view 函数")
        print(view_func, type(view_func))

执行过程如下图:
python-Django基本流程原理

  1. process_template_response 方法

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

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

middleware.py

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class Test(MiddlewareMixin):
    def process_request(self, request):
        print("这是一个中间件 --> test")

    def process_template_response(self, request, response):
        print("这里是 Test 的 process_template_response")

views.py

from django.shortcuts import render, HttpResponse, redirect


def index(request):
    print("这里是 index 页面")
    rep = HttpResponse("这里是主页面 index")

    def render():
        print("这里是 index 函数里的 render 方法")
        return HttpResponse("index")
    rep.render = render
    return rep
  1. process_exception 方法

只在视图中触发异常时才被执行

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

middlwware.py

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class Test(MiddlewareMixin):
    def process_request(self, request):
        print("这是一个中间件 --> test")

    def process_exception(self, request, exception):
        print("这里是 Test 的 process_exception")
        print(exception)

views.py

from django.shortcuts import HttpResponse


def index(request):
    print("这里是 index 页面")
    raise ValueError("这是一个主动抛出的错误")
    return HttpResponse("这里是主页面 index")

中间件5个方法的执行如图下所示:

python-Django基本流程原理

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!