一、Web框架本质

  • 所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端

二、Web框架功能

  • socket收发消息 —— wsgiref(测试)、uwsgi(线上)

  • 根据不同的路径返回不同的字符串

  • 返回动态页面(字符串的替换)—— jinja2

三、Web框架种类

  • django

    • 根据不同的路径返回不同的字符串

    • 返回动态页面(字符串的替换)

  • flask

    • 根据不同的路径返回不同的字符串

  • tornado

    • socket收发消息

    • 根据不同的路径返回不同的字符串

    • 返回动态页面(字符串的替换)

四、自定义web框架

  • 简单示例:socket服务端

    import socket
    # 创建一个socket对象
    sk = socket.socket()
    # 绑定IP和端口
    sk.bind(('127.0.0.1', 8000))
    # 监听
    sk.listen(5)
    # 等待连接
    while True:
    conn, addr = sk.accept()
    # 接收数据
    data= conn.recv(1024)
    print(data)
    # 返回数据
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>ok!</h1>')
    # 断开连接
    conn.close()
  • 根据不同路径返回不同的内容(普通版)

    import socket
    # 创建一个socket对象
    sk = socket.socket()
    # 绑定IP和端口
    sk.bind(('127.0.0.1', 8000))
    # 监听
    sk.listen(5)
    # 等待连接
    while True:
    conn, addr = sk.accept()
    # 接收数据
    data = conn.recv(1024)
    data = data.decode('utf-8')
    url = data.split()[1]
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    if url == '/index/':
    # 返回数据
    conn.send(b'<h1>index!</h1>')
    elif url == '/home/':
    conn.send(b'<h1>home!</h1>')
    else:
    conn.send(b'<h1>404 not found!</h1>')
    # 断开连接
    conn.close()

    普通版

    import socket
    # 创建一个socket对象
    sk = socket.socket()
    # 绑定IP和端口
    sk.bind(('127.0.0.1', 8000))
    # 监听
    sk.listen(5)
    # 函数
    def index(url):
    ret = '<h1>index!</h1>({})'.format(url)
    return ret.encode('utf-8')
    def home(url):
    ret = '<h1>home!</h1>({})'.format(url)
    return ret.encode('utf-8')
    # 等待连接
    while True:
    conn, addr = sk.accept()
    # 接收数据
    data = conn.recv(1024)
    data = data.decode('utf-8')
    url = data.split()[1]
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    if url == '/index/':
    # 返回数据
    ret = index(url)
    elif url == '/home/':
    ret = home(url)
    else:
    ret = b'<h1>404 not found!</h1>'
    conn.send(ret)
    # 断开连接
    conn.close()

    函数版

    import socket
    # 创建一个socket对象
    sk = socket.socket()
    # 绑定IP和端口
    sk.bind(('127.0.0.1', 8000))
    # 监听
    sk.listen(5)
    # 函数
    def index(url):
    ret = '<h1>index!</h1>({})'.format(url)
    return ret.encode('utf-8')
    def home(url):
    ret = '<h1>home!</h1>({})'.format(url)
    return ret.encode('utf-8')
    # 定义一个list1和实际要执行的函数的对应关系
    list1 = [
    ('/index/', index),
    ('/home/', home),
    ]
    # 等待连接
    while True:
    conn, addr = sk.accept()
    # 接收数据
    data = conn.recv(1024)
    data = data.decode('utf-8')
    url = data.split()[1]
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    func = None
    for i in list1:
    if url == i[0]:
    func = i[1]
    break
    if func:
    ret = func(url)
    else:
    ret = b'<h1>404 not found!</h1>'
    conn.send(ret)
    # 断开连接
    conn.close()

    函数进阶版

    import socket
    # 创建一个socket对象
    sk = socket.socket()
    # 绑定IP和端口
    sk.bind(('127.0.0.1', 8000))
    # 监听
    sk.listen(5)
    # 函数
    def index(url):
    with open('index.html','rb') as f:
    ret = f.read()
    return ret
    def home(url):
    ret = '<h1>home!</h1>({})'.format(url)
    return ret.encode('utf-8')
    # 定义一个list1和实际要执行的函数的对应关系
    list1 = [
    ('/index/', index),
    ('/home/', home),
    ]
    # 等待连接
    while True:
    conn, addr = sk.accept()
    # 接收数据
    data = conn.recv(1024)
    data = data.decode('utf-8')
    url = data.split()[1]
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    func = None
    for i in list1:
    if url == i[0]:
    func = i[1]
    break
    if func:
    ret = func(url)
    else:
    ret = b'<h1>404 not found!</h1>'
    conn.send(ret)
    # 断开连接
    conn.close()

    返回html页面

    import socket
    import time
    # 创建一个socket对象
    sk = socket.socket()
    # 绑定IP和端口
    sk.bind(('127.0.0.1', 8000))
    # 监听
    sk.listen(5)
    # 函数
    def index(url):
    with open('index.html', 'rb') as f:
    ret = f.read()
    return ret
    def home(url):
    ret = '<h1>home!</h1>({})'.format(url)
    return ret.encode('utf-8')
    def timer(url):
    now = time.strftime('%H:%M:%S')
    with open('time.html','r',encoding='utf-8') as f:
    data = f.read()
    data = data.replace('xxtimexx',now)

    return data.encode('utf-8')
    # 定义一个list1和实际要执行的函数的对应关系
    list1 = [
    ('/index/', index),
    ('/home/', home),
    ('/time/', timer),
    ]
    # 等待连接
    while True:
    conn, addr = sk.accept()
    # 接收数据
    data = conn.recv(1024)
    data = data.decode('utf-8')
    url = data.split()[1]
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    func = None
    for i in list1:
    if url == i[0]:
    func = i[1]
    break
    if func:
    ret = func(url)
    else:
    ret = b'<h1>404 not found!</h1>'
    conn.send(ret)
    # 断开连接
    conn.close()
    补充:time.html <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    <h1>当前时间是:@@time@@</h1>
    </body>
    </html>

    返回动态页面

