Computerwissenschaften

Richten Sie mit Socket einen Internet-Server in Python ein

01 von 10

Einführung in Socket

Als Ergänzung zum Netzwerkclient-Lernprogramm zeigt dieses Lernprogramm, wie ein einfacher Webserver in Python implementiert wird . Dies ist allerdings kein Ersatz für Apache oder Zope. Es gibt auch robustere Möglichkeiten, Webdienste in Python mithilfe von Modulen wie BaseHTTPServer zu implementieren. Dieser Server verwendet ausschließlich das Socket-Modul.

Sie werden sich daran erinnern, dass das Socket-Modul das Rückgrat der meisten Python-Webdienstmodule ist. Wie beim einfachen Netzwerkclient werden beim Erstellen eines Servers die Grundlagen von Webdiensten in Python transparent dargestellt. BaseHTTPServer selbst importiert das Socket-Modul, um einen Server zu beeinflussen.

02 von 10

Server ausführen

Zur Überprüfung: Alle Netzwerktransaktionen finden zwischen Clients und Servern statt. In den meisten Protokollen fragen die Clients nach einer bestimmten Adresse und empfangen Daten.

Innerhalb jeder Adresse kann eine Vielzahl von Servern ausgeführt werden. Das Limit liegt in der Hardware. Bei ausreichender Hardware (RAM, Prozessorgeschwindigkeit usw.) kann derselbe Computer gleichzeitig als Webserver, FTP-Server und Mailserver (Pop, SMTP, IMAP oder alle oben genannten) dienen. Jeder Dienst ist einem Port zugeordnet. Der Port ist an einen Socket gebunden. Der Server überwacht den zugehörigen Port und gibt Informationen aus, wenn an diesem Port Anforderungen eingehen.

03 von 10

Kommunikation über Steckdosen

Um eine Netzwerkverbindung zu beeinflussen, müssen Sie den Host, den Port und die an diesem Port zulässigen Aktionen kennen. Die meisten Webserver werden auf Port 80 ausgeführt. Um Konflikte mit einem installierten Apache-Server zu vermeiden, wird unser Webserver auf Port 8080 ausgeführt. Um Konflikte mit anderen Diensten zu vermeiden, sollten HTTP-Dienste am besten auf Port 80 oder 80 beibehalten werden 8080. Dies sind die beiden häufigsten. Wenn diese verwendet werden, müssen Sie natürlich einen offenen Port finden und Benutzer auf die Änderung aufmerksam machen.

Wie beim Netzwerkclient sollten Sie beachten, dass diese Adressen die gemeinsamen Portnummern für die verschiedenen Dienste sind. Solange der Client den richtigen Dienst am richtigen Port an der richtigen Adresse anfordert, wird die Kommunikation fortgesetzt. Der. Mail-Dienst von Google wurde beispielsweise anfangs nicht auf den allgemeinen Portnummern ausgeführt. Da Benutzer jedoch wissen, wie sie auf ihre Konten zugreifen können, können sie ihre E-Mails weiterhin abrufen.

Im Gegensatz zum Netzwerkclient sind alle Variablen auf dem Server fest verdrahtet. Für jeden Dienst, von dem erwartet wird, dass er ständig ausgeführt wird, sollten die Variablen seiner internen Logik nicht in der Befehlszeile festgelegt werden. Die einzige Variation wäre, wenn Sie aus irgendeinem Grund möchten, dass der Dienst gelegentlich und auf verschiedenen Portnummern ausgeführt wird. In diesem Fall können Sie jedoch weiterhin die Systemzeit überwachen und die Bindungen entsprechend ändern.

Unser einziger Import ist also das Socket-Modul.



Socket importieren

Als nächstes müssen wir einige Variablen deklarieren.

04 von 10

Hosts und Ports

Wie bereits erwähnt, muss der Server den Host kennen, dem er zugeordnet werden soll, und den Port, an dem er abhören soll. Für unsere Zwecke wird der Service für jeden Hostnamen überhaupt gelten.


