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 ...
随机推荐
- java中StringBuffer与String、StringBuilder的区别
在java中我们经常可以看到StringBuffer和String的用法,但是我自己在使用过程中,经常会将两者弄混淆,今天我们就来了解一下两者的区别: 我们首先来看一下我们的官方API中的简单介绍: ...
- 【洛谷P2340】 奶牛会展
\(奶牛会展\) 题目链接 由于智商之和或情商之和不能为负数,所以直接把智商+情商>0的奶牛加上是布星的 我们考虑背包,不妨将智商当做物品大小,将情商当做价值 我们要求 大小+价值 的最大值 \ ...
- AutoComplete的使用方法
百度 酷狗,反正使用搜索功能时,都会看到类似于图一这种自动补全的功能,灰常的方便,今天做一个项目,刚好要加这个功能,于是一通百度之后,总算做出来,源代码在文章末尾会提供下载.还有,我这个是参考了网上的 ...
- #leetcode刷题之路8-字符串转换整数 (atoi)
请你来实现一个 atoi 函数,使其能将字符串转换成整数.首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止.当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面 ...
- WSO2 API Manager中host Ip 不正确的问题解决方法
问题: 根据官方的Quick start的教程,部署完AM后,添加的API的host Ip不正确,为localhost或者服务器上的其他虚拟ip. 安装版本: WSO2AM 2.6.0 环 ...
- 详解HTML5中的进度条progress元素简介及兼容性处理
一.progress元素基本了解 1.基本知识 progress元素属于HTML5家族,指进度条.IE10+以及其他靠谱浏览器都支持. 注释:Internet Explorer 9 以及更早的版本不支 ...
- 1. 了解HTML
HTML概念 HTML,超文本标记语言.它由一套标签组成用来描述网页,值得我们注意的是HTML并不是编程语言,它只是一种标记,我们通过HTML定义了网页的结构,然后再利用其他技术装饰这个结构,赋予这个 ...
- WIN10远程连接winserver2012 r2,连接失败
背景:2012开启远程的时候,默认是勾选“仅允许运行使用网络级别身份验证的远程桌面的计算机连接”,这个选项据说比较安全,但是用win10远程的时候就报错,函数不受支持,最后通过修改win10的配置得以 ...
- hive新手学习随笔
一.回顾 1.hive基于Hadoop的(存储HDFS,计算MR) 2.sql on hadoop概念 ->简化开发的操作 ->提升 ...
- Python文本操作2
# list3 = [# {"name": "alex", "hobby": "抽烟"},# {"name&q ...