python的web页面_python之web框架(1):完成静态页面web服务器

本文介绍了一个用Python实现的简易Web服务器,从最基本的响应固定页面开始,逐步升级为能够处理并返回用户请求的静态页面的多进程服务器。最终,通过面向对象的方式进一步优化了服务器的结构。

python的web框架(1)

1.首先写一个最简单的web服务器,只能给客户回应一个固定的hello world的页面。

from socket import *

from multiprocessing import Process

def deal(conn):

recv_data = conn.recv(1024).decode('gb2312')

print(recv_data)

conn.send('HTTP/1.1 200 OK \r\n\r\n

hello world

'.encode('gb2312'))

def main():

s = socket(AF_INET, SOCK_STREAM)

s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

s.bind(('',8000))

s.listen(1023)

while 1:

conn, user_info = s.accept()

print(user_info)

p = Process(target=deal, args=(conn,))

p.start()

conn.close()

if __name__ == '__main__':

main()

2.根据用户请求的页面,打开页面文件,读取,并回复给用户,完成多进程web静态页面服务器

#!/usr/bin/env python3

# coding:utf-8

from socket import *

from multiprocessing import Process

def deal(conn):

recv_data = conn.recv(1024).decode('gb2312')

recv_data_head = recv_data.splitlines()[0]

print('------', recv_data_head)

request_method, request_path, http_version = recv_data_head.split()

# 去掉url中的?和之后的参数

request_path = request_path.split('?')[0]

if request_path == '/':

request_path = '/index.html'

file_name = "." + request_path

try:

f = open(file_name, 'rb')

except IOError:

conn.send(b'HTTP/1.1 404 ERROR \r\n\r\n

Page is not exsit .

')

return

read_data = f.read()

send_data = b'HTTP/1.1 200 OK \r\n\r\n' + read_data

conn.send(send_data)

f.close()

def main():

s = socket(AF_INET, SOCK_STREAM)

s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

s.bind(('',8000))

s.listen(1023)

while 1:

conn, user_info = s.accept()

print(user_info)

p = Process(target=deal, args=(conn,))

p.start()

conn.close() # 进程会复制出一个新的conn,所以这里的conn需要关闭

if __name__ == '__main__':

main()

3.为了方便操作,可以将之前的函数式编程改成面向对象编程。将所有的方法集成到一个类中,这样更加方便,也更易于使用者了解和使用。

#!/usr/bin/env python3

# coding:utf-8

from socket import *

from multiprocessing import Process

class MyWebServer(object):

@staticmethod

def deal(conn):

recv_data = conn.recv(1024).decode('gb2312')

recv_data_head = recv_data.splitlines()[0]

print('------', recv_data_head)

request_method, request_path, http_version = recv_data_head.split()

# 去掉url中的?和之后的参数

request_path = request_path.split('?')[0]

if request_path == '/':

request_path = '/index.html'

file_name = "." + request_path

try:

f = open(file_name, 'rb')

except IOError:

conn.send(b'HTTP/1.1 404 ERROR \r\n\r\n

Page is not exsit .

')

return

read_data = f.read()

send_data = b'HTTP/1.1 200 OK \r\n\r\n' + read_data

conn.send(send_data)

f.close()

def __init__(self):

self.s = socket(AF_INET, SOCK_STREAM)

self.s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

self.s.bind(('',8000))

self.s.listen(1023)

def start(self):

while 1:

conn, user_info = self.s.accept()

print(user_info)

p = Process(target=self.deal, args=(conn,))

p.start()

conn.close() # 进程会复制出一个新的conn,所以这里的conn需要关闭

s = MyWebServer()

s.start()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值