當前位置:九游会j9娱乐平台-九游ag登录中心网址 » 編程語言 » pythonweb實例

pythonweb實例-九游会j9娱乐平台

發布時間: 2024-01-15 23:51:29

⑴ 使用python創建web靜態網站

打開pycharm企業版軟體,創建一個django項目,其中django是一個web框架,用於幫助開發互動式網站的工具。生成項目文件如下圖所示:

在url.py文件中添加為:

在view.py文件中添加:

在templates文件夾中新建index.html文件

其中

訪問伺服器資源。
例如:
h ttp://local host:808 0/index.h tm(當然index.htm文件得自己創建)
其他機器也可以通過伺服器的ip地址來訪問。
這里的「web伺服器模塊」有如下三種:
basehttpserver: 提供基本的web服務和處理器類,分別是httpserver和basehttprequesthandler。
simplehttpserver: 包含執行get和head請求的simplehttprequesthandler類。
cgihttpserver: 包含處理post請求和執行cgihttprequesthandler類。

⑶ 用python開發一個物流web代碼

詳細如下。
一個名叫「remi」的python庫,就是用來開發webapp的。1.remi庫簡介
remi是一個用於python應用程序的gui庫,它將應用程序的界面轉換為html,以便在web瀏覽器中呈現。嚴格地說,我們不能用remi庫來編寫傳統的網站,而只能將它當成web形式的tkinter庫(python最經典的圖形界面庫)來使用。如果要做網站,還是要老老實實學點前端知識,然後結合python的flask框架來開發。
2.remi庫的安裝
remi可以採用pip命令安裝
3.remi庫的代碼
運行這段代碼後,瀏覽器會自動打開一個本地的網址,出現如下圖所示的界面。將「127.0.0.1」換成ip地址,就能通過其他電腦、手機的瀏覽器來訪問了。
點擊「請點擊這里」按鈕,界面會發生變化,如下圖所示。不用寫復雜的js代碼,在remi的支持下,網頁交互就變得這么簡單。如果需要了解更多關於remi庫的資源,可以訪問github或者官方文檔。
github地址:https://github.com/dddomodossola/remi
文檔地址:https://remi.readthedocs.io/en/latest/
基於remi編寫基於web的物聯網應用程序,既然是編寫物聯網應用程序,那麼肯定還需要安裝siot庫。這也是「虛穀物聯」團隊開發的python庫,因為mqtt的官方python庫(paho-mqtt)編寫出來的代碼冗長,不好理解,於是委託上海蘑菇雲團隊在paho-mqtt的基礎上進行了新的封裝。siot庫可以通過pip命令來安裝,命令如下:
pipinstallsiot

⑷ 純 python 寫一個 web 框架,就是這么簡單

造輪子是最好的一種學習方式,本文嘗試從0開始造個python web框架的輪子,我稱它為 toywebf 。

本文操作環境為:macos,文中涉及的命令,請根據自己的系統進行替換。

toywebf的簡單特性:

下面我們來實現這些特性。

首先,我們需要安裝gunicorn,回憶一下flask框架,該框架有內置的web伺服器,但不穩定,所以上線時通常會替換成uwsgi或gunicorn,這里不搞這個內置web服務,直接使用gunicorn。

我們創建新的目錄與python虛擬環境,在該虛擬環境中安裝gunicorn

在啥都沒有的情況下,構建最簡單的web服務,在toywebf目錄下,創建app.py與api.py文件,寫入下面代碼。

運行 gunicorn app:app 訪問 http://127.0.0.1:8000 ,可以看見 hello, world! ,但現在請求體中的參數在environ變數中,難以解析,我們返回的response也是bytes形式。

我們可以使用webob庫,將environ中的數據轉為request對象,將需要返回的數據轉為response對象,處理起來更加直觀方便,直接通過pip安裝一下。

然後修改一下api類的 __call__方法 ,代碼如下。

上述代碼中,通過webob庫的request類將environ對象(請求的環境信息)轉為容易處理的request,隨後調用handle_request方法對request進行處理,處理的結果,通過response對象返回。

