1. 程式人生 > 實用技巧 >Web應用和Web框架

Web應用和Web框架

一、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\r\n\r\n‘.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()

二、Web框架

1、什麼是Web框架?

Web框架(Web framework)是一種開發框架,用來支援動態網站、網路應用和網路服務的開發。

2、Web框架的特點

大多數的web框架提供了一套開發和部署網站的方式,也為web行為提供了一套通用的方法,並且實現了許多功能,開發人員使用框架提供的方法可以更快完成自己的業務邏輯,快速開發web應用,避免反覆造輪子,節省了許多時間和精力,大大提高了開發的效率。

三、wsgiref模組

(1)wsgi協議

wsgi協議簡單理解,就是wsgi server呼叫wsgi application介面的約定,即當有個請求到達wsgi server時,wsgi server通過呼叫wsgi application提供的介面來處理這個請求。

(2)wsgiref模組

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()

廣州VI設計公司https://www.houdianzi.com

這個例項程式的過程就是這樣幾步:

第一步,寫一個Web應用(application),即wsgiref application,除了函式,也可以是類(flask),引數為environ和start_response;
第二步,通過封裝socket,建立一個httped伺服器,並監聽8080埠(可隨機指定,不與其他程式埠衝突即可),等待使用者連線;
第三步,當有客戶端請求時,在瀏覽器顯示Hello, web字串。

注意兩點:

第一點:environ為一個字典,儲存系統變數以及請求相關屬性,例如請求路徑,請求引數,請求方法等等;start_response為函式,設定response的狀態碼和header,然後application函式的返回值為response的body。

第二點:response狀態碼設定為200時,表示請求成功,在headers新增返回資料型別為text/html,以及返回的response body為[b‘<h1>Hello web</h1>‘],返回的資料必須為二進位制字串。