pip是Python官方推荐的包管理工具 属于python的一部分
pip的使用
pip的安装
sudo apt-get install python-pip
sudo apt-get install python3-pip
安装包
pip3 install package
升级
pip3 install --upgrade package
查看python包清单
pip3 list
卸载
pip3 uninstall package
查找软件包
pip3 search package
显示软件包信息
pip3 show package
生成软件环境文件
pip3 freeze > requirements.txt
根据环境文件安装第三方包
pip3 install -r requirements.txt
from gevent import monkey
monkey.patch_all()
功能 : 在socket导入之前使用后,用来修改套接字的阻塞行为
基于协程并发服务器模型:
import gevent
# 在socket导入之前使用
from gevent import monkey
monkey.patch_all()
from socket import *
from time import ctime
def server(port):
s = socket()
s.bind(('0.0.0.0',port))
s.listen(5)
while True:
c,addr = s.accept()
print("Connect from",addr)
gevent.spawn(handler,c)
#处理客户端请求
def handler(c):
while True:
data = c.recv(1024).decode()
if not data:
break
print("Receive:",data)
c.send(ctime().encode())
c.close()
if __name__ == "__main__":
server(8888)
HTTPServer
前端 前台 客户端 用户端
功能 :
1. 和用户进行交互,获取用户请求
2. 和后端进行通信,整理用户请求给后端
3. 接受后端数据内容,展现给用户
要求:
1. 良好的用户体验
2. 较全面的交互能力
3. 必要的前端优化
4. 良好的跨平台型
后端 后台 服务端
功能:
1. 接受前端请求
2. 进行逻辑处理和运算
3. 和磁盘交互 (文件处理,数据库处理)
4. 进行数据整理,更好的向前端返回结果
要求:
1. 更好的并发性
2. 更快速的处理速度
3. 更好的健壮性
4. 可维护和可扩展
5. 数据的安全
HTTPServer + Frame 版本
httpserver 功能 :
1. 接受HTTP请求 (socket通信)
2. 解析http请求
* 请求类型 GET,POST
* 请求内容
3. 将具体的请求整理后给 web Frame
4. 接受后端应用返回的数据内容
5. 将数据组织为HTTP response的格式发给客户端
什么是框架?
矿建即开发模板,通过根据框架规则填写内容即可完成快速开发工作
Frame 功能:
1. 接收httpserver发送的request请求
2. 进行逻辑处理或者数据整合
3. 将结果发送给httpserver
* 如果能够处理则返回结果和数据
* 不能处理返回原因
结构 :
HTTPServer --- static目录
--- HttpServer.py
--- WebFrame.py
--- setting.py
--- views.py
m = __import__(module)
功能 : 导入一个模块
参数:要导入的模块
返回值:模块对象
getattr(obj,attr)
功能:获取一个对象的属性
参数: obj 对象
attr 属性
返回值: 返回属性值
__call__() 魔法方法
作用 : 让实例对象可以像函数一样被调用执行
class CallTest(object):
def __call__(self,a,b):
print("This is call test")
print("a =",a,"b =",b)
test = CallTest()
test(1,2)
HTTPServer完整代码:
Server:
#coding=utf-8 ''' module: HTTPServer.py name : Paris time : 2018-8-28 功能 :httpserver部分 modules: Python3.5 、socket、sys threading、re、setting ''' from socket import * import sys from threading import Thread import re from setting import * #处理http请求类 class HTTPServer(object): def __init__(self,application): self.sockfd = socket() self.sockfd.setsockopt (SOL_SOCKET,SO_REUSEADDR,1) #获取模块接口 self.application = application def bind(self,host,port): self.host = host self.port = port self.sockfd.bind((self.host,self.port)) #启动服务器 def serve_forever(self): self.sockfd.listen(10) print("Listen the port %d..."%self.port) while True: connfd,addr = self.sockfd.accept() print("Connect from",addr) handle_client = Thread (target = self.client_handler, args = (connfd,)) handle_client.setDaemon(True) handle_client.start() def client_handler(self,connfd): #接收浏览器request request = connfd.recv(4096) #可以分析请求头和请求体 request_lines = request.splitlines() #获取请求行 request_line = request_lines[0].decode('utf-8') #获取请求方法和请求内容 pattern = r'(?P<METHOD>[A-Z]+)s+(?P<PATH_INFO>/S*)' try: env = re.match(pattern,request_line).groupdict() except: response_headlers = "HTTP/1.1 500 SERVER ERROR " response_headlers += " " response_body = "server error" response = response_headlers + response_body connfd.send(response.encode()) # method,filename = # re.findall(r'^([A-Z]+)s+(/S*)', request_line)[0] #将解析内容合成字典给web frame使用 # env = {'METHOD':method,'PATH_INFO':filename} # print(env) #将env给Frame处理,得到返回内容 response = self.application(env) #发送给客户端 if response: connfd.send(response.encode()) connfd.close() if __name__ == "__main__": #将要使用的模块导入进来 sys.path.insert(1,MODULE_PATH) m = __import__(MODULE) application = getattr(m,APP) httpd = HTTPServer(application) httpd.bind(HOST,PORT) httpd.serve_forever()
# setting.py #httpserver配置文件 HOST = '0.0.0.0' PORT = 8000 #设置要使用的模块和应用 MODULE_PATH = "." #设置Frame模块路径 MODULE = 'WebFrame' #设置模块名称 APP = 'app' #使用的应用
WebFrame:
#coding=utf-8 from views import * ''' WebFrame.py WebFrame 框架 用于处理server解析请求 ''' #设置静态文件夹路径 STATIC_DIR = "./static" #应用 class Application(object): def __init__(self,urls): self.urls = urls def __call__(self,env): method = env.get("METHOD",'GET') path = env.get("PATH_INFO",'/') #请求内容 if method == 'GET': if path == '/' or path[-5:] == '.html': response = self.get_html(path) else: response = self.get_data(path) elif method == 'POST': pass return response def get_html(self,path): if path == '/': get_file = STATIC_DIR + "/index.html" else: get_file = STATIC_DIR + path try: fd = open(get_file) except IOError : #没有找到请求网页 responseHeaders = "HTTP/1.1 404 not found " responseHeaders += ' ' response_body = "Sorry,the page not found" else: responseHeaders = "HTTP/1.1 200 OK " responseHeaders += ' ' response_body = fd.read() finally: response = responseHeaders + response_body return response def get_data(self,path): for url,handler in self.urls: if path == url: response_headers = "HTTP/1.1 200 OK " response_headers += ' ' response_body = handler() return response_headers + response_body response_headers = "HTTP/1.1 404 not found " response_headers += ' ' response_body = "Sorry ,not found the data" return response_headers + response_body urls = [ ('/time',show_time), ('/hello',say_hello), ('/bye',say_bye), ] app = Application(urls)
views:
# views.py
# 具体处理模块
import time def show_time(): return time.ctime() def say_hello(): return "hello world" def say_bye(): return "Good Bye"
python 的 httpserver模块
python2 BaseHTTPServer
python3 http.server
示例:
try: from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer except ImportError: from http.server import BaseHTTPRequestHandler,HTTPServer class RequestHandler(BaseHTTPRequestHandler): def do_GET(self): print(self.headers) #请求头 print(self.path) #请求内容 fd = open('test.html','rb') content = fd.read() #组织response self.send_response(200) self.send_header('Content-Type','text/html') self.end_headers() self.wfile.write(content) def do_POST(self): pass address = ('0.0.0.0',8080) #生成httpserver对象 httpd = HTTPServer(address,RequestHandler) httpd.serve_forever() #启动服务器