handle_request方法在toywebf中非常重要,它會匹配出某個路由對應的處理方法,然後調用該方法處理請求並將處理的結果返回,在解析handle_request前,需要先討論路由注冊實現,代碼如下。

其實就是將路由和方法存到self.routes字典中,可以通過route裝飾器的形式將路由和方法關聯,也可以通過add_route方法關聯,在app.py中使用一下。

因為url中可以存在變數,如 @app.route("/hello/{name}") ,所以在匹配時,需要進行解析,可以使用正則匹配的方式進行匹配,parse這個第三方庫已經幫我們實現了相應的正則匹配邏輯,pip安裝使用一下則可。

這里定義find_handler方法來實現對self.routes的遍歷。

了解了路由與方法關聯的原理後,就可以實現handle_request方法,該方法主要的路徑就是根據路由調度對應的方法,代碼如下。

在該方法中,首先實例化webob庫的response對象,然後通過self.find_handler方法獲取此次請求路由對應的方法和對應的參數,比如。

它將返回hello方法對象和name參數,如果是 /hello/二兩 ,那麼name就是二兩。

因為route裝飾器可能裝飾器的類對象,比如。

此時self.find_handler方法返回的hanler就是個類,但我們希望調用的是類中的get、post、delete等方法,所以需要一個簡單的判斷邏輯,通過inspect.isclass方法判斷handler如果是類對象,那麼就通過getattr方法獲取類對象實例的中對應的請求方法。

如果類對象中沒有該方法屬性,則拋出該請求類型不被允許的錯誤,如果不是類對象或類對象中存在該方法屬性,則直接調用則可。

此外,如果方法的路由並沒有注冊到self.routes中,即404的情況,定義了defalut_response方法返回其中內容,代碼如下。

如果handle_request方法中調度的過程出現問題,則直接raise將錯誤拋出。

至此,一個最簡單的web服務就編寫完成了。

回顧flask,flask可以支持html、css、javascript等靜態文件,利用模板語言,可以構建出簡單但美觀的web應用,我們讓topwebf也支持這一功能,最終實現圖中的網站,完美兼容靜態文件。

flask使用了jinja2作為其html模板引擎,toywebf同樣使用jinja2,jinja2其實實現一種簡單的dsl(領域內語言),讓我們可以在html中通過特殊的語法改變html的結構,該項目非常值得研究學習。

首先 pip install jinja2 ,然後就可以使用它了,在toywebf項目目錄中創建templates目錄,以該目錄作為默認的html文件根目錄,代碼如下。

首先利用jinja2的filesystemloader類將file system中的某個文件夾作為loader,然後初始化environment。

在使用的過程中(即調用template方法),通過get_template方法獲得具體的某個模板並通過render方法將對應的內容傳遞給模板中的變數。

這里我們不寫前端代碼,直接去互聯網中下載模板,這里下載了bootstrap提供的免費模板,可以自行去 https://startbootstrap.com/themes/freelancer/ 下載,下載完後,你會獲得index.html以及對應的css、jss、img等文件,將index.html移動到toywebf/templates中並簡單修改了一下,添加一些變數。

然後在app.py文件中為index.html定義路由以及需要的參數。

至此html文件的支持就完成了,但此時的html無法正常載入css和js,導致頁面布局非常醜陋且交互無法使用。

接著就讓toywebf支持css、js,首先在toywebf目錄下創建static文件夾用於存放css、js或img等靜態文件,隨後直接將前面下載的模板,其中的靜態文件復制到static中則可。

通過whitenoise第三方庫,可以通過簡單的幾行代碼讓web框架支持css和js,不需要依賴nginx等服務,首先 pip install whitenoise ,隨後修改api類的 __init__ 方法,代碼如下。

其實就是通過whitenoise將self.wsgi_app方法包裹起來,在調用api的 __call__ 方法時,直接調用self.whitenoise。

此時,如果請求web服務獲取css、js等靜態資源,whitenoise會獲取其內容並返回給client,它在背後會匹配靜態資源在系統中對應的文件並將其讀取返回。

至此,一開始的網頁效果就實現好了。

