1. webserver.py
'''
这是完成的动态服务器
'''
import socket
import myapp
class HttpServer(object):
def __init__(self, port):
self.socket_server = socket.socket()
self.socket_server.bind(('', port))
self.socket_server.listen()
self.response_data = ''
def start(self):
while True:
self.socket_client, _ = self.socket_server.accept()
self.handle_client()
def handle_client(self):
'''假设全部的请求都是动态资源'''
request_data = self.socket_client.recv(1024)
request_data_str = request_data.decode()
request_data_list = request_data_str.split('\r\n')
try:
first_line = request_data_list[0]
url = first_line.split(' ')[1]
except:
url = '/'
if url.endswith('.py'):
print('请求的动态资源,交给框架处理')
print(url)
environment = {
'url_info':url
}
response_body = myapp.app(environment, func=self.handle_response_headers)
response = self.response_data + response_body
self.socket_client.send(response.encode('gbk'))
else:
print('请求的静态资源')
response_first_line = 'HTTP/1.1 200 ok\r\n'
response = response_first_line + '\r\n' + '静态页面'
self.socket_client.send(response.encode('gbk'))
def handle_response_headers(self, status):
response_first_line = 'HTTP/1.1 ' + status + '\r\n'
response = response_first_line + '\r\n'
self.response_data = response
def main():
s = HttpServer(8080)
s.start()
if __name__ == '__main__':
main()
2. myapp.py
'''
这是运行在服务器上的框架,用来处理动态资源
'''
route_list = [
]
def factory(url):
def wrapper(func):
global route_list
route_list.append((url, func))
def inner():
data = func()
return data
return inner
return wrapper
@factory('/login.py')
def login():
print('登陆处理函数')
return '登陆成功'
@factory('/register.py')
def register():
print('注册处理函数')
return '注册成功'
class Application2(object):
def __call__(self, env, func, *args, **kwargs):
path_info = env['url_info']
for url, funcs in route_list:
if url == path_info:
response_body = funcs()
func('200 ok')
return response_body
else:
func('404 not found')
return '路径错误'
class Application(object):
def __call__(self, env, func, *args, **kwargs):
print(env)
url = env['url_info']
try:
info = url.split('?')[1].split('&')
username = info[0]
password = info[1][:-3]
print(username, password)
func('200 ok')
return '登陆成功'
except:
func('404 not found')
return '404 not found'
app = Application2()
def app2(env, func):
'''
接口,完成动态资源的获取
:param env: 一般情况下是一个字典,里面封装了所有服务器传递过来的数据
:return: 返回给服务器的资源数据
'''
print(env)
url = env['url_info']
try:
info = url.split('?')[1].split('&')
username = info[0]
password = info[1][:-3]
print(username, password)
func('200 ok')
return '登陆成功'
except:
func('404 not found')
return '404 not found'