搜尋
首頁後端開發Python教學使用nodejs、Python寫的一個簡易HTTP靜態檔案伺服器

日常開發過程中,我們常常需要修改一些放在CDN 上的靜態檔案(如JavaScript、CSS、HTML 檔案等),這個過程中,我們希望有一種方式將線上CDN 的目錄對應到本機硬碟上的某個目錄,這樣,當我們在本地修改了某個檔案時,不需要發布,刷新後馬上能看到效果。

例如,我們的CDN 網域是:http://a.mycdn.com,本地對應的目錄是:D:workassets,我們希望所有對http://a.mycdn.com/* 的存取被映射到在地的D:workassets* 下。如造訪 http://a.mycdn.com/s/atp.js 時,實際上是讀取的是本地的 D:workassetssatp.js,而不需要從網路下載線上的檔案。

實現這個功能很簡單,關鍵點如下:

1、在本地開啟一個HTTP 服務,監聽80 端口;
2、修改系統hosts 文件,添加“127.0.0.1 a.mycdn.com”,將CDN 域名綁定為本地伺服器位址;
3、設定本地HTTP 服務,接收到一個GET 請求後,先檢查本地硬碟上是否存在對應的文件,如存在,則返回這個文件的內容,如不存在,則回傳線上對應的內容。

可以看到,關鍵部分是需要搭建一個本地的 HTTP 服務。這方面有很多教程,例如在本機安裝 Apache 或 Ngnix 等伺服器軟體,再配置對應的轉送規則等。不過個人覺得這類方法還是有點複雜,本文要介紹的,是另外的不需要安裝伺服器軟體的方法。

因為我們正在本地開發調試,對性能、並發性的要求並不高,因此我們其實並不需要一個像Apache/Ngnix 這樣的專業的HTTP 軟體,我們只需要一段能提供HTTP 服務的腳本即可。例如用 nodejs 來實作。

複製程式碼 程式碼如下:


/**
 * 作者:oldj
 *
 **/

var http = require("http"),
 url = require("url"),
 path = require("path" ),
 fs = require("fs"),
 local_folders,
 base_url;

local_folders = [ // 本地路徑,代理將在這個列表中的目錄下尋找文件,如果沒有找到則轉到線上地址
"D:/work/assets"
];
base_url = "http://10.232.133.214"; // 線上路徑,如果找不到文件,則轉向到這個位址


function loadFile(pathname, response ) {
 var i, l = local_folders.length,
  fn;

 console.log("try to load " + pathname);

 for (i = 0 i   if (path.existsSync(fn) && fs.statSync(fn).isFile()) {

   fs.readFile(fn, function (err, data) {
   fs.readFile(fn, function (err, data) {
   fs.
    response.write(data);
    response.end();
   });

   return 

. "Location":base_url + pathname
 });

response.end();

}

http.createServer(
 function (request, response) {

  var req_url = request.url, ,tbsp/tbsp.css?t=20110920172000.css 的請求
  pathname = req_url.indexOf("??") == -1 ? url.parse(request.url).pathname : req_url; Request for '" + pathname + "' received.");

  loadFile(pathname, response);


 }).listen(80);


注意將上面的local_folders 和值修改為兩個變數的值你需要的值。將這個檔案保存下來,例如儲存為 local-cdn-proxy.js,然後在命令列執行“node local-cdn-proxy.js”,本地伺服器就運行起來了,當然,別忘了綁定 hosts 。


當透過 http 存取一個路徑時,上面的腳本會先在本地對應的目錄下查找,找到則返回對應文件的內容,找不到則直接 302 跳到線上對應的位址。對於找不到的情況,還有一種處理辦法是由本地伺服器從線上下載對應的內容並返回,不過對這個需求來說,302 跳轉就足夠了。

除了nodejs 版本,我也寫了一個Python 的版本:



複製程式碼

程式碼如下:

*-

# -*- coding: utv-8 -g #

import os
import BaseHTTPServer

LOCAL_FOLDERS = [    "D:/work/assets"]

BASE_URL = "http://10.232.133.1232.133.142325 月

    def do_GET(self):
        print "Request for '%s' received." % self.path
    = os.path.join(folder, self.path.replace("/", os.sep)[1:])
            if os.path.isfile(fn):
                 self.wfile.write(open(fn, "rb").read())
                break

        else:

            self.send_response(302)

    .path))

server = BaseHTTPServer.HTTPServer(("0.0.0.0", 80 ), WebRequestHandler)

server.serve_forever()



可以看到,Python 版本的程式碼比nodejs 版本的精簡了很多。


上面的兩段程式碼的功能還相對比較簡單,例如沒有輸出內容的 MIME-Type、Content-Length 等頭訊息,對可能的阻塞操作(如讀取檔案逾時等)也沒有做特別的處理。對於本機開發環境來說,它們已經是可以工作的版本了,你也可以繼續擴展這兩個腳本,以便滿足更多的需求。

更多使用nodejs、Python寫的一個簡易HTTP靜態檔案伺服器相關文章請關注PHP中文網!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
您如何切成python列表?您如何切成python列表?May 02, 2025 am 12:14 AM

SlicingaPythonlistisdoneusingthesyntaxlist[start:stop:step].Here'showitworks:1)Startistheindexofthefirstelementtoinclude.2)Stopistheindexofthefirstelementtoexclude.3)Stepistheincrementbetweenelements.It'susefulforextractingportionsoflistsandcanuseneg

在Numpy陣列上可以執行哪些常見操作?在Numpy陣列上可以執行哪些常見操作?May 02, 2025 am 12:09 AM

numpyallowsforvariousoperationsonArrays:1)basicarithmeticlikeaddition,減法,乘法和division; 2)evationAperationssuchasmatrixmultiplication; 3)element-wiseOperations wiseOperationswithOutexpliitloops; 4)

Python的數據分析中如何使用陣列?Python的數據分析中如何使用陣列?May 02, 2025 am 12:09 AM

Arresinpython,尤其是Throughnumpyandpandas,weessentialFordataAnalysis,offeringSpeedAndeffied.1)NumpyArseNable efflaysenable efficefliceHandlingAtaSetSetSetSetSetSetSetSetSetSetSetsetSetSetSetSetsopplexoperationslikemovingaverages.2)

列表的內存足跡與python數組的內存足跡相比如何?列表的內存足跡與python數組的內存足跡相比如何?May 02, 2025 am 12:08 AM

列表sandnumpyArraysInpythonHavedIfferentMemoryfootprints:listSaremoreFlexibleButlessMemory-效率,而alenumpyArraySareSareOptimizedFornumericalData.1)listsStorReereReereReereReereFerenceStoObjects,with withOverHeadeBheadaroundAroundaround64byty64-bitsysysysysysysysysyssyssyssyssysssyssys2)

部署可執行的Python腳本時,如何處理特定環境的配置?部署可執行的Python腳本時,如何處理特定環境的配置?May 02, 2025 am 12:07 AM

toensurepythonscriptsbehavecorrectlyacrycrosdevelvermations,分期和生產,USETHESTERTATE:1)Environment varriablesForsimplesettings,2)configurationfilesfilesForcomPlexSetups,3)dynamiCofforComplexSetups,dynamiqualloadingForaptaptibality.eachmethodoffersuniquebeneiquebeneqeniquebenefitsandrefitsandrequiresandrequiresandrequiresca

您如何切成python陣列?您如何切成python陣列?May 01, 2025 am 12:18 AM

Python列表切片的基本語法是list[start:stop:step]。 1.start是包含的第一個元素索引,2.stop是排除的第一個元素索引,3.step決定元素之間的步長。切片不僅用於提取數據,還可以修改和反轉列表。

在什麼情況下,列表的表現比數組表現更好?在什麼情況下,列表的表現比數組表現更好?May 01, 2025 am 12:06 AM

ListSoutPerformarRaysin:1)DynamicsizicsizingandFrequentInsertions/刪除,2)儲存的二聚體和3)MemoryFeliceFiceForceforseforsparsedata,butmayhaveslightperformancecostsinclentoperations。

如何將Python數組轉換為Python列表?如何將Python數組轉換為Python列表?May 01, 2025 am 12:05 AM

toConvertapythonarraytoalist,usEthelist()constructororageneratorexpression.1)intimpthearraymoduleandcreateanArray.2)USELIST(ARR)或[XFORXINARR] to ConconverTittoalist,請考慮performorefformanceandmemoryfformanceandmemoryfformienceforlargedAtasetset。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版