web服務如果出現500時,默認會返回 internal server error ,這顯得比較丑,為了讓框架使用者可以自定義500時返回的錯誤,需要添加一些代碼。

首先api初始化時,初始self.exception_handler對象並定義對應的方法添加自定義的錯誤

在handler_request方法進行請求調度時,調度的方法執行邏輯時報500,此時不再默認將錯誤拋出,而是先判斷是否有自定義錯誤處理。

在app.py中,自定義錯誤返回方法,如下。

custom_exception_handler方法只返回自定義的一段話,你完全可以替換成美觀的template。

我們可以實驗性定義一個路由來看效果。

web服務的中間件也可以理解成鉤子,即在請求前可以對請求做一些處理或者返回response前對response做一下處理。

為了支持中間件,在topwebf目錄下創建middleware.py文件,在編寫代碼前,思考一下如何實現?

回顧一下現在請求的調度邏輯。

1.通過routes裝飾器關聯路由和方法 2.通過api.whitenoise處理 3.如果是請求api介面,那麼會將參數傳遞給api.wsgi_app 4.api.wsgi_app最終會調用api.handle_request方法獲取路由對應的方法並調用該方法執行相應的邏輯

如果希望在request前以及response後做相應的操作,那麼其實就需要讓邏輯在api.handle_request前後執行,看一下代碼。

其中add方法會實例化middleware對象,該對象會將當前的api類實例包裹起來。

middleware.handle_request方法其實就是在self.app.handle_request前調用self.process_request方法處理request前的數據以及調用self.process_response處理response後的數據,而核心的調度邏輯,依舊交由api.handle_request方法進行處理。

這里的代碼可能會讓人感到疑惑, __call__ 方法和handle_request方法中都有self.app.handle_request(request),但其調用對象似乎不同?這個問題暫時放一下,先繼續完善代碼,然後再回來解釋。

接著在api.py中為api創建middleware屬性以及添加新中間件的方法。

隨後,在app.py中,自定義一個簡單的中間件,然後調用add_middleware方法將其添加。

定義好中間件後,在請求調度時,就需要使用中間件,為了兼容靜態文件的情況,需要對css、js、ing文件的請求路徑做一下兼容,在其路徑中加上/static前綴

緊接著,修改api的 __call__ ,兼容中間件和靜態文件,代碼如下。

至此,中間件的邏輯就完成了。

但代碼中依舊有疑惑,middleware類中的 __call__ 方法和handle_request方法其調用的self.app到底是誰?

為了方便理解,這里一步步拆解。

如果沒有添加新的中間件,那麼請求的調度邏輯如下。

在沒有添加中間件的情況下,self.app其實就是api本身,所以 middleware.__call__ 中的self.app.handle_request就是調用api.handle_request。

如果添加了新的中間件,如上述代碼中添加了名為simplecustommiddleware的中間件,此時的請求調度邏輯如下。

因為注冊中間件時,middleware.add方法替換了原始middleware實例中的app對象,將其替換成了simplecustommiddleware,而simplecustommiddleware也有app對象,simplecustommiddleware中的app對象,才是api類實例。

在請求調度的過程中,就會觸發middleware類的handle_request方法,該方法就會執行中間件相應的邏輯去處理request和response中的數據。

當然,你可以通過middleware.add方法添加多個中間件,這就會構成棧式調用的效果,代碼如下。

啟動web服務後,其執行效果如下。

⑸ python的web服務代碼怎麼寫要求能讀取請求頭和定義返回頭的值 (不夠可以加分)

server埠: 8888埠
server根目錄: "../http/"
如下代碼是一個簡單的例子,並沒有限制對其他目錄的訪問:

#!/usr/bin/env python
import basehttpserver
import os
httpport = 8888
documentroot = os.curdir "../http/"
class examplehandler(basehttpserver.basehttprequesthandler):
def do_get(self):
try:
print self.server
print self.path
print self.client_address
print self.command
print self.request_version
print self.headers
if self.path.endswith(".html") or self.path.endswith(".htm"):
self.send_response(200)
self.send_header("content-type", "text/html")
self.end_headers()
f = open(documentroot self.path)
self.wfile.write(f.read())
f.close()
else:
self.send_error(404, "%s was not supported" % self.path)
except ioerror:
self.send_error(404, "%s was not found" % self.path)