host='' 
port=8080

Wie bereits erwähnt, lautet der Port 8080. Wenn Sie diesen Server in Verbindung mit dem Netzwerkclient verwenden, müssen Sie die in diesem Programm verwendete Portnummer ändern .

05 von 10

Erstellen eines Sockets

Ob wir Informationen anfordern oder bereitstellen möchten, um auf das Internet zugreifen zu können , müssen wir einen Socket erstellen. Die Syntax für diesen Aufruf lautet wie folgt:



=socket.socket (, )

Die anerkannten Socket-Familien sind:

  • AF_INET: IPv4-Protokolle (sowohl TCP als auch UDP)
  • AF_INET6: IPv6-Protokolle (sowohl TCP als auch UDP)
  • AF_UNIX: UNIX-Domänenprotokolle

Die ersten beiden sind offensichtlich Internetprotokolle. Auf alles, was über das Internet geht, kann in diesen Familien zugegriffen werden. Viele Netzwerke laufen immer noch nicht unter IPv6. Sofern Sie nichts anderes wissen, ist es am sichersten, standardmäßig IPv4 zu verwenden und AF_INET zu verwenden.

Der Socket-Typ bezieht sich auf die Art der Kommunikation, die über den Socket verwendet wird. Die fünf Sockeltypen sind wie folgt:

  • SOCK_STREAM: Ein verbindungsorientierter TCP-Bytestream
  • SOCK_DGRAM: UDP-Übertragung von Datagrammen (in sich geschlossene IP-Pakete, die nicht auf einer Client-Server-Bestätigung beruhen)
  • SOCK_RAW: ein Raw-Socket
  • SOCK_RDM: für zuverlässige Datagramme
  • SOCK_SEQPACKET: Sequentielle Übertragung von Datensätzen über eine Verbindung

Die bei weitem häufigsten Typen sind SOCK_STEAM und SOCK_DGRAM, da sie auf den beiden Protokollen der IP-Suite (TCP und UDP) funktionieren. Die letzten drei sind viel seltener und werden daher möglicherweise nicht immer unterstützt.

Erstellen wir also einen Socket und weisen ihn einer Variablen zu.



c=socket.socket (socket.AF_INET, socket.SOCK_STREAM)

06 von 10

Einstellen der Socket-Optionen

Nach dem Erstellen des Sockets müssen wir die Socket-Optionen festlegen. Für jedes Socket-Objekt können Sie die Socket-Optionen mithilfe der Methode setsockopt () festlegen. Die Syntax lautet wie folgt:

socket_object.setsockopt (Ebene, Optionsname, Wert) Für unsere Zwecke verwenden wir die folgende Zeile:


c.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

Der Begriff „Ebene“ bezieht sich auf die Kategorien von Optionen. Verwenden Sie für Optionen auf Socket-Ebene SOL_SOCKET. Für Protokollnummern würde man IPPROTO_IP verwenden. SOL_SOCKET ist ein konstantes Attribut des Sockets. Welche Optionen als Teil jeder Ebene verfügbar sind, hängt von Ihrem Betriebssystem ab und davon, ob Sie IPv4 oder IPv6 verwenden.
Die Dokumentation für Linux und verwandte Unix-Systeme finden Sie in der Systemdokumentation. Die Dokumentation für Microsoft-Benutzer finden Sie auf der MSDN-Website. Zum jetzigen Zeitpunkt habe ich keine Mac-Dokumentation zur Socket-Programmierung gefunden. Da Mac in etwa auf BSD Unix basiert, wird es wahrscheinlich eine vollständige Palette von Optionen implementieren.
Um die Wiederverwendbarkeit dieses Sockets sicherzustellen, verwenden wir die Option SO_REUSEADDR. Man könnte den Server so einschränken, dass er nur auf offenen Ports ausgeführt wird, aber das scheint unnötig. Beachten Sie jedoch, dass die Auswirkungen unvorhersehbar sind, wenn zwei oder mehr Dienste auf demselben Port bereitgestellt werden. Man kann nicht sicher sein, welcher Dienst welches Informationspaket empfängt.
Schließlich ist die ‚1‘ für einen Wert der Wert, unter dem die Anforderung an den Socket im Programm bekannt ist. Auf diese Weise kann ein Programm einen Socket auf sehr differenzierte Weise abhören.

