中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

49web開(kāi)發(fā)1_http_wsgiref-創(chuàng)新互聯(lián)

目錄

為大荔等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及大荔網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、大荔網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

cs和bs:... 1

http協(xié)議:... 2

http消息:... 3

Request:... 3

常見(jiàn)傳遞信息的方式:... 3

Response:... 4

wsgi:... 5

wsgi app應(yīng)用程序端:... 6

wsgi server服務(wù)器端:... 7

測(cè)試用命令:... 9

QUERY_STRING查詢字符串解析:... 9

web開(kāi)發(fā):

cs和bs:

c和s之間需使用socket,約定協(xié)議、版本(往往使用tcp、udp),指定地址和端口,就可以通信;

c和s傳輸數(shù)據(jù),數(shù)據(jù)可以有一定的格式,雙方必須先約定好;

b和s:

b,一種特殊client,支持http(s)協(xié)議,能通過(guò)url向服務(wù)器發(fā)起請(qǐng)求,等待服務(wù)器端返回html等數(shù)據(jù),并在browser內(nèi)可視化展示的程序;

s,支持http(s),能接受眾多客戶端發(fā)起的http協(xié)議請(qǐng)求,經(jīng)過(guò)處理,將html等數(shù)據(jù)返回給b;

本質(zhì)上,bs是一種特殊的cs:

即客戶端必須是一種支持http協(xié)議且能解析并渲染html的軟件;

服務(wù)端必須是能接收多客戶端的http訪問(wèn)的服務(wù)器軟件;

客戶端開(kāi)發(fā)或前端開(kāi)發(fā);

服務(wù)端開(kāi)發(fā),py可學(xué)wsgi、django、flask、tornado等;

py,web框架:

早期cgi;

wsgi,web server gateway interface,可看作是一種底層協(xié)議,它規(guī)定了服務(wù)器程序和應(yīng)用程序各自實(shí)現(xiàn)什么接口,py的實(shí)現(xiàn)為wsgiref庫(kù);

flask,基于wsgi,微框架;

django,基于wsgi,開(kāi)源的web框架,巨無(wú)霸;

http協(xié)議:

是無(wú)狀態(tài)的、面向連接的協(xié)議;

無(wú)狀態(tài),同一個(gè)客戶端的兩次請(qǐng)求,從服務(wù)端角度來(lái)說(shuō),它并不知道這兩個(gè)請(qǐng)求來(lái)自同一個(gè)客戶端;

解決:通過(guò)cookie(session或token)來(lái)判斷;

面向連接:

有連接,基于tcp是面向連接,需3次握手4次斷開(kāi);

短連接:http1.0是一個(gè)請(qǐng)求一個(gè)連接,而tcp創(chuàng)建銷毀成本高,對(duì)server有很大影響;http1.1,支持keep-alive,默認(rèn)開(kāi)啟,一個(gè)連接打開(kāi)后會(huì)保持一段時(shí)間(可設(shè)置),b再訪問(wèn)該s就使用這個(gè)tcp連接,減輕了服務(wù)器壓力,提高了效率;

cookie:

為解決http的無(wú)狀態(tài),用到cookie(sessionID或token);

一般,cookie信息是服務(wù)端生成,返回給客戶端的;

客戶端可自己設(shè)置cookie信息;

鍵值對(duì)信息,有時(shí)效;

browser發(fā)起每一個(gè)請(qǐng)求時(shí),都會(huì)把cookie信息發(fā)給服務(wù)端;

是一種客戶端、服務(wù)端傳遞數(shù)據(jù)的技術(shù);

服務(wù)端可通過(guò)判斷這些信息,來(lái)確定這次請(qǐng)求是否和之前的請(qǐng)求有關(guān)聯(lián),服務(wù)端為了認(rèn)識(shí)同一個(gè)client,用sessionID或token,sessionID、token可理解為是一種標(biāo)識(shí),這些標(biāo)識(shí)要么通過(guò)cookie帶,要么通過(guò)url帶,要么通過(guò)request body帶;

注:

sessionID,保存在服務(wù)端內(nèi)存中,隨著會(huì)話關(guān)閉而消亡;

token,替代sessionID,server發(fā)給client的令牌,server通過(guò)此標(biāo)識(shí)來(lái)認(rèn)client;

url組成:

uniform resource locator統(tǒng)一資源定位符,每一個(gè)鏈接指向一個(gè)資源供客戶端訪問(wèn);

schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]

schema,模式、協(xié)議,http、ftp、file、mailto、mysql等;

host:port,80默認(rèn)可不寫(xiě),有域名解析,實(shí)際上應(yīng)該是IP;

/path/to/resource,path指向資源的路徑;

?key1=value1&key2=value2,query string查詢字符串,問(wèn)號(hào)分割,后面key=value形式且用&分割;

http消息:

分為Request、Response,請(qǐng)求和響應(yīng)都由請(qǐng)求消息行(請(qǐng)求行)、header消息報(bào)頭、body消息正文組成;

Request:

request method請(qǐng)求方法:

GET,請(qǐng)求獲取url對(duì)應(yīng)的資源;

POST,提交數(shù)據(jù)至服務(wù)器端;

HEAD,和GET類似,不過(guò)不返回消息正文;

例:

49web開(kāi)發(fā)1_http_wsgiref

GET / HTTP/1.1?? #請(qǐng)求行,分別為:請(qǐng)求方法 請(qǐng)求路徑 協(xié)議版本CRLF,CRLF為回車換行

Host:

User-Agent:

Accept:

Accept-Language:

Accept-Encoding:

Cookie:

Connection:

Upgrade-Insecure-Requests:?? #header消息報(bào)頭

body:?? #兩個(gè)CRLF后是body

常見(jiàn)傳遞信息的方式:

1、GET方法使用query string:

例:

http://www.magedu.com/python/index.html?id=5&name=python

2、POST方法提交數(shù)據(jù):

例:

http://127.0.0.1:9999/xxx/yyy?id=5&name=python

使用表單提交數(shù)據(jù),文本框name為age、weigth、height

請(qǐng)求消息如下:

POST /xxx/yyy?id=5name=python HTTP/1.1

HOST: 127.0.0.1:9999

content-length: 26

content-type: application/x-www-form-urlencoded

age=5&wegith=80&height=170

3、url中本身就包含著信息:

http://www.magedu.com/python/student/001

注:

ajax就是用以上3種方式傳輸?shù)?,不過(guò)是異步方式;

客戶端傳參的幾種方式:

1、通過(guò)URL路徑傳遞,如http://ip:port/news/1/2,兩個(gè)參數(shù),新聞?lì)愋蚷d和頁(yè)碼;

2、通過(guò)query string傳遞,如http://ip:port/news?category=1&page=2;

3、通過(guò)body請(qǐng)求體傳遞,又可根據(jù)數(shù)據(jù)格式分為k-v對(duì)、form數(shù)據(jù)、非form數(shù)據(jù)(json|xml);

4、通過(guò)http header傳遞;

Response:

例:

49web開(kāi)發(fā)1_http_wsgiref

HTTP/1.1 200 OK?? #響應(yīng)消息行,依次為:協(xié)議版本 狀態(tài)碼 Message

status code狀態(tài)碼:

1XX,提示信息,表示請(qǐng)求已被成功接收,繼續(xù)處理;

2XX,表示正常響應(yīng);

200,正常返回了網(wǎng)頁(yè)內(nèi)容;

201,Created;

3XX,重定向;

301,頁(yè)面永久性移走,永久重定向,返回新的url,b會(huì)根據(jù)返回的url發(fā)起新的request請(qǐng)求;

302,臨時(shí)重定向;

304,資源未修改,b使用本地緩存;

4XX,客戶端請(qǐng)求錯(cuò)誤;

404,Not Found,網(wǎng)頁(yè)找不到;

400,請(qǐng)求語(yǔ)法錯(cuò)誤;

401,請(qǐng)求要求身份驗(yàn)證;

403,服務(wù)器拒絕請(qǐng)求;

5XX,服務(wù)器端錯(cuò)誤;

500,服務(wù)器內(nèi)部錯(cuò)誤;

502,上游服務(wù)器錯(cuò)誤,如nginx反向代理時(shí);

例,編寫(xiě)類flask框架:

使用wsgi開(kāi)發(fā)框架;

目的:

學(xué)習(xí)web框架的工作機(jī)制,了解眾多框架背后的技術(shù);

學(xué)習(xí)API封裝,學(xué)習(xí)框架封裝的思想,并提供友好的編程接口;

注:

一般公司會(huì)直接使用類似于django這樣的框架,但一旦代碼規(guī)模到了一定階段,就需要對(duì)框架作二次開(kāi)發(fā),定制改版,所以了解框架背后的技術(shù)非常重要;

