模板

前言

要说到应用程序,就不得不提的就是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. JS中变量、作用域的本质,定义及使用方法

    全局作用域和局部作用域 全局作用域 局部作用域:函数作用域 全局作用域在全局和局部都可以访问到,局部作用域只能在局部被访问到 var name="cyy"; function fn ...

  2. P2024 NOI2001 种类冰茶鸡

    展开 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种, ...

  3. 消息队列 ActiveMQ的简单了解以及点对点与发布订阅的方法实现ActiveMQ

    Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件: 由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行. Act ...

  4. js Dom为页面中的元素绑定键盘或鼠标事件

    html鼠标事件 onload 页面加载 onclick 鼠标单击 onmouseover 鼠标移入 onmouseout 鼠标移出 onfocus 获取焦点 onblur 失去焦点 onchange ...

  5. js函数的使用+封装+代码复用

    javascript 函数 return 后面没有返回值 代表提早退出语句,return后面的语句都不再执行 此时返回值为undefined <!DOCTYPE html> <htm ...

  6. 纪中20日c组模拟赛T1 2121. 简单游戏

    T1 2121. 简单游戏 (File IO): input:easy.in output:easy.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 Goto Pro ...

  7. hibernate.exception.GenericJDBCException: could not extract ResultSet 解决办法

    这句话翻译过来就是无法提取ResultSet 我在联查表的视图的时候发现的问题,明明之前好好的 那么你就得想想了 你再把错误信息往上翻翻,能不能看到   no viable alternative a ...

  8. ssh 或 putty 连接linux报错解决方法

    由于当天多次输入错误密码,ssh和putty就连接不上了,纠结了很久解决问题 ssh连接提示错误:server unexpectedly closed network connection putty ...

  9. Uva12034 (组合数取模)

    题意:两匹马比赛有三种比赛结果,n匹马比赛的所有可能结果总数 解法: 设答案是f[n],则假设第一名有i个人,有C(n,i)种可能,接下来还有f(n-i)种可能性,因此答案为 ΣC(n,i)f(n-i ...

  10. 输出redis cluster集群所有节点指定的参数的配置

    需要:实现类似redis-trib.rb call 命令的功能,输出redis cluster集群所有节点指定的参数的配置 redis-trib.rb的输出 [redis@lxd-vm3 ~]$ re ...