07 von 10

Binden des Ports an die Steckdose

Nachdem wir den Socket erstellt und seine Optionen festgelegt haben, müssen wir den Port an den Socket binden.



c.bind ((Host, Port))

Nachdem die Bindung abgeschlossen ist, weisen wir den Computer nun an, zu warten und diesen Port abzuhören.



c.listen (1)

Wenn wir der Person, die den Server anruft, Feedback geben möchten, können wir jetzt einen Druckbefehl eingeben, um zu bestätigen, dass der Server betriebsbereit ist.

08 von 10

Behandeln einer Serveranforderung

Nachdem wir den Server eingerichtet haben, müssen wir Python jetzt mitteilen, was zu tun ist, wenn eine Anfrage an den angegebenen Port gestellt wird. Dazu referenzieren wir die Anfrage anhand ihres Wertes und verwenden sie als Argument einer persistenten while-Schleife.

Wenn eine Anfrage gestellt wird, sollte der Server die Anfrage annehmen und ein Dateiobjekt erstellen, um mit ihr zu interagieren.


während 1: 
csock, caddr=c.accept ()
cfile=csock.makefile ('rw', 0)

In diesem Fall verwendet der Server denselben Port zum Lesen und Schreiben. Daher erhält die Makefile-Methode das Argument ‚rw‘. Die Nulllänge der Puffergröße lässt einfach den Teil der Datei, der dynamisch bestimmt werden soll.

09 von 10

Senden von Daten an den Client

Sofern wir keinen Single-Action-Server erstellen möchten, besteht der nächste Schritt darin, Eingaben aus dem Dateiobjekt zu lesen. Wenn wir das tun, sollten wir darauf achten, diese Eingabe von überschüssigem Leerzeichen zu entfernen.


 line=cfile.readline (). strip ()

Die Anforderung erfolgt in Form einer Aktion, gefolgt von einer Seite, dem Protokoll und der Version des verwendeten Protokolls. Wenn eine Webseite bereitgestellt werden soll, wird diese Eingabe aufgeteilt, um die angeforderte Seite abzurufen, und diese Seite wird dann in eine Variable gelesen, die dann in das Socket-Dateiobjekt geschrieben wird. Eine Funktion zum Einlesen einer Datei in ein Wörterbuch finden Sie im Blog.

Um dieses Tutorial ein wenig anschaulicher zu machen, was man mit dem Socket-Modul machen kann, werden wir auf diesen Teil des Servers verzichten und stattdessen zeigen, wie man die Darstellung von Daten nuancieren kann. Geben Sie die nächsten Zeilen in das Programm ein .


