日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

bs架构的系统能连接mysql吗_HTTP、BS架构

發(fā)布時(shí)間:2023/12/10 数据库 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bs架构的系统能连接mysql吗_HTTP、BS架构 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Django 底層原理

快捷鍵

方向鍵

方向鍵本鍵如果活動(dòng)選項(xiàng)是選項(xiàng)按鈕或文件則為移動(dòng)焦點(diǎn);

方向鍵 + Win鍵(簡(jiǎn)稱Win鍵)使窗口全屏、最小化、靠左半邊、靠右半邊(部分版本不支持);

方向鍵+Shift鍵將連續(xù)的文字或文件選中

方向鍵(左右)+Ctrl鍵 在英文單詞或中文詞語間跳躍

方向鍵(上下)+Ctrl鍵 在段落開頭間跳躍

按Home(定位到行首)然后按Shift+End(行尾)或者 然后按Shift+↓ (下一行這個(gè)位置)

或者 按End(定位到行尾)然后按Shift+Home

ctrl

Ctrl+b 粗體 Bold

Ctrl+e 居中對(duì)齊 Encenter

Ctrl+f 查找 Find

Ctrl+h 替換 Huan

Ctrl+k 超級(jí)鏈接 King Link

win

Win鍵+E打開Windows資源管理器Explorer【即我的電腦、計(jì)算機(jī)】

Win鍵+R:運(yùn)行

Win鍵+Shift+S:Windows 自帶截圖

win鍵+PrtScSysRq鍵 快速截屏

HTTP

超文本傳輸協(xié)議(英文:HyperText Transfer Protocol,縮寫:HTTP)是一種用于分布式、協(xié)作式和超媒體信息系統(tǒng)的應(yīng)用層協(xié)議。HTTP是萬維網(wǎng)WEB的數(shù)據(jù)通信的基礎(chǔ)。

現(xiàn)今廣泛使用的一個(gè)版本——HTTP 1.1(已更新至2.0)

HTTP工作原理

HTTP協(xié)議定義Web客戶端如何從Web服務(wù)器請(qǐng)求Web頁面,以及服務(wù)器如何把Web頁面?zhèn)魉徒o客戶端。

HTTP協(xié)議采用了請(qǐng)求/響應(yīng)模型。

客戶端向服務(wù)器發(fā)送一個(gè)請(qǐng)求報(bào)文,請(qǐng)求報(bào)文包含請(qǐng)求的方法、URL、協(xié)議版本、請(qǐng)求頭部和請(qǐng)求數(shù)據(jù)。服務(wù)器以一個(gè)狀態(tài)行作為響應(yīng),響應(yīng)的內(nèi)容包括協(xié)議的版本、成功或者錯(cuò)誤代碼、服務(wù)器信息、響應(yīng)頭部和響應(yīng)數(shù)據(jù)。

響應(yīng)報(bào)文:比如"HTTP/1.1 200 OK"

以下是 HTTP 請(qǐng)求/響應(yīng)的步驟:

客戶端連接到Web服務(wù)器

一個(gè)HTTP客戶端,通常是瀏覽器,與Web服務(wù)器的HTTP端口(默認(rèn)為80)建立一個(gè)TCP套接字連接。例如,http://www.luffycity.com。

發(fā)送HTTP請(qǐng)求

通過TCP套接字,客戶端向Web服務(wù)器發(fā)送一個(gè)文本的請(qǐng)求報(bào)文,一個(gè)請(qǐng)求報(bào)文由請(qǐng)求行、請(qǐng)求頭部、空行和請(qǐng)求數(shù)據(jù)4部分組成。

服務(wù)器接受請(qǐng)求并返回HTTP響應(yīng)

Web服務(wù)器解析請(qǐng)求,定位請(qǐng)求資源。服務(wù)器將資源復(fù)本寫到TCP套接字,由客戶端讀取。一個(gè)響應(yīng)由狀態(tài)行、響應(yīng)頭部、空行和響應(yīng)數(shù)據(jù)4部分組成。

