#!/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框架的更多相关文章

  1. 写一个python的服务监控程序

    写一个python的服务监控程序 前言: Redhat下安装Python2.7 rhel6.4自带的是2.6, 发现有的机器是python2.4. 到python网站下载源代码,解压到Redhat上, ...

  2. 如何手动写一个Python脚本自动爬取Bilibili小视频

    如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...

  3. 写一个python脚本监控在linux中的进程

    在虚拟机中安装Linux中的CentOS7系统 https://baijiahao.baidu.com/s?id=1597320700700593557&wfr=spider&for= ...

  4. 写一个Python的windows服务

    1. 安装pywin32和pyinstaller pip install pywin32 pip install pyinstaller 2.写一个服务Demo # -*- coding: utf-8 ...

  5. 写一个python 爬虫爬取百度电影并存入mysql中

    目标是利用python爬取百度搜索的电影 在类型 地区 年代各个标签下 电影的名字 评分 和图片连接 以及 电影连接 首先我们先在mysql中建表 create table liubo4( id in ...

  6. 如何写一个Python万能装饰器,既可以装饰有参数的方法,也可以装饰无参数方法,或者有无返回值都可以装饰

    Python中的装饰器,可以有参数,可以有返回值,那么如何能让这个装饰器既可以装饰没有参数没有返回值的方法,又可以装饰有返回值或者有参数的方法呢?有一种万能装饰器,代码如下: def decorate ...

  7. 写一个python小程序

    在windows环境下进行操作 window+R 输入cmd  创建一个文件夹 mkdir pytxt 创建一个py文件 py.py  用notepad或者记事本等工具进行编辑 或 首先声明pytho ...

  8. Hello Python!用 Python 写一个抓取 CSDN 博客文章的简单爬虫

    网络上一提到 Python,总会有一些不知道是黑还是粉的人大喊着:Python 是世界上最好的语言.最近利用业余时间体验了下 Python 语言,并写了个爬虫爬取我 csdn 上关注的几个大神的博客, ...

  9. 手写一个python迭代器

    分析 我们都知道一个可迭代对象可以通过iter()可以返回一个迭代器. 如果想要一个对象称为可迭代对象,即可以使用for,那么必须实现__iter __()方法. 在一个类的实例对象想要变成迭代器,就 ...

随机推荐

  1. 【Android Studio安装部署系列】三十二、Android模拟器Genymotion安装使用教程详解

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 一.注册\登录 打开Genymotion官网,https://www.genymotion.com/ ,首先点击右上角的Sign in进行 ...

  2. WebUtils【MD5加密(基于MessageDigest)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 用于MD5加密,主要场景是在调用登录接口时对密码进行MD5加密处理. 效果图 暂不需要 代码分析 基于Java.security.M ...

  3. 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. jenkins maven 自动远程发布到服务器,钉钉提醒团队

    jenkins 自动远程发布到服务器 1.安装jenkins 安装过程:自行百度 英文不好的,不要装最新版的jenkins.建议安装Jenkins ver. 2.138.4,此版本可以设置中文语言,设 ...

  5. java内存溢出的情况解决方法

    内存溢出虽然很棘手,但也有相应的解决办法,可以按照从易到难,一步步的解决. 第一步,就是修改JVM启动参数,直接增加内存.这一点看上去似乎很简单,但很容易被忽略.JVM默认可以使用的内存为64M,To ...

  6. C#属性标记Order执行顺序备忘录

    部分Attribute有实现IOrderedFilter,其执行顺序机制例子: /// <summary> /// 密码修改 /// </summary> /// <pa ...

  7. C# 构造tree菜单工具方法

    如何构造tree数据结构,做个笔记,方便查阅,本方法是直接返回json字符串: private string ToMenuJson(List<Model> data, string par ...

  8. SpringBoot2.0整合Redis

    Spring Boot2.0在2018年3月份正式发布,相比1.0还是有比较多的改动,例如SpringBoot 自2.0起支持jdk1.8及以上的版本.第三方类库升级.响应式 Spring 编程支持等 ...

  9. Ajax常见面试题

    1,什么是ajax? 为什么要使用ajax? 1.ajax是"asynchornous javascript and xml "的缩写,指一种创建交互式网页应用的网页开发技术. 2 ...

  10. 给萌新的Flexbox简易入门教程

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://www.sitepoint.com/flexbox-css-flexible-bo ...