cfile.write ('HTTP / 1.0 200 OK \ n \ n') 
cfile.write (' Willkommen% s! </ title> </ head>'% (str (caddr)) ) <br>cfile.write ('<body> <h1> Folgen Sie dem Link ... </ h1>') <br>cfile.write ('Alles, was der Server tun muss, ist') <br>cfile.write (', um den Text an den Socket zu senden . ') <br>cfile.write (' Es liefert den HTML-Code für einen Link ') <br>cfile.write (' und der Webbrowser konvertiert ihn. <br> <br> <br> <br> ') <br>cfile.write (' <font size="7"> <center> <a href="http://python.about.com/index.html"> Klicken Sie auf mich! </a> </ center> </ font> ') <br>cfile. Schreiben ('<br> <br> Der Wortlaut Ihrer Anfrage lautete: "% s"'% (Zeile)) <br>cfile.write ('</ body> </ html>') </pre> <p> <span class="item-number"> 10 </span> von 10 <span class="heading-toc" id="final-analysis-and-shutting-down"></span> </p> <h2> <span class="mntl-sc-block-heading__text"> Endgültige Analyse und Herunterfahren </span> </h2> <p>Wenn Sie eine Webseite senden, ist die erste Zeile eine gute Möglichkeit, die Daten in einen Webbrowser einzuführen. Wenn es weggelassen wird, rendern die meisten Webbrowser standardmäßig <a href="https://stuckismus.de/history-of-html" data-component="link" data-source="inlineLink" data-type="internalLink" data-ordinal="1">HTML</a>. Wenn man es jedoch einschließt, müssen auf das ‚OK‘ <em>zwei</em> neue Zeilenzeichen folgen . Diese werden verwendet, um die Protokollinformationen vom Seiteninhalt zu unterscheiden.</p> <p>Die Syntax der ersten Zeile lautet, wie Sie wahrscheinlich vermuten können, Protokoll, Protokollversion, Nachrichtennummer und Status. Wenn Sie jemals eine Webseite besucht haben, die verschoben wurde, haben Sie wahrscheinlich einen 404-Fehler erhalten. Die 200-Nachricht hier ist einfach die positive Nachricht.</p> <p>Der Rest der Ausgabe ist einfach eine Webseite, die in mehrere Zeilen unterteilt ist. Sie werden feststellen, dass der Server so programmiert werden kann, dass Benutzerdaten in der Ausgabe verwendet werden. Die letzte Zeile gibt die Webanforderung wieder, wie sie vom Server empfangen wurde.</p> <p> Schließlich müssen wir beim Schließen der Anforderung das Dateiobjekt und den Server-Socket schließen. </p> <pre id="mntl-sc-block_2-0-55" class="comp mntl-sc-block mntl-sc-block-html"></pre> <pre data-type="code">cfile.close () <br>csock.close () </pre> <p>Speichern Sie nun dieses Programm unter einem erkennbaren Namen. Wenn Sie nach dem Aufruf mit ‚python program_name.py‘ eine Nachricht programmiert haben, um zu bestätigen, dass der Dienst ausgeführt wird, sollte diese auf dem Bildschirm gedruckt werden. Das Terminal scheint dann anzuhalten. Alles ist so wie es sein sollte. Öffnen Sie Ihren Webbrowser und gehen Sie zu localhost: 8080. Sie sollten dann die Ausgabe der von uns angegebenen Schreibbefehle sehen. Bitte beachten Sie, dass ich aus Platzgründen keine Fehlerbehandlung in diesem Programm implementiert habe. Jedes Programm, das in die Wildnis entlassen wird, sollte es jedoch tun.</p> </div><!-- .entry-content --> </article><!-- #post-4219 --> <div class="clearfix"></div> <ul class="default-theme-post-navigation"> <li class="theme-nav-previous"><a href="https://stuckismus.de/building-a-classroom-community/" rel="prev"><span class="meta-nav">←</span> Aufbau einer Klassenzimmergemeinschaft</a></li> <li class="theme-nav-next"><a href="https://stuckismus.de/building-plans-cozy-affordable-cottages/" rel="next">9 Bücher zum Bauen von gemütlichen, erschwinglichen Cottages <span class="meta-nav">→</span></a></li> </ul> <div class="clearfix"></div> <h3 class='comment-reply-title'>Similar Posts</h3> <div class="mb-related-posts mb-simple-featured-posts mb-simple-featured-posts-wrap row"> <article class="mb-featured-article col-md-4 px-lg-3 post"> <a class="post-thumbnail" href="https://stuckismus.de/string-substitution-in-ruby/" aria-hidden="true" tabindex="-1"> <img width="501" height="300" src="https://stuckismus.de/wordp/wp-content/uploads/2021/03/string-substitution-in-ruby-501x300.jpg" class="attachment-magazinebook-featured-image-medium size-magazinebook-featured-image-medium wp-post-image" alt="" loading="lazy" /> </a> <span class="cat-links"><a href="https://stuckismus.de/wissenschaft-technik-mathematik/computer-wissenschaft/" rel="category tag">Computerwissenschaften</a></span> <header class="entry-header"> <h3 class="entry-title"><a href="https://stuckismus.de/string-substitution-in-ruby/" rel="bookmark">So verwenden Sie die String-Ersetzung in Ruby</a></h3> <div class="entry-meta"> </div><!-- .entry-meta --> </header><!-- .entry-header --> </article> <article class="mb-featured-article col-md-4 px-lg-3 post"> <a class="post-thumbnail" href="https://stuckismus.de/definition-of-variable/" aria-hidden="true" tabindex="-1"> <img width="501" height="300" src="https://stuckismus.de/wordp/wp-content/uploads/2021/03/definition-of-variable-501x300.jpg" class="attachment-magazinebook-featured-image-medium size-magazinebook-featured-image-medium wp-post-image" alt="" loading="lazy" /> </a> <span class="cat-links"><a href="https://stuckismus.de/wissenschaft-technik-mathematik/computer-wissenschaft/" rel="category tag">Computerwissenschaften</a></span> <header class="entry-header"> <h3 class="entry-title"><a href="https://stuckismus.de/definition-of-variable/" rel="bookmark">Was sind Variablen in Computerprogrammen?</a></h3> <div class="entry-meta"> </div><!-- .entry-meta --> </header><!-- .entry-header --> </article> <article class="mb-featured-article col-md-4 px-lg-3 post"> <a class="post-thumbnail" href="https://stuckismus.de/simple-address-book/" aria-hidden="true" tabindex="-1"> <img width="501" height="300" src="https://stuckismus.de/wordp/wp-content/uploads/2021/03/simple-address-book-501x300.jpg" class="attachment-magazinebook-featured-image-medium size-magazinebook-featured-image-medium wp-post-image" alt="" loading="lazy" /> </a> <span class="cat-links"><a href="https://stuckismus.de/wissenschaft-technik-mathematik/computer-wissenschaft/" rel="category tag">Computerwissenschaften</a></span> <header class="entry-header"> <h3 class="entry-title"><a href="https://stuckismus.de/simple-address-book/" rel="bookmark">So erstellen Sie ein einfaches Adressbuch mit PHP</a></h3> <div class="entry-meta"> </div><!-- .entry-meta --> </header><!-- .entry-header --> </article> </div> <div id="comments" class="comments-area"> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title">Schreibe einen Kommentar <small><a rel="nofollow" id="cancel-comment-reply-link" href="/building-a-simple-web-server/#respond" style="display:none;">Antworten abbrechen</a></small></h3><form action="https://stuckismus.de/wordp/wp-comments-post.php" method="post" id="commentform" class="comment-form" novalidate><p class="comment-notes"><span id="email-notes">Deine E-Mail-Adresse wird nicht veröffentlicht.</span> Erforderliche Felder sind mit <span class="required">*</span> markiert.</p><p class="comment-form-comment"><label for="comment">Kommentar</label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required="required"></textarea></p><p class="comment-form-author"><label for="author">Name <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" required='required' /></p> <p class="comment-form-email"><label for="email">E-Mail <span class="required">*</span></label> <input id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" required='required' /></p> <p class="comment-form-url"><label for="url">Website</label> <input id="url" name="url" type="url" value="" size="30" maxlength="200" /></p> <p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent">Meinen Namen, meine E-Mail-Adresse und meine Website in diesem Browser speichern, bis ich wieder kommentiere.</label></p> <p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Kommentar abschicken" /> <input type='hidden' name='comment_post_ID' value='4219' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p></form> </div><!-- #respond --> </div><!-- #comments --> </main><!-- #main --> </div><!-- #primary --> <div class="col-md-3 px-lg-3 "> <aside id="secondary" class="widget-area"> <section id="search-2" class="widget widget_search"><form action="https://stuckismus.de/" class="search-form searchform clearfix" method="get"> <div class="search-wrap"> <input type="text" placeholder="Search" class="s field" name="s"><button class="search-icon" type="submit"><i class="fas fa-search"></i></button> </div> </form><!-- .searchform --> </section><section id="categories-3" class="widget widget_categories"><h5 class="widget-title">Kategorien</h5> <ul> <li class="cat-item cat-item-15"><a href="https://stuckismus.de/geisteswissenschaften/bildende-kunst/">Bildende Kunst</a> </li> <li class="cat-item cat-item-21"><a href="https://stuckismus.de/wissenschaft-technik-mathematik/computer-wissenschaft/">Computerwissenschaften</a> </li> <li class="cat-item cat-item-23"><a href="https://stuckismus.de/sprachen/deutsche/">Deutsche</a> </li> <li class="cat-item cat-item-19"><a href="https://stuckismus.de/sprachen/englisch/">Englisch</a> </li> <li class="cat-item cat-item-18"><a href="https://stuckismus.de/sprachen/englisch-as-a-second-language/">Englisch Als Zweitsprache</a> </li> <li class="cat-item cat-item-20"><a href="https://stuckismus.de/sprachen/franzosisch/">Französisch</a> </li> <li class="cat-item cat-item-27"><a href="https://stuckismus.de/ressourcen/for-adult-learners/">Für Erwachsene Lernende</a> </li> <li class="cat-item cat-item-13"><a href="https://stuckismus.de/ressourcen/for-educators/">Für Pädagogen</a> </li> <li class="cat-item cat-item-11"><a href="https://stuckismus.de/ressourcen/for-students-and-parents/">Für Schüler Und Eltern</a> </li> <li class="cat-item cat-item-12"><a href="https://stuckismus.de/geisteswissenschaften/geographie/">Geographie</a> </li> <li class="cat-item cat-item-7"><a href="https://stuckismus.de/geisteswissenschaften/geschichte-kultur/">Geschichte & Kultur</a> </li> <li class="cat-item cat-item-24"><a href="https://stuckismus.de/sprachen/italienisch/">Italienisch</a> </li> <li class="cat-item cat-item-22"><a href="https://stuckismus.de/sprachen/japanisch/">Japanisch</a> </li> <li class="cat-item cat-item-14"><a href="https://stuckismus.de/geisteswissenschaften/literatur/">Literatur</a> </li> <li class="cat-item cat-item-25"><a href="https://stuckismus.de/sprachen/mandarin/">Mandarin</a> </li> <li class="cat-item cat-item-4"><a href="https://stuckismus.de/wissenschaft-technik-mathematik/mathematik/">Mathematik</a> </li> <li class="cat-item cat-item-1"><a href="https://stuckismus.de/uncategorized/">Nicht Kategorisiert</a> </li> <li class="cat-item cat-item-26"><a href="https://stuckismus.de/geisteswissenschaften/philosophie/">Philosophie</a> </li> <li class="cat-item cat-item-8"><a href="https://stuckismus.de/geisteswissenschaften/probleme/">Probleme</a> </li> <li class="cat-item cat-item-16"><a href="https://stuckismus.de/sprachen/russisch/">Russisch</a> </li> <li class="cat-item cat-item-17"><a href="https://stuckismus.de/wissenschaft-technik-mathematik/social-wissenschafts/">Sozialwissenschaften</a> </li> <li class="cat-item cat-item-10"><a href="https://stuckismus.de/sprachen/spanisch/">Spanisch</a> </li> <li class="cat-item cat-item-9"><a href="https://stuckismus.de/wissenschaft-technik-mathematik/animals-nature/">Tiere und Natur</a> </li> <li class="cat-item cat-item-2"><a href="https://stuckismus.de/wissenschaft-technik-mathematik/wissenschaft/">Wissenschaft</a> </li> <li class="cat-item cat-item-5"><a href="https://stuckismus.de/wissenschaft-technik-mathematik/">Wissenschaft & Technik & Mathematik</a> </li> </ul> </section></aside><!-- #secondary --> </div> </div> </div> </div><!-- #content --> <footer id="colophon" class="site-footer"> 2021 © <a href="https://stuckismus.de/" target="_blank">Stuckismus.de</a> | <a href="https://kamiltaylan.blog/" target="_blank">Finanzielle Konzepte und Bedingungen</a> </footer><!-- #colophon --> </div><!-- #page --> <script type='text/javascript' src='https://stuckismus.de/wordp/wp-content/themes/magazinebook/js/navigation.js?ver=1.0.9' id='magazinebook-navigation-js'></script> <script type='text/javascript' src='https://stuckismus.de/wordp/wp-content/themes/magazinebook/js/skip-link-focus-fix.js?ver=1.0.9' id='magazinebook-skip-link-focus-fix-js'></script> <script type='text/javascript' src='https://stuckismus.de/wordp/wp-content/themes/magazinebook/js/jquery.easy-ticker.js?ver=3.1.0' id='magazinebook-news-ticker-js'></script> <script type='text/javascript' src='https://stuckismus.de/wordp/wp-content/themes/magazinebook/js/splide.min.js?ver=2.3.1' id='splide-js-js'></script> <script type='text/javascript' src='https://stuckismus.de/wordp/wp-content/themes/magazinebook/js/theme.js?ver=1.0.9' id='magazinebook-theme-js-js'></script> <script type='text/javascript' src='https://stuckismus.de/wordp/wp-includes/js/comment-reply.min.js?ver=5.7.2' id='comment-reply-js'></script> <script type='text/javascript' id='wp_slimstat-js-extra'> /* <![CDATA[ */ var SlimStatParams = {"ajaxurl":"https:\/\/stuckismus.de\/wordp\/wp-admin\/admin-ajax.php","baseurl":"\/","dnt":"noslimstat,ab-item","ci":"YTo0OntzOjEyOiJjb250ZW50X3R5cGUiO3M6NDoicG9zdCI7czo4OiJjYXRlZ29yeSI7czoyOiIyMSI7czoxMDoiY29udGVudF9pZCI7aTo0MjE5O3M6NjoiYXV0aG9yIjtzOjU6ImFkbWluIjt9.2701a5e263f771c50aa39d041bc7d419"}; /* ]]> */ </script> <script type='text/javascript' src='https://cdn.jsdelivr.net/wp/wp-slimstat/tags/4.8.8.1/wp-slimstat.min.js' id='wp_slimstat-js'></script> <script type='text/javascript' src='https://stuckismus.de/wordp/wp-includes/js/wp-embed.min.js?ver=5.7.2' id='wp-embed-js'></script> <script type='text/javascript' id='fifu-image-js-js-extra'> /* <![CDATA[ */ var fifuImageVars = {"fifu_lazy":"","fifu_woo_lbox_enabled":"1","fifu_woo_zoom":"inline","fifu_is_product":"","fifu_is_flatsome_active":"","fifu_rest_url":"https:\/\/stuckismus.de\/wp-json\/","fifu_nonce":"bb96594f68"}; /* ]]> */ </script> <script type='text/javascript' src='https://stuckismus.de/wordp/wp-content/plugins/featured-image-from-url/includes/html/js/image.js?ver=3.5.6' id='fifu-image-js-js'></script> </body> </html> <!-- Page generated by LiteSpeed Cache 3.6.2 on 2021-05-15 05:23:57 -->