五、wsgiref

  • 常用的WSGI服务器有uWSGI、Gunicorn

    • Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器

  • 简单示例:

    """
    根据URL中不同的路径返回不同的内容--函数进阶版
    返回HTML页面
    让网页动态起来
    wsgiref模块版
    """
    from wsgiref.simple_server import make_server # 将返回不同的内容部分封装成函数
    def index(url):
    # 读取index.html页面的内容
    with open("index.html", "r", encoding="utf8") as f:
    s = f.read()
    # 返回字节数据
    return bytes(s, encoding="utf8") def home(url):
    with open("home.html", "r", encoding="utf8") as f:
    s = f.read()
    return bytes(s, encoding="utf8") def timer(url):
    import time
    with open("time.html", "r", encoding="utf8") as f:
    s = f.read()
    s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S"))
    return bytes(s, encoding="utf8") # 定义一个url和实际要执行的函数的对应关系
    list1 = [
    ("/index/", index),
    ("/home/", home),
    ("/time/", timer),
    ] def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
    url = environ['PATH_INFO'] # 取到用户输入的url
    func = None
    for i in list1:
    if i[0] == url:
    func = i[1]
    break
    if func:
    response = func(url)
    else:
    response = b"404 not found!"
    return [response, ] if __name__ == '__main__':
    httpd = make_server('127.0.0.1', 8090, run_server)
    print("我在8090等你哦...")
    httpd.serve_forever()

    示例

六、jinja2

  1. 模板渲染现成的工具:jinja2

    • 下载jinja2:pip install jinja2

  2. 示例:

    from wsgiref.simple_server import make_server
    from jinja2 import Template def index(url):
    # 读取HTML文件内容
    with open("index2.html", "r", encoding="utf8") as f:
    data = f.read()
    template = Template(data) # 生成模板文件
    ret = template.render({'name': 'alex', 'hobby_list': ['抽烟', '喝酒', '烫头']}) # 把数据填充到模板中
    return bytes(ret, encoding="utf8") def home(url):
    with open("home.html", "r", encoding="utf8") as f:
    s = f.read()
    return bytes(s, encoding="utf8") # 定义一个url和实际要执行的函数的对应关系
    list1 = [
    ("/index/", index),
    ("/home/", home),
    ] def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
    url = environ['PATH_INFO'] # 取到用户输入的url
    func = None
    for i in list1:
    if i[0] == url:
    func = i[1]
    break
    if func:
    response = func(url)
    else:
    response = b"404 not found!"
    return [response, ] if __name__ == '__main__':
    httpd = make_server('127.0.0.1', 8090, run_server)
    print("我在8090等你哦...")
    httpd.serve_forever()
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
    </head>
    <body>
    <h1>姓名:{{name}}</h1>
    <h1>爱好:</h1>
    <ul>
    {% for hobby in hobby_list %}
    <li>{{hobby}}</li>
    {% endfor %}
    </ul>
    </body>
    </html>

    index2.html

