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模块 →用户看到的页面
请求到返回的全过程如下图所示:
三. Django中间件
中间件
中间件是一个用来处理Django的请求和响应的框架级别的钩子, 用于在全局范围内改变Django的输入和输出.
中间件的五种方法
- 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")
- 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 的执行流程如下图:
- 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))
执行过程如下图:
- 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
- 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个方法的执行如图下所示:
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: