zoukankan      html  css  js  c++  java
  • Web应用和Web框架

    一、Web应用

    二、Web框架

    三、wsgiref模块

    一、Web应用

      1、什么是Web应用?

      Web应用程序是一种可以通过Web访问的应用程序,特点是用户很容易访问,只需要有浏览器即可,不需要安装其他软件。

      2、Web应用程序的模式

      应用程序有两种模式,即C/S、B/S两种,C/S是客户端/服务器端程序,这类程序一般独立运行;而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助谷歌,火狐等浏览器来运行。Web应用程序一般是B/S模式。在网络编程的意义下,浏览器是一个socket客户端,服务器是一个socket服务端。

      3、实例

    import socket   # 导入模块
    
    def handle_request(client):
        request_data = client.recv(1024)  # 接收数据
        print('request data:',request_data)
        client.send('HTTP/1.1 200 OK
    
    '.encode('utf8'))  # 发送请求
        client.send("<h1 style='color:blue'>Hello world</h1>".encode('utf8')) 
    
    
    def main():
        sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 实例化
        sock.bind(('localhost',8800)) # 指定连接的服务器及端口
        sock.listen(5)  # 监听
    
        while True:
            print('waiting....')
            connection,address = sock.accept()  # 收到数据
            handle_request(connection)  #处理连接
            connection.close()  # 关闭连接
    
    if __name__ == '__main__':
        main()

       注意: 

    报文格式:
    
    请求/响应首行
    请求/响应头
    请求头
    请求头
    ...
    
    请求/响应体(如user=cc&pwd=123)# 注意:只有POST请求才会有请求体,请求头与请求体之间使用“
    
    ”进行区分,其余请求首行、请求头之间均用“
    ”分隔
    
    b'GET / HTTP/1.1
    Host: 127.0.0.1:8080
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.134 Safari/537.36 Vivaldi/2.5.1525.40
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    
    '
    
    
    b'POST / HTTP/1.1
    Host: 127.0.0.1:8080
    Connection: keep-alive
    Content-Length: 15
    Cache-Control: max-age=0
    Origin: http://127.0.0.1:8080
    Upgrade-Insecure-Requests: 1
    Content-Type: application/x-www-form-urlencoded
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.134 Safari/537.36 Vivaldi/2.5.1525.40
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
    Referer: http://127.0.0.1:8080/
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
    
    user=cc&pwd=123'
    View Code

    二、Web框架

      1、什么是Web框架?

      Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。

      2、Web框架的特点

      大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法,并且实现了许多功能,开发人员使用框架提供的方法可以更快完成自己的业务逻辑,快速开发web应用,避免反复造轮子,节省了许多时间和精力,大大提高了开发的效率。

    三、wsgiref模块

      1、wsgi协议

      最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。如果要动态生成HTML,就需要把上述步骤自己来实现。

      接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花很长时间去读HTTP规范。

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

      这个接口就是WSGI:Web Server Gateway Interface。

      wsgi协议简单理解,就是wsgi server调用wsgi application接口的约定,即当有个请求到达wsgi server时,wsgi server通过调用wsgi application提供的接口来处理这个请求。

      2、wsgiref模块

      wsgiref模块就是python基于wsgi协议开发的服务模块。wsgiref模块是由server和handler组成,server用于监听端口,接收请求;handler用于处理请求。

      3、wsgiref简单示例

    #!/usr/bin/env python3
    #!-*- coding:utf-8-*-
    # write by cc
    
    from wsgiref.simple_server import make_server
    
    def application(environ,start_response):
        # environ : 按照http协议解析数据,解析后的数据格式为字典
        # start_response : 按照http协议的格式组装数据
        print(environ,type(environ)) # <class 'dict'>
        # return [b"<h1>Hello Web</h1>"] # 返回的格式必须是列表,内容必须是二进制数据
        path = environ.get("PATH_INFO")  # 获取当前路径
        start_response('200 Ok',[('Content_Type','text/html')]) #
        if path == '/index':
            with open('index.html','r') as f:
                data = f.read()
        elif path == '/login':
            with open('login.html','r') as f:
                data = f.read()
    
        return [data.encode('utf-8')]
    
    '''
     environ = {'ALLUSERSPROFILE': 'C:\ProgramData', 'APPDATA': 'C:\Users\CC9102\AppData\Roaming', 'COMMONPROGRAMFILES': 'C:\Program Files\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\Program Files (x86)\Common Files', 'COMMONPROGRAMW6432': 'C:\Program Files\Common Files', 'COMPUTERNAME': 'DESKTOP-3UMV17V', 'COMSPEC': 'C:\Windows\system32\cmd.exe', 'DRIVERDATA': 'C:\Windows\System32\Drivers\DriverData', 'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer', 'FPS_BROWSER_USER_PROFILE_STRING': 'Default', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\Users\CC9102', 'LOCALAPPDATA': 'C:\Users\CC9102\AppData\Local', 'LOGONSERVER': '\\DESKTOP-3UMV17V', 'NUMBER_OF_PROCESSORS': '4', 'ONEDRIVE': 'C:\Users\CC9102\OneDrive', 'ONEDRIVECONSUMER': 'C:\Users\CC9102\OneDrive', 'OS': 'Windows_NT', 'PATH': 'D:\python37\;D:\python37\Scripts\;D:\python27\;D:\python27\Scripts;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;D:\UltraEdit;D:\Calibre\;C:\Users\CC9102\AppData\Local\Microsoft\WindowsApps;D:\Bandizip\', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 61 Stepping 4, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '3d04', 'PROGRAMDATA': 'C:\ProgramData', 'PROGRAMFILES': 'C:\Program Files', 'PROGRAMFILES(X86)': 'C:\Program Files (x86)', 'PROGRAMW6432': 'C:\Program Files', 'PSMODULEPATH': 'C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules', 'PUBLIC': 'C:\Users\Public', 'PYCHARM_HOSTED': '1', 'PYTHONIOENCODING': 'UTF-8', 'PYTHONPATH': 'E:\PyCharmFiles', 'PYTHONUNBUFFERED': '1', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\Windows', 'TEMP': 'C:\Users\CC9102\AppData\Local\Temp', 'TMP': 'C:\Users\CC9102\AppData\Local\Temp', 'USERDOMAIN': 'DESKTOP-3UMV17V', 'USERDOMAIN_ROAMINGPROFILE': 'DESKTOP-3UMV17V', 'USERNAME': 'CC9102', 'USERPROFILE': 'C:\Users\CC9102', 'WINDIR': 'C:\Windows', 'SERVER_NAME': 'DESKTOP-3UMV17V.DHCP HOST', 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8080', 'REMOTE_HOST': '', 'CONTENT_LENGTH': '', 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.2', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/', 'QUERY_STRING': '', 'REMOTE_ADDR': '127.0.0.1', 'CONTENT_TYPE': 'text/plain', 'HTTP_HOST': '127.0.0.1:8080', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.134 Safari/537.36 Vivaldi/2.5.1525.40', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9', 'wsgi.input': <_io.BufferedReader name=468>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>} <class 'dict'>
    
     'PATH_INFO': '/', 'QUERY_STRING': '', 'REMOTE_ADDR': '127.0.0.1',
     'CONTENT_TYPE': 'text/plain',
     'HTTP_HOST': '127.0.0.1:8080',
     'HTTP_CONNECTION': 'keep-alive', 
    '''
    
    
    # 封装socket(实例化一个socket对象,并传入参数)
    httped = make_server("",8080,application)
    
    # 等待用户连接,相当于 conn,addr = sock.accept(),用户连接后自动调用application方法
    httped.serve_forever()

      这个实例程序可以看作是一个Web框架,它的实现过程就是这样几步:

      第一步,写一个Web应用(application),即wsgiref application,除了函数,也可以是类(flask),参数为 environ和start_response;

      第二步,通过封装socket,创建一个httped服务器,并监听8080端口(可随机指定,不与其他程序端口冲突即可),等待用户连接;

      第三步,当有客户端请求时得到匹配,即用户输入对应网址时,在浏览器显示对应的页面。

      注意两点:

      第一点:environ为一个字典,保存系统变量以及请求相关属性,例如请求路径,请求参数,请求方法等等;start_response为函数,设置response的状态码和header,然后application函数的返回值为response的body。

      第二点:response状态码设置为200时,表示请求成功,在headers添加返回数据类型为text/html,返回的数据必须为二进制字符串。

  • 相关阅读:
    trackr: An AngularJS app with a Java 8 backend – Part III
    trackr: An AngularJS app with a Java 8 backend – Part II
    21. Wireless tools (无线工具 5个)
    20. Web proxies (网页代理 4个)
    19. Rootkit detectors (隐形工具包检测器 5个)
    18. Fuzzers (模糊测试器 4个)
    16. Antimalware (反病毒 3个)
    17. Debuggers (调试器 5个)
    15. Password auditing (密码审核 12个)
    14. Encryption tools (加密工具 8个)
  • 原文地址:https://www.cnblogs.com/schut/p/11013587.html
Copyright © 2011-2022 走看看