当前位置: 首页 > 工具软件 > Threema Web > 使用案例 >

Web应用与Web框架

严宏旷
2023-12-01

目录

Web应用是什么?

Web框架

在Web中 HTTP协议、wsgi协议、Socket的关系:

wsgiref模块


Web应用是什么?

B/S架构的应用程序, b/s本质上也是c/s, 这里的B指的是浏览器, S包括两部分: server+application,
其中server是web服务器, server是实现了wsgi协议规定的socket, 现在使用的一般都是现成的,  常用的server有: Django使用的wsgi
application是业务逻辑, 

Web应用程序是一种可以通过Web访问的应用程序, 程序的最大好处是用户很容易访问应用程序, 用户只需要有浏览器即可, 不需要再安装其他软件.

应用程序有两种模式C/S、B/S. C/S是客户端/服务器端程序, 也就是说类程序一般独立运行. 而B/S就是浏览器端/服务端应用程序, 这类程序一般借助IE等浏览器来运行, Web应用程序一般是B/S模式. Web应用程序首先是''应用程序'', 和用标准的程序语言, 如C、C++等编写出来的程序没有什么本质上的不同. 然而Web应用程序又有自己独特的地方, 就是它是基于Web, 而不是采用传统方法运行的. 换句话说, 它是典型的浏览器/服务器架构的产物.

Web应用程序的优点:

  • 网络应用程序不需要任何复杂的'展开'过程, 所需要的知识一个使用的浏览器;

  • 网络应用程序通常耗费很少的用户硬盘空间, 或者一点都不耗费;

  • 他们不需要更新, 因为所有新的特性都在服务器上执行, 从而自动传达到用户端

  • 网络应用程序和服务器端的网络产品都很容易结合, 如email功能和搜索功能;

  • 因为他们在网络浏览器窗口中运行, 所以大多数情况下热门是通过跨平台使用的(例如Windows, Mac, Linux等)

Web应用程序的缺点:

  • 网络应用程序强调浏览器的实用性. 如果浏览器方没有提供特定的功能, 或者放弃使用特定的平台或者操作系统版本(导致不适用), 就会影响大量用户;

  • 网络应用依靠互联网远程服务端的应用文件, 因此, 当连接出问题时, 应用将不能正常使用.

  • 许多网络应用程序是不开源的, 只能依赖第三方提供的服务, 因此不能针对用户定制化、个性化, 而且大多数情况下用户不能离线使用, 因而损失了很多灵活性

  • 他们完全依赖应用服务商的可及性. 如果公司倒闭, 服务器停止使用, 用户也无法追索以前的资料, 对比而看, 即使软件制造商倒闭了, 传统的安装软件也可以继续执行,尽管不能有更新或者有其他用户服

  • 相似的, 提供方公司对软件和其功能有了更大的控制权。只要他们愿意就能为软件添加新特性,即使用户想等bugs先被解决再更新。跳过较差的软件版本也不可能了。公司可以强加不受欢迎的特性给用户,也可以随意减少带宽来削减开支。

B/S架构的优点:

浏览器/服务器架构(Browser/Server,简称B/S)能够很好地应用在广域网上,成为越来越多的企业的选择。浏览器/服务器架构相对于其他几种应用程序体系结构,有如下3方面的优点:

  • 这种架构采用Internet上标准的通信协议(通常是TCP/IP协议)作为客户机同服务器通信的协议。这样可以使位于Internet任意位置的人都能够正常访问服务器。对于服务器来说,通过相应的Web服务和数据库服务可以对数据进行处理。对外采用标准的通信协议,以便共享数据。

  • 在服务器上对数据进行处理,就处理的结果生成网页,以方便客户端直接下载。

  • 在客户机上对数据的处理被进一步简化,将浏览器作为客户端的应用程序,以实现对数据的显示。不再需要为客户端单独编写和安装其他类型的应用程序。这样,在客户端只需要安装一套内置浏览器的操作系统,直接安装一套浏览器,就可以实现服务器上数据的访问。而浏览器是计算机的标准设备

简单总结: 本质上,浏览器是一个socket客户端, 服务器是一个socket服务端

我们下面来使用python基于socket写一个web应用:

import socket

