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): #设定状态和头部参数的回调函数passresult = application(environ, start_response)#调用APP的__call__函数(这里APP是一个类)def write(data): # 这是把响应发到前端的函数passdef data in result: # 迭代访问,把响应发到前端write(data)
设定app所需要的参数(environ,start_response) 调用app 迭代访问app的返回结果(response body),并传给客户端
from wsgiref.simple_server import make_server# 定义我们一个最简单的appdef 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 objectdef index(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return ['index page']# 这是一个标准的application objectdef hello(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return ['hello page']# 这是一个标准的application objectdef 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('/') #这句代码是获取urlurls = [ # 这里定义路由('index', index),('hello', hello)]for item in urls: # 这里根据路由,执行不同的appif item[0] == path:app = item[1]return app(environ, start_response)else: return not_found(environ, start_response) # 如果找不到,则执行默认的appfrom wsgiref.simple_server import make_server# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:httpd = make_server('', 8000, application)httpd.serve_forever()
负载均衡,转发用户请求 预处理 XSL 等相关数据 限制请求速率,设置白名单
赞 (0)
