web应用

一、什么是web应用

web(World Wide Web)即全球广域网,也称为万维网,它是基于超文本和http的、全球性的、动态交互的、跨平台的建立在internet上的一种分布式图形信息系统,也是一种网络服务

简单来说就是可以通过浏览器来访问的应用程序,web最大的好处就是访问简易,用户只需要有浏览器即可,不需要额外的软件。这也称为B/S架构,即浏览器/服务器架构(Browser/Server)。其本质是socket间通信:浏览器为socket客户端,服务器是socket服务端

1、web开发的阶段

  • web1.0阶段
    • 简单快捷的早起版本,主要以静态web页面、CGI、ASP/JSP/PHP等
    • 好处就是简单快捷,本地起一个 Tomcat 或 Apache 就能开发,后续因为Service 越来越多,调用关系变复杂,前端搭建本地环境不再是一件简单的事。考虑团队协作,往往会考虑搭建集中式的开发服务器来解决。这种解决方案对编译型的后端开发来说也许还好,但对前端开发来说并不友好
  • 后端为主的MVC时代
    • 为了降低复杂度,以后端为出发点,有了 Web Server 层的架构升级,比如 Structs、Spring MVC 等,这是后端的 MVC 时代。
  • Ajax的SPA时代(web2.0)
    • CDN 开始大量用于静态资源存储,于是出现了 JavaScript 王者归来的 SPA (Single Page Application 单页面应用)时代。web2.0从此以Ajax概念为契机诞生
  • 前端为主的MV*时代
    • 为了降低前端开发的复杂度,涌入了大量框架,这些框架总的原则是先按类型分层,比如 Templates、Controllers、Models,然后再在层内做切分
  • web3.0
    • .....

2、web的优点

  • 开发成本低,好维护、跨平台
    • 网站可以根据不同的终端设备进行调整,不需要为不同设备开发不同版本的网站
  • 客户端友好
    • 只需要客户端有一个浏览器即可,不会额外安装其他软件
  • 无需客户端做额外维护操作(更新)
    • 几乎所有维护操作都在服务端完成

3、web的缺点

  • 依赖于网络,当连接出现问题,应用将无法
  • 渲染性能差
  • 依赖提供商
    • 完全依赖于web提供商,如果提供商倒闭,那么应用将完全无法访问,无法做到像传统安装的软件,即使提供商倒闭,也可以继续使用,无非是无法得到更新和维护
  • 客户侧可控性弱
    • 提供商如果要推行新版,那么意味着客户仅能使用提供的新版,而不存在客户侧自主选择是否要升级应用版本
  • 隐私性弱
    • web完全依赖于网络,想比于本地一些应用,理论上提供商可以获取用户所有的行为,可能存在隐患

二、基于SOCKET的web应用

# main.py
import socket


def server_run():
    s = socket.socket()
    s.bind(('127.0.0.1', 8080))
    s.listen(5)
    while True:
        conn, addr = s.accept()
        recv_data = conn.recv(1024)
        print(recv_data)
        """
        # 1 直接在send里写,发送给客户端
        conn.send(
            b'HTTP/1.1 200 OK\r\n\r\n<h1>hello web</h1>'
            b'<img src="https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"></img>')
        """

        """
        # 2 打开一个html文件,发送给客户端
        with open('index.html', 'r', encoding='utf-8') as f:
            data = f.read()
        conn.send(('HTTP/1.1 200 OK\r\n\r\n%s' % data).encode('utf-8'))
        """

        # 3 动态网页,字符串替换
        import time
        now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        print(now)
        with open('index.html', 'r', encoding='utf-8') as f:
            data = f.read()
        data = data.replace('localtime', now)
        conn.send(('HTTP/1.1 200 OK\r\n\r\n%s' % data).encode('utf-8'))
        conn.close()

        
if __name__ == '__main__':
    server_run()
<!--index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>localtime</h1>

<img src="https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"></img>

</body>
</html>

三、基于socket简易web框架

web框架的3个核心功能

  • 收发消息(socket功能)
  • 根据用户不同路径执行不同的函数
  • 从响应信息构造返回或从htlm文件中读取内容,并完成字符串的替换

python中比较主流的框架:Django、Flask、Tornado

# main.py
import socket


def indexes(url):
    with open("index.html", "r", encoding="utf-8") as f:
        rd = f.read()
        rd = rd.replace("$@index$@", "首页")
    return bytes(rd, encoding="utf-8")


def tests(url):
    with open("test.html", "r", encoding="utf-8") as f:
        rd = f.read()
        rd = rd.replace("$@test$@", "测试")
    return bytes(rd, encoding="utf-8")


def fun404(url):
    ret = "<h1>not found!</h1>"
    return bytes(ret, encoding="utf-8")


# 建立url与函数名的对应关系
url_func = [
    ("/index/", indexes),
    ("/test/", tests)
]

def run():
    sk = socket.socket()
    sk.bind(("127.0.0.1", 8000))
    sk.listen()

    while True:
        conn, addr = sk.accept()
        data = conn.recv(1024)
        if not data:
            continue

        # 获取请求路径信息
        data_str = str(data)
        print(data_str)
        line = data_str.split("\r\n")
        print(line)
        url = line[0].split()[1]

        # url_func对应关系,确定反馈信息并反馈
        conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
        func = None
        for i in url_func:
            if i[0] == url:
                func = i[1]
                break
        if not func:
            func = fun404
        rep = func(url)
        conn.send(rep)
        conn.close()

if __name__ == '__main__':
    run()
<!--index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>localtime</h1>

<img src="https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"></img>

</body>
</html>

<!--test.html -->
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>test页面</title>
    </head>
    <body>
        <h1>$@index$@</h1>
    </body>
</html>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343