def server_run():
    soc = socket.socket()
    soc.bind(('127.0.0.1', 8008))
    soc.listen(5)
    while True:
        conn, addr = soc.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><img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg"></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('@@@',now)
        conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))
        conn.close()

if __name__ == '__main__':
    server_run()

html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>@@@</h2>

<img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg" alt="">
</body>
</html>

Web框架

Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器都是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。

在Web中 HTTP协议、wsgi协议、Socket的关系:

我们知道http协议是浏览器和服务器之间进行通信的标准和规定,http协议是浏览器和服务器都能解析的一种通信方式, 他们之间进行要进行收发数据首先要有一个完整的连接才可以, socket是来创建这个基础连接的,socket基于TCP/IP创建好连接之后, 就可以发送http请求的内容了, 根据http规定的格式, 在浏览器端按照规定方式(请求首行, 请求头,请求体)发送http请求(本质上还是基于socket建立的连接发送的), 服务器收到请求之后, 经过解析确定是http请求, 就会按照http的响应方式返回去一个响应(响应首行, 响应头,响应体), 在处理请求的过程中, 服务器会对请求体中的数据内容进行解析, 然后进行拆分, 拆分成一定的格式到,socket下边对应的函数中进行一系列的逻辑处理,然后返回一个数据给浏览器, 在浏览器接收到服务器返回的数据之后,在进行相应的处理, 这样就完成了一次完整的请求和相应,, 
那么wsgi协议是用来干嘛的呢, 首先wsgi是一个专门为使用python语言来进行搭建B/S架构的时候的一种协议, 这个协议规定了,在服务器就收到请求内容之后,对请求内容拆分的具体标准和格式, 这个拆分的事情是在所写的socket中进行的, 使用wsgi相关的模块对请求内容进行处理, 然后交给对应的函数去处理, 最后返回数据,   那到这里我们之前所说的application就可以很好的解释了, 它主要是用来写业务逻辑的, 这里的业务逻辑是根据具体的路由分配的响应函数中的业务逻辑, 可以说我们使用的框架比如Django或者自己写简单的框架,都是在写application部分, 这个部分相当于是把socket中的业务逻辑处理部分单独拿出来进行扩展, 比如我们的Django框架, Django中的app就是完成的这个功能, 又因为所有的逻辑处理都写在一个py文件中代码的可读性,可扩展性和可管理性等都会变差, 所以在app中又进行了分层, 分成不同的层,来处理不同的业务逻辑.Django的这种处理方式我们称为MTV模型, MTV模型是基于MVC模型的!!!

HTTP协议详情请点击                            MTV与MVC模型详解

wsgiref模块

最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。而wsgiref模块就是python基于wsgi协议开发的服务模块。

wsgiref的简单应用:

from wsgiref.simple_server import make_server

def mya(environ, start_response):
    print(environ)
    start_response('200 OK', [('Content-Type', 'text/html')])
    if environ.get('PATH_INFO') == '/index':
        with open('index.html','rb') as f:
            data=f.read()

    elif environ.get('PATH_INFO') == '/login':
        with open('login.html', 'rb') as f:
            data = f.read()
    else:
        data=b'<h1>Hello, web!</h1>'
    return [data]

if __name__ == '__main__':
    myserver = make_server('', 8011, mya)
    print('监听8010')
    myserver.serve_forever()

wsgiref只是遵循wsgi协议的模块之一,是我们现在使用的主流模块, 在测试阶段我们使用wsgiref就可以, 但是到项目上线的时候,要使用uwsgi, 因为wsgiref是不支持高并发的, uwsgi是支持高并发的, 其他同样实现了该功能的模块还有:
 

'cgi': CGIServer,
    'flup': FlupFCGIServer,
    'wsgiref': WSGIRefServer,
    'waitress': WaitressServer,
    'cherrypy': CherryPyServer,
    'paste': PasteServer,
    'fapws3': FapwsServer,
    'tornado': TornadoServer,
    'gae': AppEngineServer,
    'twisted': TwistedServer,
    'diesel': DieselServer,
    'meinheld': MeinheldServer,
    'gunicorn': GunicornServer,
    'eventlet': EventletServer,
    'gevent': GeventServer,
    'geventSocketIO':GeventSocketIOServer,
    'rocket': RocketServer,
    'bjoern' : BjoernServer,
    'auto': AutoServer,

 

 类似资料: