概述:
web服务器实际上就是一个运行在物理机上的网络服务器,它等待客户端给他发送请求,成功接收后将客户端请求的资源响应给它。客户端与服务端的通信通过http协议实现。客户端可以是浏览器或者可以发送请求的一段程序。
一、一个简单的web服务器
我们可以通过socket()函数来创建一个网络连接,或者说打开一个网络文件,socket的返回值就是一个文件描述符。有了文件描述符,我们就可以使用普通的文件操作函数来传输数据了,例如
read 用来读取数据
write 用来写数据
只要你创建了连接,剩下的就是文件操作了
import socket
host, port = '', 8080
# SOCK_STREAM 流格式套接字,也叫面向连接的套接字(使用TCP协议)
# AF_INET使用ipv4地址
#一般情况下有了 af 和 type 两个参数就可以创建套接字了,操作系统会自动推演出协议类型
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, proto=0)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((host, port))
listen_socket.listen(5)
print(f'Service HTTP on Port {port}')
while True:
client_connection, client_address = listen_socket.accept()
request = client_connection.recv(1024)
print(request)
http_response = """\HTTP/1.1 200 OK
Hello world!
"""
client_connection.sendall(http_response)
client_connection.close()
接下来,我们考虑如何将我们的web应用放在我们写的web服务器上运行,那么我们如和做到不同的应用在不修改架构和代码的前提下可以让应用正常的运行在web服务器上,答案就是python web server gateway interface(简称WSGI,读作wizgy)
WSGI允许开发者选择将web应用框架和web服务器分开,如此你可以将web框架和web服务器混合匹配使用,选择一个适合你需要的配对。比如,你可以在Gunicorn 或者 Nginx/uWSGI 或者 Waitress上运行 Django, Flask, 或 Pyramid。真正的混合匹配,得益于WSGI同时支持服务器和架构。
下面我们去实现一个简单的WSGI服务器:
import socket
import sys
import io
class WSGIServer(object):
address_family = socket.AF_INET
socket