《大數(shù)據(jù)的Python基礎(chǔ)》課件-第14章 網(wǎng)絡(luò)程序設(shè)計_第1頁
《大數(shù)據(jù)的Python基礎(chǔ)》課件-第14章 網(wǎng)絡(luò)程序設(shè)計_第2頁
《大數(shù)據(jù)的Python基礎(chǔ)》課件-第14章 網(wǎng)絡(luò)程序設(shè)計_第3頁
《大數(shù)據(jù)的Python基礎(chǔ)》課件-第14章 網(wǎng)絡(luò)程序設(shè)計_第4頁
《大數(shù)據(jù)的Python基礎(chǔ)》課件-第14章 網(wǎng)絡(luò)程序設(shè)計_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第14章網(wǎng)絡(luò)程序設(shè)計學(xué)習(xí)目標(biāo)掌握網(wǎng)絡(luò)構(gòu)架與協(xié)議編程方法

了解對網(wǎng)頁內(nèi)容的讀取和分析方法

了解Web應(yīng)用開發(fā)基礎(chǔ)22025/3/614.1網(wǎng)絡(luò)構(gòu)架與協(xié)議

網(wǎng)絡(luò)架構(gòu):指計算機網(wǎng)絡(luò)的各層及其協(xié)議

的集合。網(wǎng)絡(luò)協(xié)議:用于規(guī)定信息的格式及如何發(fā)

送和接收信息的一套規(guī)則。32025/3/6計算機之間交換數(shù)據(jù)14.1.1網(wǎng)絡(luò)互聯(lián)模型

TCP/IP(TransmissionControlProtocol/InternetProtocol,傳輸控制協(xié)議/

網(wǎng)際協(xié)議)結(jié)構(gòu)模型42025/3/6網(wǎng)絡(luò)接口層管理為物理網(wǎng)絡(luò)準(zhǔn)備數(shù)據(jù)所需的服務(wù)網(wǎng)絡(luò)互聯(lián)層將數(shù)據(jù)報獨立地從信源傳送到信宿傳輸層在信源和信宿之間提供端到端的數(shù)據(jù)傳輸服務(wù)應(yīng)用層為用戶方便地提供對各種網(wǎng)絡(luò)資源的訪問服務(wù)14.1.1網(wǎng)絡(luò)互聯(lián)模型

常見應(yīng)用層協(xié)議:DNS,域名服務(wù),用來實現(xiàn)域名與IP地址的轉(zhuǎn)換。FTP,文件傳輸協(xié)議,可以通過網(wǎng)絡(luò)在不同平臺之間實現(xiàn)文件的傳輸。HTTP,超文本傳輸協(xié)議。SMTP,簡單郵件傳輸協(xié)議。ARP,地址解析協(xié)議,實現(xiàn)IP地址與MAC地址的轉(zhuǎn)換。TELNET,遠(yuǎn)程登錄協(xié)議。52025/3/614.1.2UDP編程UDP:一種無連接的數(shù)據(jù)報協(xié)議,從OSI開放系統(tǒng)互聯(lián)模型來看屬于傳輸層。

在UDP編程時不需要首先建立連接,而是直接向接收方發(fā)送信息。62025/3/614.1.2UDP編程常用到的socket模塊方法socket([family[,type[,proto]]]),用于創(chuàng)建一個Socket對象其中family為socket,AF_INET表示IPV4,socket.AF_INET6表示IPV6,type為SOCK_STREAM表示TCP,若為SOCK_DGRAM表示UDP。sendto(string,address),把string指定的內(nèi)容發(fā)送給address地址其中address是一個包含接收方主機IP地址和應(yīng)用進程端口號的元組,格式為(IP地址,端口號)。recvfrom(bufsize[,flags]),用于接收數(shù)據(jù)。72025/3/6【例14-1】UDP客戶端與服務(wù)器端通信數(shù)據(jù)接收端:82025/3/6importsockets=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#使用UDP協(xié)議傳輸數(shù)據(jù)s.bind(('',5000))

#綁定端口5000,空字符串表示本機地址whileTrue: data,addr=s.recvfrom(1024) print('receivedmessage:{0}fromPORT{1}on{2}'.format(data.decode(),addr[1],addr[0])) ifdata.decode().lower()=='end’:#客戶端發(fā)送'end'則關(guān)閉服務(wù)器端