浅谈 Web框架的更多相关文章

  1. 【架构】浅谈web网站架构演变过程

    浅谈web网站架构演变过程   前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变.   该系统具备的功能:   用户模块:用户注册和管理 商品模块:商品展示和管 ...

  2. [原创]浅谈Web UI自动化测试

    [原创]浅谈Web UI自动化测试 Web UI自动化测试相信大家都不陌生,今天来谈谈这个,我最早接触自动化测试时大约是在2004年,2006年当时在腾讯财付通算是开始正式接触自动化测试,之所以是正式 ...

  3. 浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)

    1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 ...

  4. 浅谈|WEB 服务器 -- Caddy

    浅谈|WEB 服务器 -- Caddy 2018年03月28日 12:38:00 yori_chen 阅读数:1490 标签: caddyserverwebhttps反向代理 更多 个人分类: ser ...

  5. 手撸ORM浅谈ORM框架之基础篇

    好奇害死猫 一直觉得ORM框架好用.功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! ...

  6. 手撸ORM浅谈ORM框架之Add篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  7. 手撸ORM浅谈ORM框架之Update篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  8. 手撸ORM浅谈ORM框架之Delete篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  9. 手撸ORM浅谈ORM框架之Query篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

随机推荐

  1. Xcode 11新建工程.--iOS 13 SceneDelegate适配

    收录文章::::::::::::::: iOS 13 适配要点总结 在Xcode 11 创建的工程,运行设备选择 iOS 13.0 以下的设备,运行应用时会出现黑屏现象.原因: Xcode 11 默认 ...

  2. Linux中IP配置

    一.获取网卡名称 ip a ifconfig(安装net-tools后可用) 二.进入网卡配置文件所在路径 cd /etc/sysconfig/network-scripts/ 三.编辑网卡配置文件 ...

  3. rabbitmq和kafka大概比较

    两者都是一个分布式架构 kafka 具有较高的吞吐量,rabbimq 吞吐量较小 rabbitmq 的可靠性更好,确认机制(生产者和 exchange,消费者和队列),支持事务,但会造成阻塞,委托(添 ...

  4. [日常] gocron源码阅读-go语言的变量

    变量的声明形式是这样的 var 变量名字 类型 = 表达式var ( AppVersion = "1.5" BuildDate, GitCommit string)类型可以被省略, ...

  5. jmeter beanshell断言接口自动化实例

    一.JMeter介绍 Apache JMeter是一款优秀的开源性能测试工具,在国外无论是在性能测试还是接口测试领域都有着非常高的使用率,但由于本身没有完善的中文文档以及典型开源工具特点(界面不美观) ...

  6. (转)SpringMVC表单多对象传递小技巧——@InitBinder

    转:https://www.jianshu.com/p/59771cbf373d 1.问题情景 项目中前端后台的数据传递是必不可少的,比如说我们要在一张表单中提交对象,如果只是一个对象就就很好做,因为 ...

  7. codevs 3304 水果姐逛水果街Ⅰ

    这道题可以用ST表过: 题目链接 记录4个数组:maxval[][], minval[][], ans[][], rans[][] maxval[i][j]表示从i号元素开始,长度为(1<< ...

  8. JVM调优YoungGC

    先上代码: 主函数:   public class GCDemo {       public static void main(String[] args) throws InterruptedEx ...

  9. 在net Core3.1上基于winform实现依赖注入实例

    目录 在net Core3.1上基于winform实现依赖注入实例 1.背景 2.依赖注入 2.1依赖注入是什么? 2.1依赖注入的目的 2.2依赖注入带来的好处 2.2.1生命周期的控制 2.2.2 ...

  10. javascript播放图片序列帧

    javascript播放图片序列帧1 先预加载<pre>var load_img = [];for(k=0;k<=16;k++){load_img.push( '/cjsxy/ima ...