wsgi:

49web開(kāi)發(fā)1_http_wsgiref

wsgi,規(guī)定了服務(wù)器端和應(yīng)用程序之間的接口;

請(qǐng)求、響應(yīng)的數(shù)據(jù)都要經(jīng)wsgi server轉(zhuǎn)發(fā);

wsgi app看不到是哪個(gè)socket建立的連接(除非改wsgi接口);

wsgi app應(yīng)用程序端:

1、應(yīng)是一個(gè)可調(diào)用對(duì)象,py中應(yīng)是函數(shù)、類、實(shí)現(xiàn)了__call__方法的類的實(shí)例;

2、這個(gè)可調(diào)用對(duì)象應(yīng)接收2個(gè)參數(shù),如

def application(environ,start_response):?? #函數(shù)實(shí)現(xiàn)

return [res_str]

class Application:?? #類實(shí)現(xiàn)

def __init__(self,environ,start_response):

pass

def __iter__(self):

yield res_str

class Application:?? #類實(shí)現(xiàn)

def __call__(self,environ,start_response):

return [res_str]

3、以上三種實(shí)現(xiàn)(三種都有用,框架簡(jiǎn)單用函數(shù),框架復(fù)雜用類多些,更復(fù)雜都用),必須返回一個(gè)可迭代對(duì)象;

environ、start_response參數(shù):

這兩個(gè)參數(shù)可以是任何合法名,一般默認(rèn)用這兩個(gè)名字;

environ,是包含http請(qǐng)求信息的dict對(duì)象:

REQUEST_METHOD?? #請(qǐng)求方法,GET、POST等

PATH_INFO?? #url中的路徑部分

QUERY_STRING?? #查詢字符串

SERVER_NAME,SERVER_PORT

HTTP_HOST?? #IP:PORT

SERVER_PROTOCOL?? #協(xié)議

HTTP_USER_AGENT?? #UserAgent信息,對(duì)互聯(lián)網(wǎng)公司非常重要,可對(duì)用戶作精準(zhǔn)分析

start_response是一個(gè)可調(diào)用對(duì)象,有3個(gè)參數(shù):

start_response(status,response_headers,exc_info=None)?? #start_response應(yīng)在返回可迭代對(duì)象前調(diào)用,因?yàn)樗祷氐氖莚esponse header,而application返回的可迭代對(duì)象response body

status?? #狀態(tài)碼

response_headers?? #是一個(gè)元素為二元組列表,如[('Content-Type','text/plain;charset=utf-8')],用二元組模擬字典

exc_info?? #在錯(cuò)誤處理時(shí)用

注:

'text/plain;charset=utf-8'

'text/html;charset=utf-8'?? #對(duì)中文開(kāi)發(fā),此處要通知browser使用的編碼,browser只認(rèn)此處的通知,以讓b達(dá)到自動(dòng)檢測(cè)編碼;chrome中工具-->編碼

'text/application;charset=utf8-8'

wsgi server服務(wù)器端:

需調(diào)用符合上述定義的可調(diào)用對(duì)象,傳入environ、start_response,拿到返回的可迭代對(duì)象,返回給客戶端;

wsgiref庫(kù)

是一個(gè)wsgi參考實(shí)現(xiàn)庫(kù),僅測(cè)試用,生產(chǎn)不能用;

wsgiref.simple_server,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的wsgi http服務(wù)器;

from wsgiref import simple_server

simple_server.make_server(host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler):?? #啟動(dòng)一個(gè)wsgi server

simple_server.demo_app(environ,start_response):?? #一個(gè)函數(shù),小巧完整的wsgi app的實(shí)現(xiàn)

例:

from wsgiref.simple_server import make_server, demo_app

ip = '127.0.0.1'

port = 9999

server = make_server(ip, port, demo_app)

server.serve_forever()?? #另server.handle_request()一次,Handle one request, possibly blocking.

server.shutdown()

server.server_close()

49web開(kāi)發(fā)1_http_wsgiref

例:

from wsgiref.simple_server import make_server

def application(environ:dict, start_response):

print(type(environ))

html = '<h2>test</h2>'

start_response("200 OK", [('Content-Type', 'text/html; charset=utf-8')])

return [html.encode()]?? #encode()同encode("utf-8")

ip = '127.0.0.1'

port = 9999

server = make_server(ip, port, application)

server.serve_forever()

server.shutdown()

server.server_close()

輸出:

<class 'dict'>

127.0.0.1 - - [10/Sep/2018 11:20:40] "GET / HTTP/1.1" 200 13

<class 'dict'>

127.0.0.1 - - [10/Sep/2018 11:20:40] "GET /favicon.ico HTTP/1.1" 200 13

chrome:

工具-->編碼;

工具-->開(kāi)發(fā)者工具-->Network,左側(cè)Name處點(diǎn)cn.bing.com,右側(cè)查看Headers,view source或view parsed;

測(cè)試用命令:

curl -I http://ip:port/xxx?id=5?? #-I,使用HEAD方法

curl -X POST http://ip:port/yyy -d '{'x':2}?? #-X指定方法,-d傳輸數(shù)據(jù)

QUERY_STRING查詢字符串解析:

1、自己解析:

例:

def application(environ:dict, start_response):

qstr = environ.get('QUERY_STRING')

print(qstr)?? #拿到id=5&name=jowin

for pair in qstr.split('&'):

k,_,v = pair.partition('=')

print(k,v)

html = '<h2>test</h2>'

start_response("200 OK", [('Content-Type', 'text/html; charset=utf-8')])

return [html.encode()]

輸出:

id=5&name=jowin

id 5

name jowin

2、使用cgi模塊:

def parse_qs(qs, keep_blank_values=0, strict_parsing=0):

"""Parse a query given as a string argument."""

warn("cgi.parse_qs is deprecated, use urllib.parse.parse_qs instead",

DeprecationWarning, 2)

return urllib.parse.parse_qs(qs, keep_blank_values, strict_parsing)

cgi.parse_qs(qs)已過(guò)期,建議使用urllib.parse.parse_qs(qs)

例:

def application(environ:dict, start_response):

qstr = environ.get('QUERY_STRING')

print(qstr)

import cgi

print(cgi.parse_qs(qstr))?? #轉(zhuǎn)為dict

html = '<h2>test</h2>'

start_response("200 OK", [('Content-Type', 'text/html; charset=utf-8')])

return [html.encode()]

輸出:

id=5&name=jowin

{'id': ['5'], 'name': ['jowin']}

例:

def application(environ:dict, start_response):

qstr = environ.get('QUERY_STRING')

print(qstr)

from urllib.parse import parse_qs,parse_qsl

print(parse_qs(qstr))?? #dict;若query_string為?id=5&name=jowin,tom,解析結(jié)果為{'name': ['jowin,tom'], 'id': ['5']},注意['jowin,tom']不是多值;若query_string為?id=5&name=jowin&name=tom&age=&age=18,19,解析結(jié)果為{'name': ['jowin', 'tom'], 'id': ['5'], 'age': ['18,19']}

print(parse_qsl(qstr))?? #二元組列表;若query_string為?id=5&name=jowin,tom,解析結(jié)果為[('id', '5'), ('name', 'jowin,tom')];若query_string為?id=5&name=jowin&name=tom&age=&age=18,19,[('id', '5'), ('name', 'jowin'), ('name', 'tom'), ('age', '18,19')]

html = '<h2>test</h2>'

start_response("200 OK", [('Content-Type', 'text/html; charset=utf-8')])

return [html.encode()]

輸出:

id=5&name=jowin

{'name': ['jowin'], 'id': ['5']}

[('id', '5'), ('name', 'jowin')]

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前文章:49web開(kāi)發(fā)1_http_wsgiref-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://www.rwnh.cn/article48/coijhp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、響應(yīng)式網(wǎng)站、服務(wù)器托管、手機(jī)網(wǎng)站建設(shè)、域名注冊(cè)、網(wǎng)頁(yè)設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
剑川县| 东莞市| 马尔康县| 江孜县| 盈江县| 阿拉善左旗| 水富县| 武鸣县| 玛多县| 宁海县| 德庆县| 赣州市| 崇阳县| 莆田市| 文登市| 龙游县| 林州市| 平顺县| 石棉县| 孝义市| 安顺市| 桂阳县| 武隆县| 吴桥县| 文昌市| 美姑县| 甘泉县| 和田县| 全椒县| 娄底市| 苍南县| 磐石市| 喀喇| 兴仁县| 克拉玛依市| 神池县| 久治县| 大安市| 邻水| 伊宁县| 凤冈县|