Heim >Backend-Entwicklung >Python-Tutorial >Ein einfacher statischer HTTP-Dateiserver, der mit NodeJS und Python geschrieben wurde

Ein einfacher statischer HTTP-Dateiserver, der mit NodeJS und Python geschrieben wurde

高洛峰
高洛峰Original
2017-02-14 14:07:431367Durchsuche

Im täglichen Entwicklungsprozess müssen wir häufig einige im CDN platzierte statische Dateien (wie JavaScript, CSS, HTML-Dateien usw.) ändern. In diesem Prozess hoffen wir, eine Möglichkeit zu haben, das Online-CDN abzubilden Verzeichnis in lokal Ein Verzeichnis auf der Festplatte, sodass wir eine Datei nicht veröffentlichen müssen, wenn wir sie lokal ändern, und der Effekt sofort nach der Aktualisierung sichtbar ist.

Unser CDN-Domänenname lautet beispielsweise: http://a.mycdn.com und das entsprechende lokale Verzeichnis lautet: D:workassets. Wir hoffen, dass alle Anfragen an http://a.mycdn.com gesendet werden. com/* Der Zugriff wird dem lokalen D:workassets* zugeordnet. Wenn Sie beispielsweise http://a.mycdn.com/s/atp.js besuchen, lesen Sie tatsächlich die lokale Datei D:workassetssatp.js, ohne Online-Dateien aus dem Internet herunterzuladen.

Es ist sehr einfach, diese Funktion zu implementieren:

1. Öffnen Sie einen HTTP-Dienst lokal und überwachen Sie Port 80.
2 Datei und fügen Sie „127.0.0.1 a.mycdn.com“ hinzu, binden Sie den CDN-Domänennamen an die lokale Serveradresse.
3 Überprüfen Sie nach Erhalt einer GET-Anfrage, ob die entsprechende Datei vorhanden ist Wenn der Inhalt dieser Datei nicht vorhanden ist, wird der entsprechende Online-Inhalt zurückgegeben.

Wie Sie sehen, besteht der entscheidende Teil darin, einen lokalen HTTP-Dienst aufzubauen. In diesem Bereich gibt es viele Tutorials, wie zum Beispiel die lokale Installation von Serversoftware wie Apache oder Ngnix und die anschließende Konfiguration entsprechender Weiterleitungsregeln. Ich persönlich bin jedoch der Meinung, dass diese Methode immer noch etwas kompliziert ist. In diesem Artikel wird eine weitere Methode vorgestellt, die keine Installation von Serversoftware erfordert.

Da wir lokal entwickeln und debuggen, sind die Anforderungen an Leistung und Parallelität nicht hoch, sodass wir eigentlich keine professionelle HTTP-Software wie Apache/Ngnix benötigen, sondern nur einen Abschnitt, der HTTP bereitstellen kann das Dienstskript. Verwenden Sie beispielsweise nodejs, um es zu implementieren.

Code kopieren Der Code lautet wie folgt:


/**
 * Autor: oldj
 *
 **/

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

local_folders = [ // Lokaler Pfad, der Agent sucht nach Dateien in den Verzeichnissen in dieser Liste. Wenn er nicht gefunden wird, geht er zur Online-Adresse
„D:/work/assets“
];
base_url = "http://10.232.133.214"; // Online-Pfad, wenn die Datei nicht gefunden werden kann, auf diese Adresse umleiten


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

console.log("try toload " + pathname);

for (i = 0; i < l; i++ ) {

fn = local_folders[i] + pathname;
if (path.existsSync(fn) && fs.statSync(fn).isFile()) {
fs .readFile(fn, function (err, data) {
Response.writeHead(200);
Response.write(Data);
Response.end();
});

return;
}

}

Response.writeHead(302, {
"Location":base_url + pathname
});
Antwort. end();
}

http.createServer(
function (request, Response) {

var req_url = request.url,
pathname;

// Verarbeitung einer Anfrage ähnlich wie http://www.php.cn/,tbsp/tbsp.css?t=20110920172000.css
pathname = req_url.indexOf("??") == -1 ? url.parse(request. url).pathname : req_url;
console.log("Anfrage für '" + Pfadname + "' empfangen.");
loadFile(pathname, Response);

}).listen( 80);


Bitte ändern Sie die Werte der Variablen local_folders und base_url oben in die Werte, die Sie benötigen. Speichern Sie diese Datei beispielsweise als local-cdn-proxy.js und führen Sie dann „node local-cdn-proxy.js“ in der Befehlszeile aus. Vergessen Sie natürlich nicht, die Bindung auszuführen Gastgeber.

Wenn Sie über http auf einen Pfad zugreifen, sucht das obige Skript zunächst im entsprechenden lokalen Verzeichnis. Wenn es gefunden wird, wird der Inhalt der entsprechenden Datei zurückgegeben. Wenn diese nicht gefunden wird, wird direkt dorthin gesprungen die entsprechende Adresse online. Für Situationen, in denen er nicht gefunden werden kann, besteht eine andere Lösung darin, den lokalen Server den entsprechenden Inhalt online herunterladen und zurückgeben zu lassen. Für diese Anforderung reicht jedoch ein 302-Sprung aus.

Zusätzlich zur NodeJS-Version habe ich auch eine Python-Version geschrieben:


Kopieren Sie den Code Der Code lautet wie folgt:


# -*- Codierung: utf-8 -*-
#
# Autor: oldj
#

Betriebssystem importieren
BaseHTTPServer importieren

LOCAL_FOLDERS = [
"D:/work/assets"
]
BASE_URL = "http://10.232.133.214"

class WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler) :

def do_GET(self):
print „Anfrage für ‚%s‘ empfangen.“ % self.path
für Ordner in LOCAL_FOLDERS:
fn = os.path.join(folder, self. path.replace("/", os.sep)[1:])
if os.path.isfile(fn):
self.send_response(200)
self.wfile.write(open( fn, "rb").read())
break

else:
self.send_response(302)
self.send_header("Location", "%s%s" % (BASE_URL, self.path))

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


Wie Sie sehen können, ist die Python-Version des Codes viel schlanker als die NodeJS-Version.

Die Funktionen der beiden oben genannten Codeteile sind relativ einfach. Beispielsweise gibt es keine Ausgabe von MIME-Type, Content-Length und anderen Header-Informationen des Inhalts und keine möglichen Blockierungsoperationen (z. B Zeitüberschreitung beim Lesen von Dateien usw.) werden durchgeführt. Es handelt sich bereits um funktionsfähige Versionen für lokale Entwicklungsumgebungen, und Sie können diese beiden Skripte weiter erweitern, um weitere Anforderungen zu erfüllen.

Weitere verwandte Artikel über einen einfachen statischen HTTP-Dateiserver, der in NodeJS und Python geschrieben ist, finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn