一、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. Python3使用线程

    Python2标准库中提供了两个模块thread和threading支持多线程.thread有一些缺陷在Python3中弃用,为了兼容性,python3 将 thread 重命名为 "_th ...

  2. Python的 Datetime 、 Logging 模块

    Datetime模块 datetime是python处理时间和日期的标准库 类名 date类        日期对象,常用的属性有 year . month . day time类        时间 ...

  3. linux--top工具分析

    top分析工具详解 第一行:10:01:23 当前系统时间126 days, 14:29 系统已经运行了126天14小时29分钟(在这期间没有重启过)2 users 当前有2个用户登录系统   loa ...

  4. 并发编程学习笔记(七、Thread源码分析)

    目录: 常见属性 构造函数 start() run() 常见属性: /** * 线程名称 */ private volatile String name; /** * 线程优先级 */ private ...

  5. selenium添加chrome配置项

    selenium虽然强大,但也有不方便的地方,selenium每次启动浏览器都是一个全新的浏览器,并没有加载任何的配置,这样在爬取一些需要登陆才能看到的页面时就有些不太方便.但我们可以通过加载chro ...

  6. LeetCode 分治算法

    分治算法:是将问题划分为一些独立的子问题,递归的求解个子问题,然后合并子问题的解而得到原问题的解. 分治算法步骤 step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题: ...

  7. day53_9_17 django数据库表关联,路由和视图

    一.数据库的关系建立. 在原生的数据库语句中,建立表与表之间的联系,就是添加一个字段,将联系的表的id值添加到该字段中. django所作的也就是这些. 以图书管理系统为例,图书管理系统有四张表:书籍 ...

  8. 使用JaCoCo统计单元测试代码覆盖率

    1 JaCoCo介绍 JaCoCo是EclEmma团队基于多年覆盖率库使用经验总结而研发的一个开源的Java代码覆盖率库. 2 JaCoCo覆盖率计数器 JaCoCo 包含了多种尺度的覆盖率计数器(C ...

  9. 小明工具箱<Excel 插件><VSTO 插件>

    当前版本:1.0.42.7118(更新日期:2019年6月28日) 下载地址:点击下载 功能和简介: 本程序为 Excel 2010 版本以上的插件,含以下功能: 拆分工作簿:将一个或多个工作簿中的每 ...

  10. ubutnu 挂载磁盘

    1. 查看已挂载的磁盘 df -h 2. 查看可挂载的磁盘 fdisk -l 3. 创建挂载点 mkdir /media/HDD 注意: /media/HDD 必须为空文件夹 4. 挂载 sudo m ...