使用wsgiref手撸web框架
模板
前言
要说到应用程序,就不得不提的就是cs架构和BS架构
所谓的cs架构就是client端和server端,就像我们的电脑上的qq,微信等应用程序
bs架构就是浏览器端和server端,我们不需要写客户端了,直接用浏览器接收来自server端的数据,进行解析
手写简易的server端
import socket
soc=socket.socket() #实例化socket
soc.bind(('127.0.0.1',8001)) #绑定ip地址和端口
soc.listen(5)#监听
while True:
sock,addr=soc.accept()#等待客户端连接
sock.send(b'HTTP/1.1 200 OK\r\nContent-Type:Text/html\r\n\r\n')#发送请求头和请求报文
data=str(sock.recv(1024),encoding='utf-8')#将请求过来的数据解析成字符串
print(data)
data=data.split('\r\n')[0].split(' ')#将请求中的第一行提取出来
if '/index' in data:
with open('index.html','rb') as f:
ff=f.read()
print(ff)
sock.send(ff)#响应请求内容
else:
sock.send(b'')
sock.close()
使用wsgiref手撸web框架
web框架运行文件wsgirefserver.py
# 这是一个web框架的测试模板wsgiref
from wsgiref.simple_server import make_server
from urlss import *
def run(env, response):
print(env)
print(response)
response('200 OK', [('Content-type', 'text/html')]) # 请求报文
position = env['PATH_INFO'] # 拿到请求体中的路由
func = None
for url in urls:
if url[0] == position:
func = url[1]
break
if func:
response = func()
else:
response = error()
return [response.encode('utf-8'), ]
if __name__ == '__main__':
ser = make_server('127.0.0.1', 8001, run)
ser.serve_forever()
视图views.py
#!/user/bin/env python3
# -*- coding: utf-8 -*-
import time
import datetime
from jinja2 import Template
import sys
import pymysql
def index():
with open('templates/index.html', 'r') as f:
data = f.read()
return data
def test():
with open('templates/test.html', 'r') as f:
data = f.read()
tem = Template(data)
response = tem.render(user={'name': 'andy', 'age': 18})
return response
def timer():
ctime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
print(ctime)
with open('templates/time.html', 'r') as f:
data = f.read()
data = data.replace('@@time@@', ctime)
return data
def error():
return ''
def user():
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='admin', db='web')
cur = conn.cursor(pymysql.cursors.DictCursor)
cur.execute('select * from userinfo')
user_list = cur.fetchall()
print(user_list)
with open('templates/user.html', 'r') as f:
data = f.read()
tem = Template(data)
response = tem.render(user_list=user_list)
return response
if __name__ == '__main__':
user()
路由urlss.py
#!/user/bin/env python3
# -*- coding: utf-8 -*-
from views import *
urls = [
('/index', index),
('/timer', timer),
('/test', test),
('/user', user),
]
templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>index</h3>
<h2 style="color: red;">this is red wrod</h2>
<img src="http://106.14.187.174/static/blog/img/rest_framework.jpg" alt="">
</body>
</html>
templates/test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{user.name}}
{{user.age}}</h1>
</body>
</html>
templates/time.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
@@time@@
</body>
</html>
templates/user.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<h1>hello</h1>
<h2>andy table</h2>
<table border="2">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>password</th>
</tr>
</thead>
<tbody>
{% for user in user_list %}
<tr>
<td>{{user.id}}</td>
<td>{{user.name}}</td>
<td>{{user.password}}</td>
</tr>
{%endfor%}
</tbody>
</table>
</body>
</html>
使用wsgiref手撸web框架的更多相关文章
- 纯手撸web框架
纯手撸web框架 一.Web应用的组成 接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返 ...
- wsgiref模块、web框架、django框架简介
"""web框架:将前端.数据库整合到一起的基于互联网传输的python代码 web框架也可以简单的理解为是软件开发架构里面的'服务端'""" ...
- 手撸Spring框架,设计与实现资源加载器,从Spring.xml解析和注册Bean对象
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你写的代码,能接的住产品加需求吗? 接,是能接的,接几次也行,哪怕就一个类一片的 i ...
- 写一个Python 1、通过select实现的最简单的web框架2、通过wsgiref实现的web框架
#!/usr/bin/env python # -*- coding: utf- -*- import socket import select class MyRequest: "&quo ...
- 手写web框架之加载Controller,初始化框架
1,加载Controller 我们需要创建 一个ControllerHelper类,让它来处理下面的逻辑: 通过ClassHelper我们可以获取所有定义了Controller注解的 ...
- 手写web框架之实现依赖注入功能
我们在Controller中定义了Service成员变量,然后在Controller的Action方法中调用Service成员变量的方法,那么如果实现Service的成员变量? 之前定义了@Injec ...
- 手写web框架之实现Bean容器
实现Bean容器 使用ClassHelper可以获取所加载的类,但无法通过类来实例化对象,因此我们需要提供一个反射工具类,让它封装java反射相关的API,对外提供更好用的工具方法.将该类命名为 ...
- 手写web框架之加载配置项目
一 定义框架配置项 在项目的src/main/resources目录下创建一个名为smart.propertiesd的文件,文件的内容如下: smart.framework.jdbc.driver= ...
- web框架的本质(使用socket实现的最基础的web框架、使用wsgiref实现的web框架)
import socket def handle_request(client): data = client.recv(1024) client.send("HTTP/1.1 200 OK ...
随机推荐
- C#连接数据库的方法
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- 剑指offer-面试题58_2-左旋转字符串-字符串
/* 题目: 将字符串的前sep个字符转移到字符串尾部. */ /* 思路: 更好的方法: 先翻转前sep个字符,再翻转后面的字符,最后全体翻转. */ #include<iostream> ...
- Mac视频下载转换器MovieSherlock使用教程
MovieSherlock for Mac是什么软件?moviesherlock for Mac是运行在Mac平台上一款专业的视频下载转换工具,能快速的下载和转换YouTube电影,并保持原视频的质量 ...
- 牛客网剑指offer第13题——调整数组顺序使得奇数位于偶数前面
题目来源:剑指offer 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变 ...
- js内置对象的常用属性和方法(Array | String | Date | Math)
js内置对象:Array String Math Date <!DOCTYPE html> <html lang="en"> <head> ...
- 根据ip列表模拟输出redis cluster的主从对应关系
需求:给点一批ip列表,一个数组或者一个文件,每行一个ip,模拟输出redis cluster的组从关系,前者是master_ip:master_port -> slave_ip:slave_p ...
- mongo shell
mongo shell mongo 连接 本地 mongo # 连接127.0.0.1:27017 远程 mongo "mongodb://mongodb0.example.com:2801 ...
- 循环删除List集合的元素
之前在使用list集合循环删除元素的时候,竟然出现了集合内的元素不能删除成功的问题,之后整理了一下,发现大有玄机! 1.如果指定了list的size大小,会出现下标越界异常 List<Strin ...
- 各大原厂看好MRAM发展
MRAM是一种以电阻为存储方式结合非易失性及随机访问两种特性,可以兼做内存和硬盘的新型存储介质.写入速度可达NAND闪存的数千倍,此外,其制作工艺要求低,良品率高,可以很好的控制成本.在寿命方面,由于 ...
- Linux设置文件权限和归属
前言:在Linux文件系统的安全模型中,为系统中的文件(或目录)赋予了两个属性:访问权限和文件所有者,简称为“权限”和“归属”.其中,访问权限包括读取.写入.可执行三种基本类型,归属包括属主(拥有该文 ...