由浏览器发起请求开始
知识点1:
浏览器与服务器软件架构:C/S架构
HTTP协议:又称超文本传输协议,它规定了浏览器与服务端数据传输的格式
HTTP协议四大特性:
基于TCP/IP作用于应用层的协议
基于请求响应
无状态
无连接
知识点2:
请求格式及响应格式:
请求格式:
请求首行
请求头
空行(\r\n)
请求体
响应格式:
响应首行
响应头
空行
响应体
wsgiref请求响应处理
知识点3:web服务网关协议
cgi:通用网关协议
wsgi协议:
wsgi协议(Web Server Gateway Interface) 主要包含server和application两部分:
WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端;
WSGI application接收由server转发的request,处理请求,并将处理结果返回给server。application中可以包括多个栈式的中间件(middlewares),这些中间件需要同时实现server与application,因此可以在WSGI服务器与WSGI应用之间起调节作用:对服务器来说,中间件扮演应用程序(执行程序),对应用程序来说,中间件扮演服务器(WSGI服务器)。
WSGI协议其实是定义了一种server与application解耦的规范,我们django自带的wsgiref是对该协议的具体实现
此外还有很多其他实现该协议的服务器:
uwsgi:支持较高并发,django项目上线一般会选择用它替换django自带的wsgiref == JAVA中的tomcat
wsgiref:支持并发不高,django自带
请求解析完成后依次通过Django中间件
知识点4:django中间件
django自带七大中间件:可以简单理解为django的门户,安全认证及全局处理都在这里面
1
2
3
4
5
6
7
8
9
|
MIDDLEWARE
=
[
'django.middleware.security.SecurityMiddleware'
,
'django.contrib.sessions.middleware.SessionMiddleware'
,
'django.middleware.common.CommonMiddleware'
,
'django.middleware.csrf.CsrfViewMiddleware'
,
'django.contrib.auth.middleware.AuthenticationMiddleware'
,
'django.contrib.messages.middleware.MessageMiddleware'
,
'django.middleware.clickjacking.XFrameOptionsMiddleware'
,
]
|
除了django自带的中间件以外我们还可以自定义中间件实现一些全局的校验和配置
方法:在应用下新建文件夹,名字自取,文件夹下新建任意py文件,名字自取,接下来就可以在py中定义自己的中间件
01
02
03
04
05
06
07
08
09
10
11
12
|
# 导入MiddlewareMixin模块
from
django.utils.deprecation
import
MiddlewareMixin
#定义中间件的类,它继承MiddlewareMixin
class
Md1(MiddlewareMixin):
def
process_request(
self
, request):
print
(
'Md1里面的process_request'
)
class
Md2(MiddlewareMixin):
def
process_request(
self
, request):
print
(
'Md2里面的process_request'
)
|
django暴露给开发者5种方法分别是:
1
2
3
4
5
|
process_request(
self
, request):
#请求来的时候执行
process_response(
self
, request, response):
#响应返回时执行
process_template_response(
self
, request, response):
#视图函数执行完了执行
process_view(
self
, request, view_func, view_args, view_kwargs):
#路由匹配成功后视图函数执行前执行
process_exception(
self
, request, exception):
#视图函数出错时执行
|
接下来进入urls.py,路由匹配
1
2
3
4
5
6
7
|
urlpatterns
=
[
url(r
'^admin/'
, admin.site.urls),
url(r
'^$'
,views.home),
url(r
'^test/$'
,views.test),
url(r
'^testadd/$'
,views.testadd),
url(r'',views.error)
]
|
路由匹配成功,进入视图函数
路由层写法:
1
|
url(r
'^test/$'
,views.test),
|
视图层写法:
1
2
3
4
5
|
def
text(request):
if
request.method
=
=
"POST"
:
return
HttpResponse(
"ok"
)
elif
request.method
=
=
"GET"
:
return
HttpResponse(
"ok"
)
|