釋放連接TCP連接

若connection 模式為 close(無連接),則服務(wù)器主動(dòng)關(guān)閉TCP連接,客戶端被動(dòng)關(guān)閉連接,釋放TCP連接;若 connection 模式為 keepalive(短連接),則該連接會(huì)保持一段時(shí)間,在該時(shí)間內(nèi)可以繼續(xù)接收請(qǐng)求;

客戶端瀏覽器解析HTML內(nèi)容

客戶端瀏覽器首先解析狀態(tài)行,查看表明請(qǐng)求是否成功的狀態(tài)代碼。然后解析每一個(gè)響應(yīng)頭,響應(yīng)頭告知以下為若干字節(jié)的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應(yīng)數(shù)據(jù)HTML,根據(jù)HTML的語法對(duì)其進(jìn)行格式化,并在瀏覽器窗口中顯示。

例如:在瀏覽器地址欄鍵入U(xiǎn)RL,按下回車之后會(huì)經(jīng)歷以下流程:

瀏覽器向 DNS 服務(wù)器請(qǐng)求解析該 URL 中的域名所對(duì)應(yīng)的 IP 地址;

域名(英語:Domain Name),又稱網(wǎng)域,是由一串用點(diǎn)分隔的名字組成的Internet上某一臺(tái)計(jì)算機(jī)或計(jì)算機(jī)組的名稱,用于在數(shù)據(jù)傳輸時(shí)對(duì)計(jì)算機(jī)的定位標(biāo)識(shí)(有時(shí)也指地理位置)。

由于IP地址具有不方便記憶并且不能顯示地址組織的名稱和性質(zhì)等缺點(diǎn),人們?cè)O(shè)計(jì)出了域名,并通過域名服務(wù)器(DNS,Domain Name System)來將域名和IP地址相互映射,使人更方便地訪問互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的IP地址數(shù)串。

解析出 IP 地址后,根據(jù)該 IP 地址和默認(rèn)端口 80,和服務(wù)器建立TCP連接;

瀏覽器發(fā)出讀取文件(URL 中域名后面部分對(duì)應(yīng)的路徑(文件))的HTTP 請(qǐng)求,該請(qǐng)求報(bào)文作為 TCP 三次握手中第三次握手(由客戶端發(fā)送)時(shí)的報(bào)文數(shù)據(jù)發(fā)送給服務(wù)器;

服務(wù)器對(duì)瀏覽器請(qǐng)求作出響應(yīng),并把對(duì)應(yīng)的 html 文本發(fā)送給瀏覽器;

釋放 TCP連接;

瀏覽器將該 html 文本渲染并顯示內(nèi)容;

HTTP特點(diǎn):

基于 請(qǐng)求-響應(yīng) 的模式

HTTP協(xié)議規(guī)定,請(qǐng)求從客戶端發(fā)出,最后服務(wù)器端響應(yīng)該請(qǐng)求并返回。換句話說,肯定是先從客戶端開始建立通信的,服務(wù)器端在沒有接收到請(qǐng)求之前不會(huì)發(fā)送響應(yīng)

無狀態(tài)保存

概念:

HTTP是一種不保存狀態(tài),即無狀態(tài)(stateless)協(xié)議,即HTTP協(xié)議自身不對(duì)請(qǐng)求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存。

只要連接中斷,就撤銷當(dāng)前所有信息,即每次開始時(shí)都是個(gè)完全空白的狀態(tài)

目的:

為了更快地處理大量事務(wù),確保協(xié)議的可伸縮性,而特意把HTTP協(xié)議設(shè)計(jì)成如此簡(jiǎn)單的。

弊端:

信息的不存儲(chǔ),對(duì)于必須要存儲(chǔ)某些信息的網(wǎng)站來說,意味著:

