django进阶:从WSGI的介绍到Django原理解析
WEB前端开发社区 今天
Web服务器(Server): 监听某个端口的http服务器 Web应用程序(APP): 指的是可以被调用的一个对象,一般指的是一个函数 或者 包含一个 __call__
方法的类的实例Web中间件(Middleware):处于服务器和应用中间,起到承接的作用,用Python的术语来说,中间件就类似于一个装饰器
#这是一个appdef app(environ, start_response): return []
def middleware(environ, start_response): #这里编写中间件的代码 return app(environ, start_response)
python manage.py runserver
的时候,就首先启动了一个8000端口的http服务器(这个就是Web服务器) 然后 django里面的中间件(这个就是上述所说的Web中间件),这个是定义在 settings.py
文件的MIDDLEWARE
最后 django加载里面的app(这个就是上述所说的Web应用程序),这个是定义在 settings.py
文件的INSTALLED_APPS
WSGI App介绍
def app(environ, start_response): 这是一个app return []
__call__()
方法的类的实例:class app:
def __call__(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return []
接收两个参数 environ
和start_response
:environ
是一个字典,里面储存了HTTP request的所有内容。在django里面,通常会把environ 封装成为一个request。start_response
是一个WSGI Server(http 服务器)传递过来的函数,用于将response header, status传递给Server。start_response(status, headers)
, 它的作用是返回状态码 以及 头部信息, status必须是一个字符串,格式是 “状态码 + 说明”。headers 是一个数组,按照 [(key, value), (key, value) ] 这样的格式来组织。 它需要返回一个可迭代的值,用于将response body传递给Server。 ["hello world", "baby"]
WSGI Server介绍
socket = eventlet.listen(('localhost', '8000'), backlog = 10) 定义一个wsgi http服务器server = eventlet.spawn(event.wsgi.server, socket, app) 把service 和 app进行绑定
def run(application): #服务器程序调用应用程序
environ = {}#设定参数
def start_response(status, headers): #设定状态和头部参数的回调函数
pass
result = application(environ, start_response)#调用APP的__call__函数(这里APP是一个类)
def write(data): # 这是把响应发到前端的函数
pass
def data in result: # 迭代访问,把响应发到前端
write(data)
设定app所需要的参数(environ,start_response) 调用app 迭代访问app的返回结果(response body),并传给客户端
from wsgiref.simple_server import make_server
# 定义我们一个最简单的app
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>Hello, web!</h1>']
# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print('Serving HTTP on port 8000...') # 开始监听HTTP请求:
httpd.serve_forever()
WSGI Middleware介绍
middleware
的概念没有appllication
和server
那么容易理解。假设一个符合application
标准的可调用对象,它接受可调用对象作为参数,返回一个可调用对象的对象。那么对于server
来说,它是一个符合标准的可调用对象,因此是application
。而对于application
来说,它可以调用application
,因此是server
。这样的可调用对象称为middleware
。middleware
的概念非常接近decorator
。# 这是一个标准的application object
def index(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return ['index page']
# 这是一个标准的application object
def hello(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return ['hello page']
# 这是一个标准的application object
def not_found(environ, start_response):
start_response('404 NOT FOUND', [('Content-Type', 'text/plain')])
return ['Not Found Page']
###上面我们定义了三个app
### 然后我们定义一个中间件 middleware,这个中间件的形式是跟app是一样的
def application(environ, start_response):
path = environ.get('PATH_INFO', '').lstrip('/') #这句代码是获取url
urls = [ # 这里定义路由
('index', index),
('hello', hello)
]
for item in urls: # 这里根据路由,执行不同的app
if item[0] == path:
app = item[1]
return app(environ, start_response)
else: return not_found(environ, start_response) # 如果找不到,则执行默认的app
from wsgiref.simple_server import make_server
# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
httpd.serve_forever()
负载均衡,转发用户请求 预处理 XSL 等相关数据 限制请求速率,设置白名单
赞 (0)