浅谈 Web框架

一、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>当前时间是:@@[email protected]@</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(‘@@[email protected]@‘, 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

原文地址:https://www.cnblogs.com/zengyi1995/p/11328892.html

时间: 2024-11-10 14:12:29

浅谈 Web框架的相关文章

浅谈Web自适应

浅谈Web自适应 2016-08-13 前端大全 前端大全 (点击上方公众号,可快速关注我们) 来源:卖烧烤夫斯基 链接:www.cnblogs.com/constantince/p/5708930.html 前言 随着移动设备的普及,移动web在前端工程师们的工作中占有越来越重要的位置.移动设备更新速度频繁,手机厂商繁多,导致的问题是每一台机器的屏幕宽度和分辨率不一样.这给我们在编写前端界面时增加了困难,适配问题在当下显得越来越突出.记得刚刚开始开发移动端产品的时候向设计MM要了不同屏幕的设计

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

浅谈web网站架构演变过程 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变. 该系统具备的功能: 用户模块:用户注册和管理 商品模块:商品展示和管理 交易模块:创建交易和管理 阶段一.单机构建网站 网站的初期,我们经常会在单机上跑我们所有的程序和软件.此时我们使用一个容器,如tomcat.jetty.jboos,然后直接使用JSP/servlet技术,或者使用一些开源的框架如maven+spring+struct+hibernate.maven+spri

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

1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 全Socket层(SSL)等等,目前互联网主要使用它做静态资源服务器,也可以做代理服务器转发请求(如:图片链等),结合tomcat等 servlet容器处理jsp.1.2.ngnix     —— 俄罗斯人开发的一个高性能的 HTTP和反向代理服务器.由于Nginx 超越 Apache 的高性能和稳

浅谈数据库框架,见笑,请多指正

浅谈数据库框架,见笑,请多指正 http://weibo.com/p/1001603724746155003486 一友说"插件式存储又割裂了SQL引擎的完整逻辑...总体而言在现有框架下MySQL的优化器没有多大改进的价值". 我们且做个技术分析: 1 插件式框架,可以静态/动态加载组件,方便在同类不同属家的模块间切换,这种设计是良好的. 很多软件的设计都采用了"微内核+插件"这样的方式构筑了强大的应用.如Ecplise生态圈. 2 数据库范围内, MySQL的属

2014-07-29 浅谈MVC框架中Razor与ASPX视图引擎

今天是在吾索实习的第15天.随着准备工作的完善,我们小组将逐步开始手机端BBS的开发,而且我们将计划使用MVC框架进行该系统的开发.虽然我们对MVC框架并不是非常熟悉,或许这会降低我们开发该系统的效率,但是我们可以通过边学边做的方式来实现其开发的.这不仅便于我们日后对系统的管理与维护,而且还给我们带来一个学习的动力与实践的地方. 但我们在创建一个基于MVC框架的项目时,就遇到一些问题了.那就是MVC的视图引擎是有两种的,一种是Razor,会以cshtml后缀的文件作为视图文件:另一种是ASPX,

浅谈web前端开发

有部分同学和朋友问到过我相关问题.利用周末我就浅浅地谈谈我对web前端开发的理解和体会,仅仅能浅浅谈谈,高手请自己主动跳过本篇文章. 毕竟我如今经验并非非常足,连project师都算不上,更不用说大牛了.今天也不谈技术.技术非常多人比我掌握得更好,也大同小异.可是每一个人的理解体会是不一样的. 对前端开发的三个整体理解和体会 我对前端开发的整体体会有三: 第一:杂而难,难度甚至超过了一般的后台开发,假设有人认为前端开发简单仅仅能说明他还没有入门. 第二:web前端开发正在向响应式和移动端方向大步

浅谈web前端就业的学习路线

初级前端 主要学习三个部分:HTML,CSS,JavaScript 一.html + css部分: 这部分特别简单,到网上搜资料,书籍视频非常多.css中盒子模型,流动,block,inline,层叠,样式优先级等这些自学起来也是非常容易.最后再深入了解下浏览器差异性,ie9以下兼容简单了解就行了,ie9以下浏览器被淘汰掉是趋势,低版本没必要浪费大量时间去学习兼容主流浏览器,google chrome浏览器.firefox浏览器.safari浏览器.opera浏览器即可.浏览器差异内容很多,建议

浅谈 Flask 框架

一.框架对比 Django Flask Admin —— Model 原生无 Model 原生无 Form 原生无 Session 有 —— 颠覆认知操作 Django —— 教科书式框架 优势:组件全,功能全,教科书 劣势:占用资源,创建复杂度高 Flask —— 以简单为基准开发,一切从简,能省则省 优势:轻,块 劣势:先天不足,第三方组件稳定性较差 二.Flask入门 下载安装 下载:pip install Flask 注意:不要使用工具中的插件创建 Flask 项目 三行代码启动Flas

浅谈angular框架

最近新接触了一个js框架angular,这个框架有着诸多特性,最为核心的是:MVVM.模块化.自动化双向数据绑定.语义化标签.依赖注入,以上这些全部都是属于angular特性,虽然说它的功能十分的强大,在开发中非常的实用,对于初接触者来说,要想熟练使用仍然需要一些时间来熟悉其中基础的语法规则,一些基本的用法,虽然说代码不需要死记硬背,但是对于新学习一个知识点,记住其中的一些基础概念,基本的用法,在这里不是提倡大家去背一些代码,该处谈到的熟悉指的是自己多动手去写,实在是想不起了再查看资料,尽量凭借