我輸入一個(gè)網(wǎng)頁并回車,一個(gè)套接字返回我要訪問的html,然后他就走了,然后當(dāng)我要進(jìn)行登陸操作時(shí),又來了一個(gè)套接字接待我,給我返回登陸的網(wǎng)頁,然后他也走了。我在輸入完信息后回車進(jìn)行登陸,又一個(gè)套接字過來拿著我的請(qǐng)求中的信息去數(shù)據(jù)庫里進(jìn)行比對(duì),檢驗(yàn)完后,它就走了,臨走前返回我一個(gè)登陸成功,這時(shí),如果我要進(jìn)行基于用戶的操作時(shí),一個(gè)新的套接字過來說,你還沒登陸啊,怎么能進(jìn)行這個(gè)操作,我....

基于上述情況,cookie由此誕生。

無連接

概念:

無連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接。

目的:

采用這種方式可以節(jié)省傳輸時(shí)間,并且可以提高并發(fā)性能,不能和每個(gè)用戶建立長久的連接,請(qǐng)求一次響應(yīng)一次,服務(wù)端和客戶端就中斷了。

優(yōu)勢(shì):

適用于重瀏覽型網(wǎng)頁,騰出線程來接待新用戶,防止占用套接字不發(fā)請(qǐng)求的用戶。

短連接:

概念:

HTTP/1.1 版本之后,采用的是短連接的方式:即套接字響應(yīng)完后,不會(huì)馬上關(guān)閉,而是等待幾秒鐘的時(shí)間(程序員可以自行設(shè)定),如果客戶端在這段時(shí)間內(nèi)沒有響應(yīng)的話,才會(huì)斷開。

目的

這樣做的主要目的還是為了節(jié)省時(shí)間,因?yàn)橹匦聞?chuàng)建套接字也是需要時(shí)間的,目前默認(rèn)3s左右。對(duì)于一個(gè)連續(xù)操作的客戶端來說,如果他在短時(shí)間內(nèi)點(diǎn)擊了html中的很多選項(xiàng),這樣每次服務(wù)器都需要?jiǎng)?chuàng)建一個(gè)套接字來接待他,僅創(chuàng)建套接字的時(shí)間就足以拖垮效率。

而對(duì)于一個(gè)操作間隔很長的客戶端來說,無連接很明顯是個(gè)足夠優(yōu)秀的選擇

短連接等待時(shí)間

網(wǎng)站根據(jù)自己網(wǎng)站用戶的行為來分析統(tǒng)計(jì)出一個(gè)最優(yōu)的等待時(shí)間。

優(yōu)勢(shì):

適用于強(qiáng)操作性網(wǎng)頁,可以防止單個(gè)用戶短時(shí)間就占用多個(gè)套接字(因?yàn)闊o連接的方式,套接字響應(yīng)完請(qǐng)求就自行關(guān)閉了,所以新的請(qǐng)求就要重新建立套接字)。

因此,無連接、短連接沒有絕對(duì)的優(yōu)劣,主要還是看客戶端需求。

HTTP請(qǐng)求方法

get 拿數(shù)據(jù)

post 發(fā)數(shù)據(jù)

報(bào)文格式

請(qǐng)求報(bào)文

響應(yīng)報(bào)文

通過GET方式提交數(shù)據(jù)時(shí),請(qǐng)求數(shù)據(jù)(頁面提交的信息)會(huì)放在原路徑后,并與原路徑組成一個(gè)新的路徑部分,因此get方式提交時(shí)路徑部分不止有路徑,且后面的請(qǐng)求數(shù)據(jù)部分一定為空。

這種形式還會(huì)出現(xiàn)一個(gè)問題就是:

客戶端第一次訪問服務(wù)器時(shí),通常是以域名的形式訪問的,之后就通過點(diǎn)擊超鏈接或敲回車自動(dòng)轉(zhuǎn)載網(wǎng)頁的形式訪問服務(wù)器的其他頁面。

上述后者是以URL{域名(或ip)+路徑}的形式訪問服務(wù)器的,這就意味著,頁面在訪問服務(wù)器時(shí),域名+路徑會(huì)直接顯示在瀏覽器網(wǎng)址欄,即用戶的請(qǐng)求數(shù)據(jù)會(huì)以明文形式顯示在網(wǎng)址欄,這對(duì)于用戶的個(gè)人數(shù)據(jù)等信息來說是不能接受的。