breaks.close()【例14-1】UDP客戶端與服務(wù)器端通信數(shù)據(jù)發(fā)送端:92025/3/6importsocketimportsyss=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.sendto(sys.argv[1].encode(),("localhost",5000)) #"localhost"表示本機IP地址s.close()【例14-1】UDP客戶端與服務(wù)器端通信程序運行結(jié)果102025/3/614.1.3TCP編程TCP協(xié)議:又名傳輸控制協(xié)議(TransmissionControlProtocol),是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC793定義。112025/3/6TCP通信步驟創(chuàng)建連接數(shù)據(jù)傳送終止連接注:TCP采用發(fā)送應(yīng)答機制傳送數(shù)據(jù),發(fā)送方傳

遞的每個報文必須得到接收方的應(yīng)答才能認(rèn)為該

報文傳輸成功?!纠?4-2】采用TCP實現(xiàn)的自動聊天應(yīng)答系統(tǒng)數(shù)據(jù)接收端:122025/3/6importsocketdialogues={'Howareyou?':'Fine,thankyou.','Howoldareyou?':'28’, 'Whatisyourname?':'Jack','Wheredoyoulive?':'Shanghai','end':'End'}s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.bind(('',5001))s.listen(1) #允許最大連接數(shù)為1print('Listeningatport:',5001)conn,addr=s.accept()print('Connectedby',addr)whileTrue: data=conn.recv(1024).decode() ifnotdata: break print('Receivedmessage:',data) conn.send(dialogues.get(data,'Nothing').encode())conn.close() #關(guān)閉連接s.close() #關(guān)閉socket【例14-2】采用TCP實現(xiàn)的自動聊天應(yīng)答系統(tǒng)數(shù)據(jù)發(fā)送端:132025/3/6importsocket,syss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)try: s.connect(('',5001)) #連接exceptExceptionase: print('Servernotfoundornotopen') sys.exit()whileTrue: c=input('Input:') s.send(c.encode()) #發(fā)送數(shù)據(jù)

data=s.recv(1024) #從服務(wù)端接收數(shù)據(jù)

data=data.decode() print('Received:',data) ifc.lower()=='end': breaks.close() #關(guān)閉連接14.2網(wǎng)頁內(nèi)容讀取要進行大規(guī)模的數(shù)據(jù)處理,數(shù)據(jù)的來源僅僅依靠自由數(shù)據(jù)其來源比較單一,只有充分利用龐大的互聯(lián)網(wǎng)資源,才能夠更好地滿足業(yè)務(wù)的需要。以程序的方法自動訪問和分析網(wǎng)頁內(nèi)容,可以實現(xiàn)自動化的網(wǎng)絡(luò)數(shù)據(jù)采集,即網(wǎng)絡(luò)爬蟲,符合如市場預(yù)測、情報分析等諸多領(lǐng)域的需要。142025/3/614.2.1HTTP與HTML網(wǎng)絡(luò)爬蟲:根據(jù)網(wǎng)頁的地址來尋找網(wǎng)頁的,其全稱為統(tǒng)一資源定位符(UniformResourceLocator,URL)。152025/3/6protocol://hostname[:port]/path/[parameters][?query]#fragmenthai

注:通過URL所訪問的網(wǎng)頁屬于超文本

(Hypertext),其中的網(wǎng)頁源代碼包含一

系列HTML標(biāo)簽。14.2.1HTML常見標(biāo)簽162025/3/614.2.1HTTP與HTML超文本傳輸協(xié)議HTTP:構(gòu)建在TCP協(xié)議之上的應(yīng)用層協(xié)議,用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議。172025/3/614.2.1HTTP與HTMLGET方式:在瀏覽器的地址欄輸入網(wǎng)址來瀏覽網(wǎng)頁時所采用,請求參數(shù)和對應(yīng)的值附加在URL后面的參數(shù)部分,傳遞參數(shù)長度受限制在1024個字符以內(nèi)。182025/3/6例:GET/pathHTTP/1.1Host:localhost:8080Connection:keep-alivePragma:no-cacheCache-Control:no-cacheUser-Agent:Mozilla/5.0(WindowsNT6.3;

WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3497.23Safari/537.36Accept:*/*14.2.1HTTP與HTMLPOST方式:將請求參數(shù)封裝在HTTP請求數(shù)據(jù)中,以鍵值對的形式出現(xiàn),可以傳輸大量數(shù)據(jù)。POST方式請求行中不包含數(shù)據(jù)字符串,這些數(shù)據(jù)保存在請求內(nèi)容部分,各數(shù)據(jù)之間也是使用“&”符號隔開。192025/3/6例:POSTHTTP/1.1Host:Cache-Control:no-cachePostman-Token:81d7b315-d4be-8ee8-1237-04f3976de032Content-Type:application/x-www-form-urlencodedkey=value&testKey=testValue14.2.2采用urllib獲取網(wǎng)絡(luò)數(shù)據(jù)HTTP返回碼:表示處理結(jié)果,包括狀態(tài)行、響應(yīng)頭和響應(yīng)正文等三個部分。202025/3/614.2.2采用urllib獲取網(wǎng)絡(luò)數(shù)據(jù)

urllib:Python中操作URL進行網(wǎng)絡(luò)數(shù)據(jù)獲取的標(biāo)準(zhǔn)庫,允許通過簡單的函數(shù)調(diào)用訪問URL指向資源中的數(shù)據(jù)。包含urllib.request、urllib.error、urllib.parse、urllib.robotparser等幾個模塊。urlopen()函數(shù):

urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,context=None)212025/3/6【例14-3】查看網(wǎng)絡(luò)數(shù)據(jù)GET請求的響應(yīng)信息222025/3/6fromurllibimportrequestresponse=request.urlopen(r'/')print('response的返回類型:',type(response))print('響應(yīng)地址信息:',response)print('響應(yīng)數(shù)據(jù)頭部信息:',())print('響應(yīng)數(shù)據(jù)頭:',response.getheaders())print('響應(yīng)頭部屬性信息:',response.getheader('Server'))print('查看響應(yīng)狀態(tài)信息:',response.status)print('查看響應(yīng)狀態(tài)碼:',response.getcode())print('查看響應(yīng)url地址:',response.geturl())page=response.read()print('輸出網(wǎng)頁源碼:',page.decode('utf-8'))【例14-3】查看網(wǎng)絡(luò)數(shù)據(jù)GET請求的響應(yīng)信息程序運行結(jié)果:232025/3/6response的返回類型:<class'http.client.HTTPResponse'>響應(yīng)地址信息:<http.client.HTTPResponseobjectat0x000001848A0FA320>響應(yīng)數(shù)據(jù)頭部信息:Server:nginxContent-Type:text/html;charset=utf-8X-Frame-Options:DENYVia:1.1vegurVia:1.1varnishContent-Length:49135Accept-Ranges:bytesDate:Tue,03Sep201914:53:13GMTVia:1.1varnishAge:1552Connection:closeX-Served-By:cache-iad2127-IAD,cache-hkg17930-HKGX-Cache:HIT,HITX-Cache-Hits:3,360【例14-3】查看網(wǎng)絡(luò)數(shù)據(jù)GET請求的響應(yīng)信息242025/3/6X-Timer:S1567522394.597123,VS0,VE0Vary:CookieStrict-Transport-Security:max-age=63072000;includeSubDomains響應(yīng)數(shù)據(jù)頭:[('Server','nginx'),('Content-Type','text/html;charset=utf-8'),('X-Frame-Options','DENY'),('Via','1.1vegur'),('Via','1.1varnish'),('Content-Length','49135'),('Accept-Ranges','bytes'),('Date','Tue,03Sep201914:53:13GMT'),('Via','1.1varnish'),('Age','1552'),('Connection','close'),('X-Served-By','cache-iad2127-IAD,cache-hkg17930-HKG'),('X-Cache','HIT,HIT'),('X-Cache-Hits','3,360'),('X-Timer','S1567522394.597123,VS0,VE0'),('Vary','Cookie'),('Strict-Transport-Security','max-age=63072000;includeSubDomains')]響應(yīng)頭部屬性信息:nginx查看響應(yīng)狀態(tài)信息:200查看響應(yīng)狀態(tài)碼:200查看響應(yīng)url地址:/輸出網(wǎng)頁源碼:…<以下省略>【例14-4】獲取網(wǎng)絡(luò)數(shù)據(jù)GET請求的響應(yīng)數(shù)據(jù)252025/3/6fromurllibimportrequestfromurllibimportparseparams=parse.urlencode({'key1':'value1','key2':'value2','key3':None})url='/get?%s'%paramswithrequest.urlopen(url)asr:print(r.url)print(r.read())【例14-4】獲取網(wǎng)絡(luò)數(shù)據(jù)GET請求的響應(yīng)數(shù)據(jù)

通過read()方法可查看網(wǎng)頁內(nèi)容:262025/3/6/get?key1=value1&key2=value2&key3=Noneb'{\n"args":{\n"key1":"value1",\n"key2":"value2",\n"key3":"None"\n},\n"headers":{\n"Accept-Encoding":"identity",\n"Host":"",\n"User-Agent":"Python-urllib/3.6"\n},\n"origin":"6,6",\n"url":"/get?key1=value1&key2=value2&key3=None"\n}\n'14.2.2采用urllib獲取網(wǎng)絡(luò)數(shù)據(jù)利用Request()函數(shù)將請求將請求獨立成一個對象,可以更加靈活方便地配置訪問參數(shù)。272025/3/6Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)

注:

當(dāng)輸入?yún)?shù)data=None時,請求默認(rèn)為GET。

當(dāng)data不為None時,就表示是POST請求?!纠?4-5】獲取網(wǎng)絡(luò)數(shù)據(jù)POST請求的響應(yīng)數(shù)據(jù)282025/3/6importurllib.request,urllib.parseimportsslurl='/post'headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.108Safari/537.36','Referer':'/post','Connection':'keep-alive'}dict={'name':'Mike','old:':18}data=urllib.parse.urlencode(dict).encode('utf-8')#POST中data要求為bytes,因此用urlencode()編碼context=ssl._create_unverified_context()req=urllib.request.Request(url=url,data=data,headers=headers)response=urllib.request.urlopen(req)page=response.read().decode('utf-8')print(page)【例14-5】獲取網(wǎng)絡(luò)數(shù)據(jù)POST請求的響應(yīng)數(shù)據(jù)程序運行結(jié)果如下:292025/3/6{"args":{},"data":"","files":{},"form":{"name":"Mike","old:":"18"},"headers":{"Accept-Encoding":"identity","Content-Length":"19","Content-Type":"application/x-www-form-urlencoded","Host":"","Referer":"/post","User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.108Safari/537.36"},"json":null,"url":"/post"}【例14-5】獲取網(wǎng)絡(luò)數(shù)據(jù)POST請求的響應(yīng)數(shù)據(jù)webbrowser模塊可提供調(diào)用默認(rèn)瀏覽器打開指定網(wǎng)頁的功能:302025/3/6>>>fromurllib.parseimporturlparse,urlunparse>>>url='/get?key1=value1&key2=value2&key3=None'>>>result=urlparse(url) #將url拆分成一個含有6個元素的具名元組>>>print(result)ParseResult(scheme='http',netloc='',path='/get',params='',query='key1=value1&key2=value2&key3=None',fragment='')>>>result.scheme'http'>>>loc''>>>url1=urlunparse(result) #將具名元組重新合并成url>>>print(url1)/get?key1=value1&key2=value2&key3=None>>>importwebbrowser #調(diào)用默認(rèn)瀏覽器打開網(wǎng)頁>>>webbrowser.open('/doc/FAQ.html')True>>>fromurllib.parseimporturljoin>>>urljoin('/doc/FAQ.html','current/lib/lib.html')'/doc/current/lib/lib.html'>>>urljoin('/doc/FAQ.html','/current/lib/lib.html')'/current/lib/lib.html'【例14-6】爬取網(wǎng)絡(luò)數(shù)據(jù)并保存到文件312025/3/6fromurllibimportrequestimportos,redefcrawler(url,keys):foriinrange(len(keys)):count=1file_name=keys[i]+".html"print("正在下載"+keys[i]+"頁面,并保存為"+file_name)r=request.urlopen(url+keys[i]).read()dirpath=""dirname=keys[i]new_path=os.path.join(dirpath,dirname)ifnotos.path.isdir(new_path):os.makedirs(new_path)#創(chuàng)建目錄保存每個網(wǎng)頁上的圖片【例14-6】爬取網(wǎng)絡(luò)數(shù)據(jù)并保存到文件322025/3/6 page_data=r.decode()

page_image=pile('<imgsrc=\"(.+?)\"')#匹配圖片的pattern

forimageinpage_image.findall(page_data):

#用正則表達(dá)式匹配所有的圖片

pattern=pile(r'http://.*.jpg$')

#匹配jpg格式的文件

ifpattern.match(image):

#如果匹配,則獲取圖片信息

try:

image_data=request.urlopen(image).read()

image_path=dirpath+dirname+"/"+str(count)+".jpg"

count+=1

print(image_path)

withopen(image_path,"wb")asimage_file:

image_file.write(image_data)

excepturllib.error.URLErrorase:

print("Downloadfailed") withopen(file_name,"wb")asfile: #將頁面寫入文件

file.write(r)if__name__=="__main__":url="/f?kw="keys=["python","c"]crawler(url,keys)14.3Web應(yīng)用開發(fā)Web服務(wù)器網(wǎng)關(guān)接口Flask應(yīng)用框架332025/3/614.3.1Web服務(wù)器網(wǎng)關(guān)接口

Web服務(wù)器網(wǎng)關(guān)接口(PythonWebServerGatewayInterface,WSGI):Python應(yīng)用程序與Web服務(wù)器之間的一種接口,支持多種Web服務(wù)器的使用。

WSGI應(yīng)用接收由Web服務(wù)器轉(zhuǎn)發(fā)的請求,對請求進行處理并將結(jié)果返回給Web服務(wù)器,在這一過程中起到了中間件的作用。342025/3/6【例14-7】利用函數(shù)方法實現(xiàn)的一個簡單的Web網(wǎng)站352025/3/6fromwsgiref.simple_serverimportmake_serverdefapplication(environ,start_response):print(environ)start_response('200OK',[('Content-Type','text/plain')])#返回值為普通文本

body=b'Thisisapythonapplication!' #返回的內(nèi)容必須為字節(jié)碼bytesreturn[body]if__name__=="__main__":httpd=make_server('',8000,application) #IP地址為空表示本機,端口是8000print('ServingHTTPonport8000...')httpd.serve_forever() 【例14-8】利用可迭代類實現(xiàn)的一個簡單的Web網(wǎng)站362025/3/6fromwsgiref.simple_serverimportmake_serverclassApplication:

def__init__(self,environ,start_response):self.environ=environself.start_response=start_responsedef__iter__(self):self.start_response('200OK',[('Content-type','text/html')])#返回值為HTML格式的網(wǎng)頁body="<h1>Hello,thisisthewsgiresponse!</h1>"yieldbody.encode("utf-8")#返回的內(nèi)容必須為字節(jié)碼bytesif__name__=="__main__":httpd=make_server('',8000,Application) #表示本機IP地址print('ServingHTTPonport8000...')httpd.serve_forever()【例14-9】利用可迭代類實現(xiàn)網(wǎng)站URL路由的選擇372025/3/6fromwsgiref.simple_serverimportmake_serverclassApplication:def__init__(self,environ,start_response):self.environ=environself.start_response=start_response def__iter__(self): path_info=self.environ.get('PATH_INFO') ifpath_info=='/coffee': #處理'/coffee'的URL路徑

self.start_response('200OK',[('Content-type','text/html')])#響應(yīng)內(nèi)容為HTML網(wǎng)頁

body='<h1>Haveacupofcoffee.</h1>' yieldbody.encode("utf-8") return self.start_response('200OK',[('Content-type','text/plain')]) #響應(yīng)內(nèi)容為普通文本 body='Welcome,whatdoyoulike?' yieldbody.encode("utf-8")if__name__=="__main__": httpd=make_server('',8000,Application) print('ServingHTTPonport8000...') httpd.serve_forever()14.3.1Web服務(wù)器網(wǎng)關(guān)接口可調(diào)用實例對可迭代類加以改造,可以通過設(shè)置可調(diào)用函數(shù)__call__將可迭代類轉(zhuǎn)化為可調(diào)用類,并通過可調(diào)用方法取代構(gòu)造方法輸入environ和start_response等參數(shù),以此建立的可調(diào)用實例實現(xiàn)WSGI應(yīng)用。382025/3/6【例14-10】利用可調(diào)用實例實現(xiàn)的一個簡單的Web網(wǎng)站392025/3/6fromwsgiref.simple_serverimportmake_serverclassApplication:def__call__(self,environ,start_response):start_response('200OK',[('Content-type','text/html')])#返回值為HTML格式的網(wǎng)頁

body='''<html><head><title>Hello</title><style>h1{color:#333333;font-size:48px;text-shadow:3px3px3px#666666;}</style><script>functionchange(){document.getElementsByTagName('h1')[0].style.color='#ff0000';

}</script></head><body>

<h1onclick="change()">Pleaseclickme</h1></body></html>'''yieldbody.encode("utf-8")

#編碼為bytes字節(jié)類型if__name__=="__main__":app=Application()httpd=make_server('',8000,app)print('ServingHTTPonport8000...')httpd.serve_forever()【例14-11】實現(xiàn)一個具有路徑分發(fā)功能的Web網(wǎng)站402025/3/6fromwsgiref.simple_serverimportmake_serverclassApplication:def__init__(self,app):self.app=appdef__call__(self,environ,start_response):ip_addr=environ.get('HTTP_HOST').split(':')[0]print(ip_addr)ifip_addrnotin(''):

#設(shè)置安全策略,僅允許通過訪問

returnforbidden(start_response)returnself.app(environ,start_response)defpython(start_response):start_response('200OK',[('Content-Type','text/plain')])return[b'Thisispythonprogramminglanguage']defc(start_response):start_response('200OK',[('Content-Type','text/html')])return['<h1>Thisiscprogramminglanguage</h1>'.encode('utf-8')]defnot_found(start_response):start_response('404NOTFOUND',[('Content-Type','text/plain')])return[b'NotFound']defforbidden(start_response):start_response('403Forbidden',[('Content-Type','text/html')])return[b'<h1>Forbidden</h1>']defsetup(environ,start_response):path=environ.get('PATH_INFO','').lstrip('/')mapping={'python':python,'c':c}#設(shè)置訪問url的子路徑

call_back=mapping[path]ifpathinmappingelsenot_foundreturncall_back(start_response)if__name__=='__main__':app=Application(setup)server=make_server('',8080,app)print('ServingHTTPonport8080...')server.serve_forever()14.3.2Flask應(yīng)用框架

Flask:使用Python編寫的輕量級Web應(yīng)用程序框架,對很多Web應(yīng)用設(shè)計要素進行了封裝,可以簡化Web程序的設(shè)計。利用“pipinstallflask”進行安裝。412025/3/614.3.2Flask應(yīng)用框架路由機制

Flask的底層實現(xiàn)通過Werkzeug工具包實現(xiàn)了WSGI的請求和響應(yīng)等功能,并以此為基礎(chǔ)構(gòu)建Web框架。

Flask可以通過路由機制實現(xiàn)了URL中子路徑的功能,并通過route()裝飾器將URL的路由綁定到函數(shù)。422025/3/6【例14-12】一個利用Flask設(shè)計的簡單Web網(wǎng)站432025/3/6fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello():return'Flask網(wǎng)站歡迎您'if__name__=='__main__':app.run()【例14-13】Flask變量規(guī)則在網(wǎng)站中的應(yīng)用演示442025/3/6fromflaskimportFlaskapp=Flask(__name__)@app.route('/blog/<int:postID>')defshow_blog(postID):return'BlogNumber%d'%postID@app.route('/page/<pageName>')defshow_page(pageName):return'Pagenameis%s'%pageNameif__name__=='__main__': app.run('',8080)14.3.2Flask應(yīng)用框架

URL重定向在進行網(wǎng)站訪問的時候,有些URL是動態(tài)構(gòu)建的,這就需要URL重定向redirect()方法。由于每個路由均對應(yīng)一個函數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論