一、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. Android集成极光推送

    要说学习极光推送,个人感觉官方文档就非常好啦,但是没法,人太懒啦,为了下次能够快速的将极光推送集成到项目中,故结合之前开发的项目和官方文档记录下简单的Android集成极光推送,在这之前,先上一张简单 ...

  2. Java实现单链表反转操作

    单链表是一种常见的数据结构,由一个个节点通过指针方式连接而成,每个节点由两部分组成:一是数据域,用于存储节点数据.二是指针域,用于存储下一个节点的地址.在Java中定义如下: public class ...

  3. MySQL事务。

    相关资料:https://zhuanlan.zhihu.com/p/70701037        https://zhuanlan.zhihu.com/p/59061106 一.事务. 1.概念.事 ...

  4. Python—函数的参数传递

    形参和实参 形参即形式参数,函数完成其工作时所需的信息.形参不占用内存空间,只有在被调用时才会占用内存空间,调用完了即被释放. 实参即实际参数,调用函数时传给函数的信息. # -*- coding: ...

  5. [日常] 小白来装机基本概念BIOS与硬盘分区

    这两天因为在linux进行测试,先是搞坏了linux的系统,然后在重装linux系统后搞坏了引导.在修复引导的过程中,搞坏了本机的win8系统,再次修复引导与重装linux后,linux可以访问了,w ...

  6. Lnmp架构部署动态网站环境.2019-7-2-1.1

    一.Mysql简介 Mysql数据库: 1.社区版 2.商业版 3.cluster集群 Mysql安装方式 1.编译安装 2.yum/rpm 3.二进制包,直接解压,无需编译 二.Mysql安装部署 ...

  7. PHP转Go系列:数组与切片

    数组的定义 用过PHP的同学应该很清楚,无论多么复杂的数据格式都可以用数组来表达,什么类型的数据都可以往里塞,它是工作必备的一部分,使用很简单,易用程度简直变态. $array = [1, 'name ...

  8. 26.Java基础_状态修饰符

    状态修饰符: final(最终态),static(静态) final关键字: 修饰类: 修饰局部变量: static关键字: 修饰变量:   修饰函数:

  9. 201871010111-刘佳华《面向对象程序设计(java)》第十二周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十二周学习总结 实验十   集合与GUI初步 实验时间 2019-11-14 第一部分:基础知识总结 第九章知识总结 1. ...

  10. SpringMVC拦截器(四)

    拦截器,本质类似于AOP,主要的应用场景: 日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV等. 权限检查:如登录检测,进入处理器检测是否登录,没有登录返回登录页面. 性能监控:记录 ...