GET方式以?分割路徑和請(qǐng)求數(shù)據(jù),請(qǐng)求數(shù)據(jù)中的參數(shù)之間以&相連,如EditBook?name=test1&id=123456.(請(qǐng)求頭里面那個(gè)content-type做的這種參數(shù)形式,后面講) POST方法是把頁面提交的數(shù)據(jù)放在HTTP包的請(qǐng)求數(shù)據(jù)中。

GET提交的數(shù)據(jù)大小有限制(因?yàn)闉g覽器對(duì)URL的長度有限制),而POST方法提交的數(shù)據(jù)沒有限制.

GET與POST請(qǐng)求在服務(wù)端獲取請(qǐng)求數(shù)據(jù)方式不同,就是我們自己在服務(wù)端取請(qǐng)求數(shù)據(jù)的時(shí)候的方式不同了,這句廢話昂。

HTTP狀態(tài)碼

所有HTTP響應(yīng)的第一行都是狀態(tài)行,依次是當(dāng)前HTTP版本號(hào),3位數(shù)字組成的狀態(tài)代碼,以及描述狀態(tài)的短語,彼此由空格分隔。比如"HTTP/1.1 200 OK"

狀態(tài)代碼的第一個(gè)數(shù)字代表當(dāng)前響應(yīng)的類型:

1xx消息——請(qǐng)求已被服務(wù)器接收,繼續(xù)處理

2xx成功——請(qǐng)求已成功被服務(wù)器接收、理解、并接受(沒問題)

3xx重定向——需要后續(xù)操作才能完成這一請(qǐng)求

4xx請(qǐng)求錯(cuò)誤——請(qǐng)求含有詞法錯(cuò)誤或者無法被執(zhí)行(客戶端請(qǐng)求出現(xiàn)問題)

5xx服務(wù)器錯(cuò)誤——服務(wù)器在處理某個(gè)正確請(qǐng)求時(shí)發(fā)生錯(cuò)誤(服務(wù)器出現(xiàn)問題)

URL

超文本傳輸協(xié)議(HTTP)的統(tǒng)一資源定位符將從因特網(wǎng)獲取信息的五個(gè)基本元素包括在一個(gè)簡(jiǎn)單的地址中(即一個(gè)完整的網(wǎng)頁):

傳送協(xié)議(http/https(http基礎(chǔ)上進(jìn)行加密,提升安全性))。

