模板

前言

要说到应用程序,就不得不提的就是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框架的更多相关文章

  1. 纯手撸web框架

    纯手撸web框架 一.Web应用的组成 接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返 ...

  2. wsgiref模块、web框架、django框架简介

    """web框架:将前端.数据库整合到一起的基于互联网传输的python代码 web框架也可以简单的理解为是软件开发架构里面的'服务端'""" ...

  3. 手撸Spring框架,设计与实现资源加载器,从Spring.xml解析和注册Bean对象

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你写的代码,能接的住产品加需求吗? 接,是能接的,接几次也行,哪怕就一个类一片的 i ...

  4. 写一个Python 1、通过select实现的最简单的web框架2、通过wsgiref实现的web框架

    #!/usr/bin/env python # -*- coding: utf- -*- import socket import select class MyRequest: "&quo ...

  5. 手写web框架之加载Controller,初始化框架

    1,加载Controller     我们需要创建 一个ControllerHelper类,让它来处理下面的逻辑:      通过ClassHelper我们可以获取所有定义了Controller注解的 ...

  6. 手写web框架之实现依赖注入功能

    我们在Controller中定义了Service成员变量,然后在Controller的Action方法中调用Service成员变量的方法,那么如果实现Service的成员变量? 之前定义了@Injec ...

  7. 手写web框架之实现Bean容器

    实现Bean容器    使用ClassHelper可以获取所加载的类,但无法通过类来实例化对象,因此我们需要提供一个反射工具类,让它封装java反射相关的API,对外提供更好用的工具方法.将该类命名为 ...

  8. 手写web框架之加载配置项目

    一  定义框架配置项 在项目的src/main/resources目录下创建一个名为smart.propertiesd的文件,文件的内容如下: smart.framework.jdbc.driver= ...

  9. web框架的本质(使用socket实现的最基础的web框架、使用wsgiref实现的web框架)

    import socket def handle_request(client): data = client.recv(1024) client.send("HTTP/1.1 200 OK ...

随机推荐

  1. ssh远程连接到Ubuntu

    1.ubuntu首先得安装ssh sudo apt-get install openssh-server 2.启动ssh sudo /etc/init.d/ssh start 3.检查是否开启 ps ...

  2. c# 关于抓取网页源码后中文显示乱码的原因分析和解决方法

    原因分析:首先,目前大多数网站为了提升网页浏览传输速率都会对网站内容在传输前进行压缩,最常用的是GZIP压缩解压解压算法,也是支持最广的一种. 因为网站传输时采用的是GZIP压缩传输,如果我们接受we ...

  3. RMAN中MAXSETSIZE和MAXPIECESIZE的用法

    MAXSETSIZE跟MAXPIECESIZE用法 区别:maxpiecesize设置的是备份完成后的备份片大小,对备份整体的大小没有影响,比如一个G的备份完成文件,maxpiecesize设置为10 ...

  4. LeetCode 面试题 02.01. 移除重复节点

    编写代码,移除未排序链表中的重复节点.保留最开始出现的节点. 示例1: 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3]示例2: 输入:[1, 1, 1, 1, 2] 输出:[1, ...

  5. Git 的 .gitignore 配置说明 (C#)

    1.配置语法: 以斜杠“/”开头表示目录: 以星号“*”通配多个字符: 以问号“?”通配单个字符 以方括号“[]”包含单个字符的匹配列表: 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录: 此外,g ...

  6. day 8 函数编程_byets

    定义 bytes类型是指一堆字节的集合,在python中以b开头的字符串都是bytes类型 b'\xe5\xb0\x8f\xe7\x8c\xbf\xe5\x9c\x88' #b开头的都代表是bytes ...

  7. Java多线程之互斥锁Syncharnized

    public class Bank { private int money; private String name; public Bank(String name, int money) { th ...

  8. win10创建本地用户

    win+r,输入lusrmgr.msc win+i

  9. iframe中子父页面跨域通讯

    目录 #跨域发送信息 #跨域接收信息 #示例Demo 在非跨域的情况下,iframe中的子父页面可以很方便的通讯,但是在跨域的情况下,只能通过window.postMessage()方法来向其他页面发 ...

  10. Email-发送邮件

    Email 发送邮件 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIME ...