Python全栈 项目(HTTPServer、PiP使用)
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)
class CallTest(object):
def __call__(self,a,b):
print("This is call test")
print("a =",a,"b =",b)
test = CallTest()
test(1,2)
- #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\r\n"
- response_headlers += "\r\n"
- 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:
- # setting.py
- #httpserver配置文件
- HOST = '0.0.0.0'
- PORT = 8000
- #设置要使用的模块和应用
- MODULE_PATH = "." #设置Frame模块路径
- MODULE = 'WebFrame' #设置模块名称
- APP = 'app' #使用的应用
- #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\r\n"
- responseHeaders += '\r\n'
- response_body = "Sorry,the page not found"
- else:
- responseHeaders = "HTTP/1.1 200 OK\r\n"
- responseHeaders += '\r\n'
- 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\r\n"
- response_headers += '\r\n'
- response_body = handler()
- return response_headers + response_body
- response_headers = "HTTP/1.1 404 not found\r\n"
- response_headers += '\r\n'
- 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.py
# 具体处理模块
- import time
- def show_time():
- return time.ctime()
- def say_hello():
- return "hello world"
- def say_bye():
- return "Good Bye"
- 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() #启动服务器
Python全栈 项目(HTTPServer、PiP使用)的更多相关文章
- Python全栈 项目(电子词典、协程、pdb调试)
后面我就不截图了 大家还是看原文吧 https://yq.aliyun.com/articles/629534 . ................. ...
- 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】
点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
- 战争热诚的python全栈开发之路
从学习python开始,一直是自己摸索,但是时间不等人啊,所以自己为了节省时间,决定报个班系统学习,下面整理的文章都是自己学习后,认为重要的需要弄懂的知识点,做出链接,一方面是为了自己找的话方便,一方 ...
- Win10构建Python全栈开发环境With WSL
目录 Win10构建Python全栈开发环境With WSL 启动WSL 总结 对<Dev on Windows with WSL>的补充 Win10构建Python全栈开发环境With ...
- python 全栈开发,Day117(popup,Model类的继承,crm业务开发)
昨日内容回顾 第一部分:权限相关 1. 权限基本流程 用户登录成功后获取权限信息,将[权限和菜单]信息写入到session. 以后用户在来访问,在中间件中进行权限校验. 为了提升用户体验友好度,在后台 ...
- python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
随机推荐
- mavan下scala编译中文乱码的问题.以及内存溢出问题解决
网上都没有找到我这个问题.都是自己解决的.也不知道后来者能不能遇到 关键字: java.lang.StackOverflowError scala not found scala <config ...
- Java中集合随笔
先上一张图:关于collection接口的 一.Collection中的常用功能: boolean add(Object e): 向集合中添加元素void clear():清空集合中所有元素boole ...
- oracle在线迁移同步数据,数据库报错
报需要升级的错误,具体处理步骤如下: 一.错误信息 SQL> alter database open ;alter database open resetlogs*ERROR at line 1 ...
- shell习题第1题:每日一文件
[题目要求] 请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件 例如生成的文件为2019-04-25.log,并且把磁盘使用情况写入到这个文件中 不用考虑cron,仅仅写脚本即可 [核心要 ...
- Redis学习笔记(一)
定义 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库. 从该定义中抽出几个关键信息,以表示Redis的特性: 存储结构:key-val ...
- Python学习 :集合
集合 Set 集合的创建 集合的创建只有一种方式 集合中的元素必须是不可变的数据类型 集合是无序的,可以通过 for 循环来遍历或者迭代器进行筛选 s=set('xiaoming') s1=['ale ...
- 对Python语法简洁的贴切描述
很多人认为,Python与其他语言相比,具有语法简洁的特点.但这种简洁到底体现在哪些地方,很少有人能说清楚.今天看到一个对这一问题的描述,个人觉得很不错,原文如下: “Python语法主要用来精确表达 ...
- python之变量的命名规则
变量的命名规则: 1.变量名由数字.字母和下划线组成名 2.变量名不能以数字开头 3.禁止使用python中的关键字 4.不能使用中文和拼音 5.变量名要区分大小写 6.变量名要有意义 7.推荐写法: ...
- HyperLedger Fabric 1.4 kafka生产环境部署(11.1)
11.1 Kafka模式简介 上一章介绍的Solo模式只存在一个排序(orderer)服务,是一种中心化结构,一旦排序(orderer)服务出现了问题,整个区块链网络将会崩溃,为了能在正式 ...
- Java设计模式(13)——结构型模式之桥梁模式(Bridge)
一.概述 概念 将抽象与实现脱耦,使得抽象和实现可以独立运行 UML图 角色: 角色关系 二.实践 按照上面的角色建立相应的类 抽象化角色 /** * 抽象化角色 * * @author Admini ...