層級(jí)URL標(biāo)記符號(hào)(為[//],固定不變)

訪問資源需要的憑證信息(可省略)

服務(wù)器。(通常為域名,有時(shí)為IP地址)

端口號(hào)。(以數(shù)字方式表示,若為HTTP的默認(rèn)值“:80”可省略)

路徑。(以“/”字符區(qū)別路徑中的每一個(gè)目錄名稱,第一個(gè)/前就是域名(或IP)

查詢。(GET模式的窗體參數(shù),以“?”字符為起點(diǎn),每個(gè)參數(shù)以“&”隔開,再以“=”分開參數(shù)名稱與數(shù)據(jù),通常以UTF8的URL編碼,避開字符沖突的問題)

片段。以“#”字符為起點(diǎn)

以http://www.luffycity.com:80/news/index.html?id=250&page=1 為例,

其中:

http,是協(xié)議;

www.luffycity.com,是服務(wù)器;

80,是服務(wù)器上的默認(rèn)網(wǎng)絡(luò)端口號(hào),默認(rèn)不顯示;

/news/index.html,是路徑(URI:直接定位到對(duì)應(yīng)的資源);

?id=250&page=1,是查詢。

大多數(shù)網(wǎng)頁瀏覽器不要求用戶輸入網(wǎng)頁中“http://”的部分,因?yàn)榻^大多數(shù)網(wǎng)頁內(nèi)容是超文本傳輸協(xié)議文件。同樣,“80”是超文本傳輸協(xié)議文件的常用端口號(hào),因此一般也不必寫明。一般來說用戶只要鍵入統(tǒng)一資源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就可以了。

由于超文本傳輸協(xié)議允許服務(wù)器將瀏覽器重定向到另一個(gè)網(wǎng)頁地址,因此許多服務(wù)器允許用戶省略網(wǎng)頁地址中的部分,比如 www。從技術(shù)上來說這樣省略后的網(wǎng)頁地址實(shí)際上是一個(gè)不同的網(wǎng)頁地址,瀏覽器本身無法決定這個(gè)新地址是否通,服務(wù)器必須完成重定向的任務(wù)。

瀏覽器對(duì)頁面進(jìn)行渲染時(shí),需要html文件中通過各種方式引用的所有素材以及網(wǎng)頁的圖標(biāo),并且這個(gè)過程是以異步的形式向服務(wù)器發(fā)送請(qǐng)求的(遇到第一個(gè)需要的素材,就給服務(wù)器發(fā)請(qǐng)求說我要,然后html中的代碼繼續(xù)往下走)

rb形式發(fā)送文件數(shù)據(jù)時(shí),發(fā)送的只有文檔里的內(nèi)容,文件的外殼跟名字都沒有被發(fā)送

函數(shù)版web框架

from threading import Thread

import socket

server = socket.socket()

server.bind(('127.0.0.1',8001))

server.listen()

def html():

with open('home.html', 'rb') as f:

to_client_data = f.read()

return to_client_data

def css():

with open('home.css', 'rb') as f:

to_client_data = f.read()

return to_client_data

def js():

with open('home.js', 'rb') as f:

to_client_data = f.read()

return to_client_data

def jpg():

with open('1.jpg', 'rb') as f:

to_client_data = f.read()

return to_client_data

def ico():

with open('xx1.ico', 'rb') as f:

to_client_data = f.read()

return to_client_data

url_patterns = [

('/',html),

('/home.css',css),

('/home.js',js),

('/1.jpg',jpg),

('/favicon.ico',ico),

]

while 1:

conn,addr = server.accept()

from_client_msg = conn.recv(1024).decode('utf-8')

# print(from_client_msg)

# print(from_client_msg.decode('utf-8'))

request_path = from_client_msg.split(' ')[1]

# 拿到用戶的訪問路徑

print(request_path)

conn.send(b'HTTP/1.1 200 ok\r\n\r\n')

for i in url_patterns:

if i[0] == request_path:

# 進(jìn)行信息比對(duì),你要訪問的路徑在我的url-func關(guān)系中,就調(diào)用對(duì)應(yīng)的函數(shù)給他返回對(duì)應(yīng)頁面。

to_client_data = i[1]()

conn.send(to_client_data)

conn.close()

server.close()

并發(fā)版web框架

from threading import Thread

import socket

server = socket.socket()

server.bind(('127.0.0.1',8001))

server.listen()

def html(conn):

with open('home.html', 'rb') as f:

to_client_data = f.read()

conn.send(to_client_data)

conn.close()

# return to_client_data

def css(conn):

with open('home.css', 'rb') as f:

to_client_data = f.read()

conn.send(to_client_data)

conn.close()

def js(conn):

with open('home.js', 'rb') as f:

to_client_data = f.read()

conn.send(to_client_data)

conn.close()

def jpg(conn):

with open('1.jpg', 'rb') as f:

to_client_data = f.read()

conn.send(to_client_data)

conn.close()

def ico(conn):

with open('xx1.ico', 'rb') as f:

to_client_data = f.read()

conn.send(to_client_data)

conn.close()

url_patterns = [

('/',html),

('/home.css',css),

('/home.js',js),

('/1.jpg',jpg),

('/favicon.ico',ico),

]

while 1:

conn,addr = server.accept()

from_client_msg = conn.recv(1024).decode('utf-8')

request_path = from_client_msg.split(' ')[1]

print(request_path)

conn.send(b'HTTP/1.1 200 ok\r\n\r\n')

for i in url_patterns:

if i[0] == request_path:

target_thread = Thread(target=i[1],args=(conn,))

# to_client_data = i[1]()

target_thread.start()

server.close()

# 注意:這里不能跟函數(shù)web框架一樣在循環(huán)外關(guān)閉套接字、服務(wù)器

# 因?yàn)槲业拇a里只有一個(gè)變量名。通俗點(diǎn)形容:當(dāng)一個(gè)客戶來訪問服務(wù)器,我就創(chuàng)建一個(gè)線程給他個(gè)名字叫:conn,并讓她去服務(wù)這個(gè)客戶,他倆離開后,如果又來一個(gè)用戶,我就再創(chuàng)建一個(gè)線程,并且把之前那個(gè)線程的名字給拿走給這個(gè)新的線程,但是這樣并不影響之前的線程服務(wù)用戶,他倆玩他倆的。

# 但當(dāng)其中一個(gè)線程先運(yùn)行完后,他就會(huì)執(zhí)行循環(huán)外的conn.close(),這時(shí)如果正好創(chuàng)建了一個(gè)線程,把名字也給了,但是還沒來得及去服務(wù),他就被辭職了,這時(shí)沒人服務(wù)用戶了,程序就出錯(cuò)了!而且,在辭職完conn后,還要關(guān)門停止?fàn)I業(yè),這就不是我預(yù)期的效果了。

動(dòng)態(tài)頁面版web框架

動(dòng)態(tài)頁面的意思是:同一個(gè)url,我每次打開時(shí)都不同于之前。而非,帶閃圖、動(dòng)態(tài)等重復(fù)變化的頁面。

from threading import Thread

import socket

import time

server = socket.socket()

server.bind(('127.0.0.1',8001))

server.listen()

def html(conn):

current_time = time.time()

# import pymysql

with open('home.html', 'r',encoding='utf-8') as f:

to_client_data = f.read()

to_client_data = to_client_data.replace('%xxoo%',str(current_time))

conn.send(to_client_data.encode('utf-8'))

conn.close()

# return to_client_data

def css(conn):

with open('home.css', 'rb') as f:

to_client_data = f.read()

conn.send(to_client_data)

conn.close()

def js(conn):

with open('home.js', 'rb') as f:

to_client_data = f.read()

conn.send(to_client_data)

conn.close()

def jpg(conn):

with open('1.jpg', 'rb') as f:

to_client_data = f.read()

conn.send(to_client_data)

conn.close()

def ico(conn):

with open('xx1.ico', 'rb') as f:

to_client_data = f.read()

conn.send(to_client_data)

conn.close()

url_patterns = [

('/',html),

('/home.css',css),

('/home.js',js),

('/1.jpg',jpg),

('/favicon.ico',ico),

]

while 1:

conn,addr = server.accept()

from_client_msg = conn.recv(1024).decode('utf-8')

request_path = from_client_msg.split(' ')[1]

print(request_path)

conn.send(b'HTTP/1.1 200 ok\r\n\r\n')

for i in url_patterns:

if i[0] == request_path:

target_thread = Thread(target=i[1],args=(conn,))

# to_client_data = i[1]()

target_thread.start()

server.close()

wsgiref版web框架

wsgiref模塊是對(duì)socket的封裝,其內(nèi)部的environ是對(duì)http信息進(jìn)行了切割,并整理成一個(gè)字典,想要用戶的什么數(shù)據(jù),只要知道這個(gè)數(shù)據(jù)對(duì)應(yīng)的鍵名就可以直接拿到了,而什么數(shù)據(jù)對(duì)應(yīng)什么鍵都是其內(nèi)部定義好了的,所以用起來很方便。

Django中也有可以實(shí)現(xiàn)wsgiref模塊功能的元素,也是通過某些功能直接將http信息做好了切割,保存,通過指定方式去拿指定信息就可以了。

from wsgiref.simple_server import make_server

url_patterns = [('/index',index),]

def index():

with open('html', 'rb') as f:

to_client_data = f.read()

return to_client_data

def application(environ, start_response):

"""

:param environ: 封裝了所有的http協(xié)議相關(guān)信息--一個(gè)字典{'path_info':'/'}

:param start_response:

:return:

"""

request_path = environ['PATH_INFO']

# 通過固定鍵名'PATH_INFO'直接拿到用戶的請(qǐng)求路徑

for i in url_patterns:

if i[0] == request_path:

ret = i[1]()

start_response('200 OK', [('k1','v1'),])

# print(environ)

# print(environ['PATH_INFO'])

return [ret]

httpd = make_server('127.0.0.1', 8080, application)

httpd.serve_forever()

B/S概念

隨著Internet和WWW的流行,以往的主機(jī)/終端和C/S都無法滿足當(dāng)前的全球網(wǎng)絡(luò)開放、互連、信息隨處可見和信息共享的新要求,于是就出現(xiàn)了B/S架構(gòu),即瀏覽器/服務(wù)器結(jié)構(gòu)。它是C/S架構(gòu)的一種改進(jìn),可以說屬于三層C/S架構(gòu)。主要是利用了不斷成熟的WWW瀏覽器技術(shù),用通用瀏覽器就實(shí)現(xiàn)了原來需要復(fù)雜專用軟件才能實(shí)現(xiàn)的強(qiáng)大功能,并節(jié)約了開發(fā)成本,是一種全新的軟件系統(tǒng)構(gòu)造技術(shù)。

結(jié)構(gòu):

第一層是瀏覽器,即客戶端,只有簡(jiǎn)單的輸入輸出功能,處理極少部分的事務(wù)邏輯。由于客戶不需要安裝客戶端,只要有瀏覽器就能上網(wǎng)瀏覽,所以它面向的是大范圍的用戶,所以界面設(shè)計(jì)得比較簡(jiǎn)單,通用。

第二層是WEB服務(wù)器,扮演著信息傳送的角色。當(dāng)用戶想要訪問數(shù)據(jù)庫時(shí),就會(huì)首先向WEB服務(wù)器發(fā)送請(qǐng)求,WEB服務(wù)器統(tǒng)一請(qǐng)求后會(huì)向數(shù)據(jù)庫服務(wù)器發(fā)送訪問數(shù)據(jù)庫的請(qǐng)求,這個(gè)請(qǐng)求是以 SQL 語句實(shí)現(xiàn)的。

第三層是數(shù)據(jù)庫服務(wù)器,他扮演著重要的角色,因?yàn)樗娣胖罅康臄?shù)據(jù)。當(dāng)數(shù)據(jù)庫服務(wù)器收到了WEB服務(wù)器的請(qǐng)求后,會(huì)對(duì) SQL 語句進(jìn)行處理,并將返回的結(jié)果發(fā)送給WEB服務(wù)器,接下來,WEB服務(wù)器將收到的數(shù)據(jù)結(jié)果轉(zhuǎn)換為HTML文本形式發(fā)送給瀏覽器,也就是我們打開瀏覽器看到的界面。

原理

B/S架構(gòu)采取瀏覽器請(qǐng)求,服務(wù)器響應(yīng)的工作模式。

用戶可以通過瀏覽器去訪問Internet上由Web服務(wù)器產(chǎn)生的文本、數(shù)據(jù)、圖片、動(dòng)畫、視頻點(diǎn)播和聲音等信息;

而每一個(gè)Web服務(wù)器又可以通過各種方式與數(shù)據(jù)庫服務(wù)器連接,大量的數(shù)據(jù)實(shí)際存放在數(shù)據(jù)庫服務(wù)器中;

從Web服務(wù)器上下載程序到本地來執(zhí)行,在下載過程中若遇到與數(shù)據(jù)庫有關(guān)的指令,由Web服務(wù)器交給數(shù)據(jù)庫服務(wù)器來解釋執(zhí)行,并返回給Web服務(wù)器,Web服務(wù)器又返回給用戶。在這種結(jié)構(gòu)中,將許許多多的網(wǎng)連接到一塊,形成一個(gè)巨大的網(wǎng),即全球網(wǎng)。而各個(gè)企業(yè)可以在此結(jié)構(gòu)的基礎(chǔ)上建立自己的Internet。

在 B/S 模式中,用戶是通過瀏覽器針對(duì)許多分布于網(wǎng)絡(luò)上的服務(wù)器進(jìn)行請(qǐng)求訪問的,瀏覽器的請(qǐng)求通過服務(wù)器進(jìn)行處理,并將處理結(jié)果以及相應(yīng)的信息返回給瀏覽器,其他的數(shù)據(jù)加工、請(qǐng)求全部都是由Web Server完成的。通過該框架結(jié)構(gòu)以及植入于操作系統(tǒng)內(nèi)部的瀏覽器,該結(jié)構(gòu)已經(jīng)成為了當(dāng)今軟件應(yīng)用的主流結(jié)構(gòu)模式。

B/S優(yōu)缺點(diǎn)

B/S架構(gòu)最大的優(yōu)點(diǎn)是總體擁有成本低、維護(hù)方便、 分布性強(qiáng)、開發(fā)簡(jiǎn)單,可以不用安裝任何專門的軟件就能 實(shí)現(xiàn)在任何地方進(jìn)行操作,客戶端零維護(hù),系統(tǒng)的擴(kuò)展非常容易,只要有一臺(tái)能上網(wǎng)的電腦就能使用。

最大的缺點(diǎn)就是通信開銷大、系統(tǒng)和數(shù)據(jù)的安全性較難保障。

C/S與B/S

在響應(yīng)速度,用戶界面,數(shù)據(jù)安全等方面,C/S強(qiáng)于B/S,但是在業(yè)務(wù)擴(kuò)展和適用 www 條件下,B/S明顯勝過C/S。可以這么說,B/S的強(qiáng)項(xiàng)就是C/S的弱項(xiàng),反之亦然。它們各有優(yōu)缺點(diǎn),相互無法取代。

C/S結(jié)構(gòu)與B/S結(jié)構(gòu)兩種模式各自擁有其特色優(yōu)勢(shì),在不同的系統(tǒng)環(huán)境與操作平臺(tái)下,選擇較為接近或交叉進(jìn) 行混合模式的使用,可以保證數(shù)據(jù)的敏感性、安全性和穩(wěn)定發(fā)展,還可以加強(qiáng)對(duì)數(shù)據(jù)庫的修改與新增記錄的操作。 對(duì)客戶端程序進(jìn)行保護(hù),提高資源數(shù)據(jù)的交互性能,實(shí)現(xiàn)系統(tǒng)維護(hù)成本較低、維護(hù)方式較簡(jiǎn)便、布局更合理、網(wǎng)絡(luò)數(shù)據(jù)使用效率較高的目的,采用C/S與B/S混合模式才是最佳方案。

C/S與B/S不同點(diǎn)

C/S

B/S

硬件環(huán)境

專用網(wǎng)絡(luò)

廣域網(wǎng)

安全要求

面向相對(duì)固定的用戶群信息安全的控制能力強(qiáng)

面向不可知的用戶群對(duì)安全的控制能力相對(duì)較弱

程序架構(gòu)

更加注重流程系統(tǒng)運(yùn)行速度可較少考慮

對(duì)安全以及訪問速度都要多重的考慮,是發(fā)展趨勢(shì)

軟件重用

系統(tǒng)維護(hù)

升級(jí)難

開銷小,方便升級(jí)

處理問題

集中

分散

用戶接口

與操作系統(tǒng)關(guān)系密切

跨平臺(tái),與瀏覽器相關(guān)

信息流

交互性低

交互密集

總結(jié)

以上是生活随笔為你收集整理的bs架构的系统能连接mysql吗_HTTP、BS架构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。