模板

前言

要说到应用程序,就不得不提的就是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. python-21-生成器又是什么东西?

    前言 生成器,只要含有yield关键字的函数都是生成器函数,但yield不能和return共用且需要写在函数内. 生成器,是返回一个迭代器的函数,说白了生成器也是迭代器. 一.生成器简介 1.只要含有 ...

  2. gRPC用法

    官方文档 前置技能 protobuf 什么是 gRPC? A high performance, open-source universal RPC framework RPC : Remote Pr ...

  3. 如何把已有的本地git仓库,推送到远程新的仓库(github private)并进行远程开发;

    最近因为疫情,在家干活,连接不上之前的gitlab 服务器:所以不得把现有的代码迁移到github 的私有仓库来进行开发:下面简要记录迁移的过程: 首先,确保你已经配置好本地访问远程私有仓库的所有权限 ...

  4. Bilibili手机端下载的Download文件批量转换为MP4软件【Bilibili_DownVideoToMp4】原创发布

    Bilibili手机端下载的Download文件批量转换为MP4软件[Bilibili_DownVideoToMp4]原创发布 起因 Bilibili手机端的视频下载下来只能在手机上看,手机屏幕太小看 ...

  5. [CodeIgniter4]讲解-启动流程

    https://codeigniter.org.cn/forums/thread-31030-1-1.html CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工 ...

  6. 为什么要进行初始化(C语言)

    答案:是为了清除被释放的内存中保存的以前程序中留下的垃圾数据.

  7. Beego 过滤器

    过滤器 beego 支持自定义过滤中间件,例如安全验证,强制跳转等. 过滤器函数如下所示: beego.InsertFilter(pattern string, position int, filte ...

  8. LeetCode 867. 转置矩阵

    题目链接:https://leetcode-cn.com/problems/transpose-matrix/ 给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵 ...

  9. js阻止事件冒泡(phpcms,浮窗第一次10秒弹出后每30秒弹出,动态更换日期)

    /* v9_date_list 日期表 tiptime 考试日期(数据类型为日期) 如果要实现浮窗淡入淡出用jquery的("#main0").fadeIn(3500);淡出(&q ...

  10. Pikachu-RCE(远程命令/代码执行漏洞)

    RCE(remote command/code execute)概述 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行一般出现这种漏洞,是因为 ...