Python: 一起写一个 Web 服务器
May 28, 2015
还记的么,在第一部分Part 1我问过一个问题,“怎样在你的刚完成的WEB服务器下运行 Django 应用、Flask 应用和 Pyramid 应用?在不单独修改服务器来适应这些不同的 WEB 框架的情况下。”
继续读,下面将会给出答案。在过去,你选择一个python web 框架将会限制web服务器的使用,反之亦然。 如果web框架和服务器被设计的一起工作,那么他们将没问题:
但是,当你试图组合不是被设计的一起工作的一个web框架和一个web服务器时你可能已经遇到下面的问题:
基本上,你必须使用一起工作的而不是你想要用的组合。
所以,你怎么能确定你能跑你的web服务器兼容多个web框架的同时而又不用写代码来改变web服务器或者web框架?答案就是**Python Web Server Gateway Interface **(或者[WSGI] (https://www.python.org/dev/peps/pep-0333/) 作为简写, 发音 “wizgy”).
WSGI 允许开发者分别选择web框架和web服务器。现在你们混合使用匹配的web框架和服务器来满足你的需求。你能跑 Django, Flask, 或者 Pyramid, 例如, 使用 Gunicorn 或者 Nginx/uWSGI 又或者 Waitress. 真的混合且匹配这要归功于 WSGI 既支持服务器有支持框架:
所以, WSGI 是第一部分我问的问题的答案 Part 1 也在文章最开始提到。你的web服务器必须实现WSGI的服务端接口,现在所有的python web 框架已经实现了WSGI的框架端接口 , 这允许你使用它们而不需修改代码来适配一个特殊的web框架。 现在你知道了WSGI 支持 Web servers 和 Web frameworks 允许你选择一个匹配的组合,这也得利于服务端和框架开发者因为它们能集中于它们想关注的方面.其他语言有类似的接口 : 例如Java, 有 Servlet API 同时Ruby 有 Rack. 这都没问题,你可能会说: “给我展示你的代码!”好的,看一下这个完美的最小 WSGI 服务器实现:
# Tested with Python 2.7.9, Linux & Mac OS X
import socket
import StringIO
import sys
class WSGIServer(object):
address_family = socket.AF_INET
socket_type = socket.SOCK_STREAM
request_queue_size = 1
def __init__(self, server_address):
# Create a listening socket
self.listen_socket = listen_socket = socket.socket(
self.address_family,
self.socket_type
)
# Allow to reuse the same address
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# Bind
listen_socket.bind(server_address)
# Activate
listen_socket.listen(self.request_queue_size)
# Get server host name and port
host, port = self.listen_socket.getsockname()[:2]
self.server_name = socket.getfqdn(host)
self.server_port = port
# Return headers set by Web framework/Web application
self.headers_set = []
def set_app(self, application):
self.application = application
def serve_forever(self):
listen_socket = self.listen_socket
[1] [2] [3] [4] 下一页
原文:http://www.myhack58.com/Article/sort099/sort0100/2015/62603.htm
0 Comments