写一个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 __()方法. 在一个类的实例对象想要变成迭代器,就 ...
随机推荐
- 《HelloGitHub》第 27 期
公告 网站新增了简单的搜索功能,可以通过项目名称或地址搜索.查看项目.欢迎star和推荐项目,我们一只在路上,希望志同道合者加入进来. 现招募专栏负责人: C# Java <HelloGitHu ...
- GoLang structTag说明
在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容.形如 type User struct { UserId int `json:"use ...
- 1.4部署到IIS「深入浅出ASP.NET Core系列」
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 很多人第一次在IIS中部署Asp.Net Core App的人都会遇到问题,会发现原来的部署方式无法运行Asp.N ...
- 微服务之consul(一)
一.概述 consul是google开源的一个使用go语言开发的服务发现.配置管理中心服务.内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案,不再需要依 ...
- Java设计模式系列-装饰器模式
原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...
- SpringCloud系列——Bus 消息总线
前言 SpringCloud Bus使用轻量级消息代理将分布式系统的节点连接起来.然后可以使用此代理广播状态更改(例如配置更改)或其他管理指令.本文结合RabbitMQ+GitHub的Webhook实 ...
- [Nodejs] node的fs模块
fs 模块 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作 API. Node 导入文件系统模块(fs).Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如 ...
- 第三章 CLR如何解析引用类型
C#编译器将代码打包成托管模块后,接着会将这些模块合并成程序集,然后统一加载到一个具体的目录,CLR在这个目录查找并且加载所需要的DLL或者exe. 程序集分类:弱命名程序集和强命名程序集,强命名程序 ...
- WebSocketSharp 的使用
Server 端示例代码: class Program { static void Main(string[] args) { var wssv = new WebSocketServer(" ...
- Linux高级运维 第三章 Linux基本命令操作
3.1 Linux终端介绍.Shell提示符.Bash基本语法 3.1.1 登录LINUX终端 两种终端仿真器:1.GNOME桌面的GHOME Terminal : 2.KDE桌面的Konsole ...