def run(server_class=basehttpserver.httpserver,
handler_class=basehttpserver.basehttprequesthandler):
server_address = ('', httpport)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
if __name__ == '__main__':
run(handler_class = examplehandler)

⑹ 如何開發一個python web框架

首先你需要知道一個web應用基本的請求處理流程。以最簡單最原始的動態網頁為例,你點擊鏈接(get),提交表單(post),就是與伺服器端建立了連接之後發送了一個http請求(rfc2616 5.1節,之後都以http 1.1為例),裡面至少有方法(動詞,就是get啦post什麼的,詳見rfc2616第9節),地址(url),http版本,還可能帶上cookie(會話的一般實現機制),緩存相關的信息(rfc2616 13節),user-agent串等等一堆信息。對於post請求我們還有表單內容作為請求實體(rfc2616 7.2節),裡面是你填寫的表單內容。

於是我們有了一些關於請求的數據,不過現在一般來講這些數據還在前端伺服器(反向代理,比如nginx,暫且忽略掉負載均衡,反正是透明的,也不考慮裸wsgi容器直接扛請求的情況)的手上,還沒有傳進後端語言(這里是python)。我們就針對每一種語言都有特定的機制,用來將http的請求信息映射到相應的編程語言范疇,叫做web伺服器界面(web server interface),通用如cgi/fcgi/scgi,特定於某一語言如wsgi/psgi/rack/...,特定於某一操作系統如isapi(這貨還活著?),一些已經不再使用的就不提了。總之在python世界裡這就是wsgi(pep 3333, web server gateway interface),它就定義了python語言與web伺服器之間的界面。在wsgi里,

請求的處理過程被映射為對應用callable的調用(application(environ, start_response),知乎不支持inline代碼塊?);
請求信息被映射到environ字典中的相應鍵值,比如請求方法被映射到environ['request_method'],請求的「相對路徑」被映射到environ['path_info'](過度簡化;暫且不提wsgi應用掛載點,框架層一般也不用關心這個,掛載wsgi應用一般是wsgi容器如gunicorn、uwsgi之類組件的工作);
發送響應頭的動作被映射到調用start_response(status, response_headers)(不考慮可選的第三個參數異常信息);
返回響應數據被映射到application返回iterable的動作。
於是響應便從python返回到web伺服器,再被發送回瀏覽器,瀏覽器將響應內容渲染,一個請求就完成啦。

有了這樣的感性認識,那麼我們作為python web開發框架的作者,要做的事情就是在wsgi規范的基礎之上,提供盡可能便捷的開發手段和盡可能低的框架開銷,也即我們的代碼將要工作在wsgi與業務邏輯的中間層。架構上,web開發框架或多或少都遵循mvc的設計模式(django管它叫mtv,其實差不多)。同時,由於框架位於中間件的位置,加上其鼓勵模塊化與代碼復用的性質,自然需要為常見的http操作提供抽象。這里就可以展開一些話題:
請求路徑到view/controller的映射,請求參數的解析(routing,也叫路由)。
正則匹配的方案,比如django內置了一個簡單的正則表達式解析組件,能解析一般常見語法的正則表達式,把capturing groups解析成位置參數,named capturing groups解析成關鍵字參數。
也有dsl的方案,比如werkzeug的路由組件。
請求實體的處理。表單解析,配合web伺服器進行上傳文件處理。
正常的urlencoded表單,json表單,text/plain數據,multi-part表單
multi-part附件,附件操作api
大文件上傳(這個一般會被前端伺服器保存在磁碟上的臨時文件里,比方說nginx就是這么實現的)。
會話。http是無狀態(stateless)的,這個特點非常重要。如果沒有會話,你連續做幾個請求,卻沒有手段證明你們是同一個人/同一台機器(你完全可能是代理伺服器)。
存儲會話數據的會話後端(內存數據結構?文件?rdbms?redis?memcache?)
安全機制(hmac什麼的,可以參考beaker的secure cookie實現)
請求處理流程中的會話中間件(從cookie中提取會話,從query string中提取會話,從自定義頭中提取會話,等等)
view/controller界面。發揮你的創造力,用上你的工程經驗。
function-based or class-based views? 參考:django, bottle, web.py, tornado等一票框架的做法

框架的可選機制與服務如何暴露,
裝飾器?(比如@login_required 這種額外要求)
回調?(能想到的只有tornado和twisted這種非同步框架做事情的方式,還有整個js生態系統都是回調(不考慮promise什麼的)的思路)
傳入應用(業務邏輯)層的數據結構如何設計?(httprequest等價物,名字可能記不清了)
響應數據結構如何設計?(httpresponse等價物,同上)
資料庫操作封裝。web應用基本都是數據為中心,這個組件非常有必要,也是撰寫可復用代碼必須的一環,畢竟光是框架抽象了,資料庫操作還是裸sql什麼的,到時候生產環境一換(比如mysql變pgsql)還不是傻眼。
關系型資料庫。一站式解決方案參考:django orm、sqlalchemy;輕量級解決方案參考各資料庫python綁定。
非關系資料庫。各資料庫python綁定(pymongo, riak, redis-py之類),這個沒什麼可替代方案了,因為本來各種nosql庫都是適應某一特殊需求設計的,沒什麼互相替換的必要,那意味著重新進行技術選型。

⑺ 如何用 python 實現 web 抓取

#!/usr/bin/envpython
#-*-coding:utf-8-*-
#bycarlin.wang
#請參考


importurllib
importurllib2
importtime
importos
importrandom
frombs4importbeautifulsoup
defget_html(url):
headers={"user-agent":"mozilla/5.0(windowsnt6.1;wow64;rv:41.0)gecko/20100101firefox/41.0"}
req=urllib2.request(url,headers=headers)
res=urllib2.urlopen(req)
res_html=res.read().decode('utf-8')
returnres_html

defurlpages(page):
url="http://jandan.net/ooxx/page-" str(page) '#comments'
returnurl

deffind_img_:
soup=beautifulsoup(html,'html.parser',from_encoding='utf-8')
img_urls=soup.find_all(class_='view_img_link')
returnimg_urlsdefdownload_img(url):
fdir="d:/data/jiandan"
ifnotos.path.exists(fdir):
os.makedirs(fdir)
try:
#(p2)=os.path.split(url)
#(p2,f2)=os.path.split(url)
f2=''.join(map(lambdaxx:(hex(ord(xx))[2:]),os.urandom(16)))#隨機字元串作為文件名字,防止名字重復
#ifos.path.exists(fdir "/" f2):
#print"fdirisexists"
ifurl:
imgtype=url.split('/')[4].split('.')[1]
filename,msg=urllib.urlretrieve(url,fdir "/" f2 '.' imgtype)
ifos.path.getsize(filename)<100:
os.remove(filename)
exceptexception,e:
return"downimageerror!"


defrun():
forpageinrange(2001,2007):
html=get_html(urlpages(page))
urls=find_img_
forurlinurls:
s=url.get('href')
prints
download_img(s)

if__name__=='__main__':
run()
熱點內容
愛奇藝正義聯盟為啥不能緩存 發布:2024-01-20 00:52:13 瀏覽:248
caccess查詢資料庫 發布:2024-01-20 00:43:10 瀏覽:769
xp文件夾圖標更改 發布:2024-01-20 00:43:03 瀏覽:19
python和node 發布:2024-01-20 00:37:12 瀏覽:194
android拖拉 發布:2024-01-20 00:00:49 瀏覽:583
少兒編程課程體系介紹 發布:2024-01-20 00:00:48 瀏覽:846
我說你做下載ftp 發布:2024-01-20 00:00:47 瀏覽:8
安卓驅動培訓哪裡好 發布:2024-01-19 23:55:41 瀏覽:987
python轉為字元串 發布:2024-01-19 23:51:39 瀏覽:272
合同文件夾 發布:2024-01-19 23:50:52 瀏覽:740
网站地图