写一个Python 1、通过select实现的最简单的web框架2、通过wsgiref实现的web框架
#!/usr/bin/env python
# -*- coding: utf- -*- import socket
import select class MyRequest:
"""
从请求头请求体获取的信息封装的request对象中
"""
def __init__(self,data):
header_body=data.decode('utf-8')
header_str,body_str=header_body.split('\r\n\r\n')
header_list=header_str.split('\r\n')
method,url,protocal=header_list[].split(' ') header_dict={} for i in range(,len(header_list)):
k,v =header_list[i].split(':',)
header_dict[k]=v self.method=method
self.url=url
self.headers=header_dict class MyResponse:
"""
处理服务端要返回给浏览器的数据,相当于HTTPResponse或render
"""
def __init__(self,data):
self.data=data
self.base_data='HTTP/1.1 200 OK\r\n\r\n<html><head><meta charset="UTF-8"></head><body><h1>{0}</h1></body></html>'
def myrender(self):
return self.base_data.format(self.data).encode('utf-8') # 下面2个简单的视图函数
def index(request):
return MyResponse('index page').myrender() def login(request):
return MyResponse('login page').myrender() # 路由系统
routers=[
['/index',index],
['/login',login],
] sk=socket.socket()
sk.setblocking(False)
sk.bind(('127.0.0.1',))
sk.listen() inputs=[sk,] # 套接字接听对象,是socket或conn的一个或多个 while True:
rList,wList,eList=select.select(inputs,[],[],)
# 读,写,错误 3个列表
for server in rList:
if server==sk:
conn,addr=sk.accept()
inputs.append(conn)
else:
header_body_bytes=server.recv()
request=MyRequest(header_body_bytes)
view_method=None
for view_function in routers:
# 根据请求url通过路由交给不同的视乎函数处理
if request.url == view_function[]:
view_method=view_function[]
break
if not view_method:
response=MyResponse('').myrender()
else:
response=view_method(request)
server.sendall(response)
inputs.remove(server)
server.close()
#!/usr/bin/env python
# -*- coding: utf-8 -*- from wsgiref.simple_server import make_server # 下面2个视图函数
def indexfunc(request):
f=open(r'templates/index.html','rb')
data=f.read()
f.close()
print('执行了indexfunc')
return [data] def loginfunc(request):
request_method=request.get('REQUEST_METHOD')
if request_method=='GET':
f = open(r'templates/login.html', 'rb')
data = f.read()
f.close()
print('执行了login')
return [data] # 路由
routers=[
('/index',indexfunc),
('/login',loginfunc),
] drouters=dict(routers) def application(environ,start_response):
start_response('200 ok',[('Content-Type','text/html')])
path=environ.get('PATH_INFO')
print(path)
if drouters.get(path):
print('yeah')
return drouters.get(path)(environ)
else: return [b'<h1>404<h1>'] t=make_server('127.0.0.1',8989,application)
t.serve_forever()
写一个Python 1、通过select实现的最简单的web框架2、通过wsgiref实现的web框架的更多相关文章
- 写一个python的服务监控程序
写一个python的服务监控程序 前言: Redhat下安装Python2.7 rhel6.4自带的是2.6, 发现有的机器是python2.4. 到python网站下载源代码,解压到Redhat上, ...
- 如何手动写一个Python脚本自动爬取Bilibili小视频
如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...
- 写一个python脚本监控在linux中的进程
在虚拟机中安装Linux中的CentOS7系统 https://baijiahao.baidu.com/s?id=1597320700700593557&wfr=spider&for= ...
- 写一个Python的windows服务
1. 安装pywin32和pyinstaller pip install pywin32 pip install pyinstaller 2.写一个服务Demo # -*- coding: utf-8 ...
- 写一个python 爬虫爬取百度电影并存入mysql中
目标是利用python爬取百度搜索的电影 在类型 地区 年代各个标签下 电影的名字 评分 和图片连接 以及 电影连接 首先我们先在mysql中建表 create table liubo4( id in ...
- 如何写一个Python万能装饰器,既可以装饰有参数的方法,也可以装饰无参数方法,或者有无返回值都可以装饰
Python中的装饰器,可以有参数,可以有返回值,那么如何能让这个装饰器既可以装饰没有参数没有返回值的方法,又可以装饰有返回值或者有参数的方法呢?有一种万能装饰器,代码如下: def decorate ...
- 写一个python小程序
在windows环境下进行操作 window+R 输入cmd 创建一个文件夹 mkdir pytxt 创建一个py文件 py.py 用notepad或者记事本等工具进行编辑 或 首先声明pytho ...
- Hello Python!用 Python 写一个抓取 CSDN 博客文章的简单爬虫
网络上一提到 Python,总会有一些不知道是黑还是粉的人大喊着:Python 是世界上最好的语言.最近利用业余时间体验了下 Python 语言,并写了个爬虫爬取我 csdn 上关注的几个大神的博客, ...
- 手写一个python迭代器
分析 我们都知道一个可迭代对象可以通过iter()可以返回一个迭代器. 如果想要一个对象称为可迭代对象,即可以使用for,那么必须实现__iter __()方法. 在一个类的实例对象想要变成迭代器,就 ...
随机推荐
- Jenkins高级用法 - Pipeline 安装
一.总体介绍 总体介绍内容摘自 玩转Jenkins Pipeline(大宝鱼) 1.核心概念 Pipeline,简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的 ...
- count()聚合函数正确用法
count()聚合计算 count()是聚合函数,对于返回的结果集,一行行地判断,累计值加1,最后返回累计值,count(*).count(主键ID)和count(1)表示返回满足条件的结果集的总行数 ...
- JDK源码分析(11)之 BlockingQueue 相关
本文将主要结合源码对 JDK 中的阻塞队列进行分析,并比较其各自的特点: 一.BlockingQueue 概述 说到阻塞队列想到的第一个应用场景可能就是生产者消费者模式了,如图所示: 根据上图所示,明 ...
- React引领未来用户界面——心莱科技内部直播分享会
视频地址(请点开链接观看视频)https://v.qq.com/x/page/l08427ukdjo.html 本周,心莱科技在公司内部就开展了一场前端技术分享会,使用了直播模式进行分享,主要分享关于 ...
- java线程通信与协作小结 多线程中篇(十六)
在锁与监视器中我们对Object中的方法进行了简单介绍 以监视器原理为核心,三个方法:wait,notify.notifyAll,可以完成线程之间的通信 当然,不会像“语言”似的,有多种多样的沟通 ...
- [TCP/IP] 传输层-TCP和UDP的使用场景
传输层-TCP和UDP应用场景 TCP(传输控制协议) 需要将要传输的文件分段传输,建立会话,可靠传输,流量控制 UDP(用户报文协议) 一个数据包就能完成数据通信,不需要建立会话,不分段,不用流量控 ...
- 面试常问的几个排序和查找算法,PHP实现
冒泡,快排,二分查找,都是面试常问的几个算法题目,虽然简单,但是一段时间不用的话就很容易忘记,这里我用PHP实现了一下,温故而知新. 排序 冒泡排序 每一次冒出一个最大的值 function bubb ...
- 【esri-loader】帮助文档翻译 part1 是什么,怎么安装,为什么要用它
是什么 esri-loader是一个JavaScript库(包/模块,Web模块化编程的概念),用于在非Dojo框架的Web页面中加载ArcGIS API for JavaScript 3.x或4.x ...
- pyltp安装踩坑记录
LTP(Language Technology Platform)由哈工大社会计算与信息检索研究中心开发,提供包括中文分词.词性标注.命名实体识别.依存句法分析.语义角色标注等丰富. 高效.精准的自然 ...
- (详细)华为荣耀4X CHE-TL00H的usb调试模式在哪里打开的步骤
每当我们使用PC通过数据线链上安卓手机的时候,如果手机没有开启usb开发者调试模式,PC则没能成功读到我们的手机,有时,我们使用的一些功能较强的工具好比之前我们使用的一个工具引号精灵,老版本就需要打开 ...