Inhaltsverzeichnis
Was macht es?
Installationsmethode
Einführung
Heim Backend-Entwicklung Python-Tutorial So tauschen Sie Daten zwischen Python und JavaScript aus

So tauschen Sie Daten zwischen Python und JavaScript aus

May 11, 2023 pm 11:04 PM
javascript python

telepath ist eine Django-Bibliothek für den Datenaustausch zwischen Python und JavaScript, die es Ihnen ermöglicht, Anwendungen mit umfangreichen clientseitigen Schnittstellen zu erstellen und gleichzeitig die Geschäftslogik im serverseitigen Code beizubehalten.

Was macht es?

Es bietet eine Möglichkeit, strukturierte Daten, einschließlich Python-Objekte, in einen serialisierbaren JSON-Formatierungsmechanismus zu packen. Dieser Mechanismus kann erweitert werden, um jede Python-Klasse zu unterstützen, indem er bei der entsprechenden JavaScript-Implementierung registriert wird. Die gepackten Daten können dann in die HTTP-Antwort eingefügt und in JavaScript dekomprimiert werden, um eine Datenstruktur zu erhalten, die den Originaldaten entspricht.

Installationsmethode

pip install telepath
Nach dem Login kopieren
Nach dem Login kopieren

und fügen Sie „Telepath“ zu den INSTALLED_APPS des Projekts hinzu.

Einführung

Nehmen wir an, wir erstellen eine Django-App zum Damespielen. Wir haben Tage oder Wochen damit verbracht, eine Python-Implementierung der Spielregeln zu erstellen und Klassen bereitzustellen, die den aktuellen Spielstatus und verschiedene Teile darstellen. Allerdings möchten wir dem Spieler auch eine wirklich benutzerfreundliche Oberfläche bieten, was bedeutet, dass es für uns an der Zeit ist, ein JavaScript-Frontend zu schreiben. Unser UI-Code verfügt zwangsläufig über eigene Objekte, die unterschiedliche Rollen repräsentieren und die Datenstrukturen widerspiegeln, die wir auf dem Server verfolgen – wir können jedoch keine Python-Objekte senden, daher wird das Senden dieser Daten an den Client normalerweise erfolgen. Dies bedeutet, dass eine JSON-Darstellung des Spielstatus entworfen wird und das Entwerfen einer Menge Styling-Code an beiden Enden, das Durchlaufen der Datenstruktur, um zwischen nativen Objekten hin und her zu konvertieren. Sehen wir uns an, wie Telepath den Prozess vereinfacht.

Ein komplettes Dame-Spiel ist etwas zu viel für dieses Tutorial, daher entscheiden wir uns einfach, diesen Schritt zu rendern ...

Erstellen Sie in der Python-Umgebung ein neues Django-Projekt:

pip install "Django>=3.1,<3.2" django-admin startproject draughts cd draughts ./manage.py startapp games
Nach dem Login kopieren

„Spiele“ zur INSTALLED_APPS-Liste in drafts/settings.py hinzufügen.

Der Einfachheit halber werden wir in diesem Beispiel keine Datenbank einbeziehen und den Spielstatus als normale Python-Klasse anstelle eines Django-Modells darstellen. Ändern Sie games/views.py wie folgt:

from django.shortcuts import render   class Piece:     def __init__(self, color, position):         self.color = color         self.position = position   class GameState:     def __init__(self, pieces):         self.pieces = pieces      @staticmethod     def new_game():         black_pieces = [             Piece(&#39;black&#39;, (x, y))             for y in range(0, 3)             for x in range((y + 1) % 2, 8, 2)         ]         white_pieces = [             Piece(&#39;white&#39;, (x, y))             for y in range(5, 8)             for x in range((y + 1) % 2, 8, 2)         ]         return GameState(black_pieces + white_pieces)   def game(request):     game_state = GameState.new_game()      return render(request, &#39;game.html&#39;, {})
Nach dem Login kopieren

Erstellen Sie games/templates/game.html wie folgt:

<!doctype html> <html>     <head>         <title>Draughts</title>         <script>             document.addEventListener('DOMContentLoaded', event => {                 const gameElement = document.getElementById('game');                 gameElement.innerHTML = 'TODO: render the board here'             });         </script>     </head>     <body>         <h2>Draughts</h2>         <div id="game">         </div>     </body> </html>
Nach dem Login kopieren

Fügen Sie die neue Ansicht zu Entwürfen/URLs hinzu. 🎜🎜#

from django.contrib import admin from django.urls import path  from games.views import game  urlpatterns = [     path('', game),     path('admin/', admin.site.urls), ]
Nach dem Login kopieren
Jetzt starten Sie den Server mit ./manage.py runserver und besuchen Sie http://localhost:8000/.

Bisher haben wir ein GameState-Objekt erstellt, das das neue Spiel darstellt – jetzt ist es an der Zeit, Telepath einzuführen, damit wir dieses Objekt an den Client übertragen können. Führen Sie den folgenden Befehl aus:

pip install telepath
Nach dem Login kopieren
Nach dem Login kopieren
und fügen Sie „telepath“ zur Liste INSTALLED_APPS in drafts/settings.py hinzu. Bearbeiten Sie nun die Datei games/views.py:

import json from django.shortcuts import render from telepath import JSContext  # ...  def game(request):     game_state = GameState.new_game()      js_context = JSContext()     packed_game_state = js_context.pack(game_state)     game_state_json = json.dumps(packed_game_state)      return render(request, 'game.html', {         'game_state_json': game_state_json,     })
Nach dem Login kopieren
Here JSContext ist ein Hilfstool, mit dem die Konvertierung von Spielstatusobjekten in eine Darstellung verwaltet wird, die wir in Javascript verwenden können. js_context.pack nimmt dieses Objekt und wandelt es in einen Wert um, der JSON-serialisiert und an unsere Vorlage übergeben werden kann. Allerdings schlägt das Neuladen der Seite jetzt mit einem Fehler der Form fehl: don't know how to pack object:

Dies liegt daran, dass GameState ein benutzerdefinierter Python-Typ ist, mit dem Telepath noch nicht umgehen kann . Alle an pack übergebenen benutzerdefinierten Typen müssen mit der entsprechenden JavaScript-Implementierung verknüpft werden. Dies erfolgt durch die Definition eines Adapterobjekts und dessen Registrierung bei telepath. Aktualisieren Sie game/views.py wie folgt:

import json from django.shortcuts import render from telepath import Adapter, JSContext, register  # ...  class GameState:     # keep definition as before   class GameStateAdapter(Adapter):     js_constructor = 'draughts.GameState'      def js_args(self, game_state):         return [game_state.pieces]      class Media:         js = ['draughts.js']   register(GameStateAdapter(), GameState)
Nach dem Login kopieren
Hier ist js_constructor die Kennung des JavaScript-Konstruktors, der zum Erstellen der GameState-Instanz auf dem Client verwendet wird, und die js_args-Definition wird an dieses Argument übergeben Liste für den Konstruktor, um das JavaScript-Gegenstück des angegebenen game_state-Objekts neu zu erstellen. Die Media-Klasse gibt eine Datei an, die Djangos Konventionen zur Formatierung von Medien folgt und in der sich die JavaScript-Implementierung von GameState befindet. Wir werden später sehen, wie diese JavaScript-Implementierung aussieht. Zunächst müssen wir einen ähnlichen Adapter für die Piece-Klasse definieren, da unsere Definition von GameStateAdapter davon abhängt, dass wir Piece-Instanzen packen können. Fügen Sie die folgende Definition zu games/views.py hinzu:

class Piece:     # keep definition as before   class PieceAdapter(Adapter):     js_constructor = 'draughts.Piece'      def js_args(self, piece):         return [piece.color, piece.position]      class Media:         js = ['draughts.js']   register(PieceAdapter(), Piece)
Nach dem Login kopieren
Laden Sie die Seite neu und Sie werden sehen, dass der Fehler verschwindet. Dies zeigt an, dass wir das GameState-Objekt erfolgreich in JSON serialisiert und an die Vorlage übergeben haben. Jetzt können wir es in die Vorlage einbinden – games/templates/game.html bearbeiten:

<body>        <h2>Draughts</h2>        <div id="game" data-game-state="{{ game_state_json }}">        </div>    </body>
Nach dem Login kopieren
Laden Sie die Seite erneut und überprüfen Sie das Spielelement in den Entwicklertools Ihres Browsers (in Chrome und in Firefox, rechts- Klicken Sie auf den TODO-Kommentar und wählen Sie „Inspizieren“ oder „Element prüfen“. Daraufhin wird eine JSON-Darstellung des GameState-Objekts angezeigt, die zum Entpacken in ein vollständiges JavaScript-Objekt bereit ist.

Zusätzlich zum Packen der Daten in ein JSON-serialisierbares Format verfolgt das JSContext-Objekt auch die JavaScript-Mediendefinitionen, die zum Entpacken der Daten als Medieneigenschaften erforderlich sind. Aktualisieren wir die Spielansicht, um sie auch an die Vorlage zu übergeben – in games/views.py:

def game(request):     game_state = GameState.new_game()      js_context = JSContext()     packed_game_state = js_context.pack(game_state)     game_state_json = json.dumps(packed_game_state)      return render(request, 'game.html', {         'game_state_json': game_state_json,         'media': js_context.media,     })
Nach dem Login kopieren
Fügen Sie den folgenden Code zur HTML-Header-Datei in games/templates/game.html hinzu: #🎜 🎜#
<head>         <title>Draughts</title>         {{ media }}         <script>             document.addEventListener('DOMContentLoaded', event => {                 const gameElement = document.getElementById('game');                 gameElement.innerHTML = 'TODO: render the board here'             });         </script>     </head>
Nach dem Login kopieren

重新加载页面并查看源代码,您将看到这带来了两个JavaScript包括 ——  telepath.js(客户端telepath库,提供解包机制)和我们在适配器定义中指定的draughts.js文件。后者尚不存在,所以让我们在games /  static / draughts.js中创建它:

class Piece {     constructor(color, position) {         this.color = color;         this.position = position;     } } window.telepath.register('draughts.Piece', Piece);   class GameState {     constructor(pieces) {         this.pieces = pieces;     } } window.telepath.register('draughts.GameState', GameState);
Nach dem Login kopieren

这两个类定义实现了我们先前在适配器对象中声明的构造函数-构造函数接收的参数是js_args定义的参数。window.telepath.register行将这些类定义附加到通过js_constructor指定的相应标识符。现在,这为我们提供了解压缩JSON所需的一切-回到games  / templates / game.html中,更新JS代码,如下所示:

<script>            document.addEventListener('DOMContentLoaded', event => {                const gameElement = document.getElementById('game');                const gameStateJson = gameElement.dataset.gameState;                const packedGameState = JSON.parse(gameStateJson);                const gameState = window.telepath.unpack(packedGameState);                console.log(gameState);            })        </script>
Nach dem Login kopieren

您可能需要重新启动服务器以获取新的games/static文件夹。重新加载页面,然后在浏览器控制台中,您现在应该看到填充了Piece对象的GameState对象。现在,我们可以继续在games/static/draughts.js中填写渲染代码:

class Piece {     constructor(color, position) {         this.color = color;         this.position = position;     }      render(container) {         const element = document.createElement('div');         container.appendChild(element);         element.style.width = element.style.height = '24px';         element.style.border = '2px solid grey';         element.style.borderRadius = '14px';         element.style.backgroundColor = this.color;     } } window.telepath.register('draughts.Piece', Piece)   class GameState {     constructor(pieces) {         this.pieces = pieces;     }      render(container) {         const table = document.createElement('table');         container.appendChild(table);         const cells = [];         for (let y = 0; y < 8; y++) {             let row = document.createElement(&#39;tr&#39;);             table.appendChild(row);             cells[y] = [];             for (let x = 0; x < 8; x++) {                 let cell = document.createElement(&#39;td&#39;);                 row.appendChild(cell);                 cells[y][x] = cell;                 cell.style.width = cell.style.height = &#39;32px&#39;;                 cell.style.backgroundColor = (x + y) % 2 ? &#39;silver&#39;: &#39;white&#39;;             }         }          this.pieces.forEach(piece => {             const [x, y] = piece.position;             const cell = cells[y][x];             piece.render(cell);         });     } } window.telepath.register('draughts.GameState', GameState)
Nach dem Login kopieren

在games/templates/game.html中添加对render方法的调用:

<script>             document.addEventListener('DOMContentLoaded', event => {                 const gameElement = document.getElementById('game');                 const gameStateJson = gameElement.dataset.gameState;                 const packedGameState = JSON.parse(gameStateJson);                 const gameState = window.telepath.unpack(packedGameState);                 gameState.render(gameElement);             })         </script>
Nach dem Login kopieren

重新加载页面,您将看到我们的跳棋程序已准备就绪,可以开始游戏了。

  • 让我们快速回顾一下我们已经取得的成果:

  • 我们已经打包和解包了自定义Python /  JavaScript类型的数据结构,而无需编写代码来递归该结构。如果我们的GameState对象变得更复杂(例如,“棋子”列表可能变成棋子和国王对象的混合列表,或者状态可能包括游戏历史),则无需重构任何数据打包/拆包逻辑,除了为每个使用的类提供一个适配器对象。

  • 仅提供了解压缩页面数据所需的JS文件-如果我们的游戏应用程序扩展到包括Chess,Go和Othello,并且所有生成的类都已通过Telepath注册,则我们仍然只需要提供与跳棋知识相关的代码。

即使我们使用任意对象,也不需要动态内联JavaScript ——  所有动态数据都以JSON形式传递,并且所有JavaScript代码在部署时都是固定的(如果我们的网站强制执行CSP,这一点很重要)。

Das obige ist der detaillierte Inhalt vonSo tauschen Sie Daten zwischen Python und JavaScript aus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Muss MySQL bezahlen? Muss MySQL bezahlen? Apr 08, 2025 pm 05:36 PM

MySQL hat eine kostenlose Community -Version und eine kostenpflichtige Enterprise -Version. Die Community -Version kann kostenlos verwendet und geändert werden, die Unterstützung ist jedoch begrenzt und für Anwendungen mit geringen Stabilitätsanforderungen und starken technischen Funktionen geeignet. Die Enterprise Edition bietet umfassende kommerzielle Unterstützung für Anwendungen, die eine stabile, zuverlässige Hochleistungsdatenbank erfordern und bereit sind, Unterstützung zu bezahlen. Zu den Faktoren, die bei der Auswahl einer Version berücksichtigt werden, gehören Kritikalität, Budgetierung und technische Fähigkeiten von Anwendungen. Es gibt keine perfekte Option, nur die am besten geeignete Option, und Sie müssen die spezifische Situation sorgfältig auswählen.

So verwenden Sie MySQL nach der Installation So verwenden Sie MySQL nach der Installation Apr 08, 2025 am 11:48 AM

Der Artikel führt den Betrieb der MySQL -Datenbank vor. Zunächst müssen Sie einen MySQL -Client wie MySQLworkBench oder Befehlszeilen -Client installieren. 1. Verwenden Sie den Befehl mySQL-uroot-P, um eine Verbindung zum Server herzustellen und sich mit dem Stammkonto-Passwort anzumelden. 2. Verwenden Sie die Erstellung von Createdatabase, um eine Datenbank zu erstellen, und verwenden Sie eine Datenbank aus. 3.. Verwenden Sie CreateTable, um eine Tabelle zu erstellen, Felder und Datentypen zu definieren. 4. Verwenden Sie InsertInto, um Daten einzulegen, Daten abzufragen, Daten nach Aktualisierung zu aktualisieren und Daten nach Löschen zu löschen. Nur indem Sie diese Schritte beherrschen, lernen, mit gemeinsamen Problemen umzugehen und die Datenbankleistung zu optimieren, können Sie MySQL effizient verwenden.

MySQL kann nach dem Herunterladen nicht installiert werden MySQL kann nach dem Herunterladen nicht installiert werden Apr 08, 2025 am 11:24 AM

Die Hauptgründe für den Fehler bei MySQL -Installationsfehlern sind: 1. Erlaubnisprobleme, Sie müssen als Administrator ausgeführt oder den Sudo -Befehl verwenden. 2. Die Abhängigkeiten fehlen, und Sie müssen relevante Entwicklungspakete installieren. 3. Portkonflikte müssen Sie das Programm schließen, das Port 3306 einnimmt, oder die Konfigurationsdatei ändern. 4. Das Installationspaket ist beschädigt. Sie müssen die Integrität herunterladen und überprüfen. 5. Die Umgebungsvariable ist falsch konfiguriert und die Umgebungsvariablen müssen korrekt entsprechend dem Betriebssystem konfiguriert werden. Lösen Sie diese Probleme und überprüfen Sie jeden Schritt sorgfältig, um MySQL erfolgreich zu installieren.

Die MySQL -Download -Datei ist beschädigt und kann nicht installiert werden. Reparaturlösung Die MySQL -Download -Datei ist beschädigt und kann nicht installiert werden. Reparaturlösung Apr 08, 2025 am 11:21 AM

Die MySQL -Download -Datei ist beschädigt. Was soll ich tun? Wenn Sie MySQL herunterladen, können Sie die Korruption der Datei begegnen. Es ist heutzutage wirklich nicht einfach! In diesem Artikel wird darüber gesprochen, wie dieses Problem gelöst werden kann, damit jeder Umwege vermeiden kann. Nach dem Lesen können Sie nicht nur das beschädigte MySQL -Installationspaket reparieren, sondern auch ein tieferes Verständnis des Download- und Installationsprozesses haben, um zu vermeiden, dass Sie in Zukunft stecken bleiben. Lassen Sie uns zunächst darüber sprechen, warum das Herunterladen von Dateien beschädigt wird. Dafür gibt es viele Gründe. Netzwerkprobleme sind der Schuldige. Unterbrechung des Download -Prozesses und der Instabilität im Netzwerk kann zu einer Korruption von Dateien führen. Es gibt auch das Problem mit der Download -Quelle selbst. Die Serverdatei selbst ist gebrochen und natürlich auch unterbrochen, wenn Sie sie herunterladen. Darüber hinaus kann das übermäßige "leidenschaftliche" Scannen einer Antiviren -Software auch zu einer Beschädigung von Dateien führen. Diagnoseproblem: Stellen Sie fest, ob die Datei wirklich beschädigt ist

Wie optimieren Sie die MySQL-Leistung für Hochlastanwendungen? Wie optimieren Sie die MySQL-Leistung für Hochlastanwendungen? Apr 08, 2025 pm 06:03 PM

Die MySQL-Datenbankleistung Optimierungshandbuch In ressourcenintensiven Anwendungen spielt die MySQL-Datenbank eine entscheidende Rolle und ist für die Verwaltung massiver Transaktionen verantwortlich. Mit der Erweiterung der Anwendung werden jedoch die Datenbankleistung Engpässe häufig zu einer Einschränkung. In diesem Artikel werden eine Reihe effektiver Strategien zur Leistungsoptimierung von MySQL -Leistung untersucht, um sicherzustellen, dass Ihre Anwendung unter hohen Lasten effizient und reaktionsschnell bleibt. Wir werden tatsächliche Fälle kombinieren, um eingehende Schlüsseltechnologien wie Indexierung, Abfrageoptimierung, Datenbankdesign und Caching zu erklären. 1. Das Design der Datenbankarchitektur und die optimierte Datenbankarchitektur sind der Eckpfeiler der MySQL -Leistungsoptimierung. Hier sind einige Kernprinzipien: Die Auswahl des richtigen Datentyps und die Auswahl des kleinsten Datentyps, der den Anforderungen entspricht, kann nicht nur Speicherplatz speichern, sondern auch die Datenverarbeitungsgeschwindigkeit verbessern.

So optimieren Sie die Datenbankleistung nach der MySQL -Installation So optimieren Sie die Datenbankleistung nach der MySQL -Installation Apr 08, 2025 am 11:36 AM

Die MySQL -Leistungsoptimierung muss von drei Aspekten beginnen: Installationskonfiguration, Indexierung und Abfrageoptimierung, Überwachung und Abstimmung. 1. Nach der Installation müssen Sie die my.cnf -Datei entsprechend der Serverkonfiguration anpassen, z. 2. Erstellen Sie einen geeigneten Index, um übermäßige Indizes zu vermeiden und Abfrageanweisungen zu optimieren, z. B. den Befehl Erklärung zur Analyse des Ausführungsplans; 3. Verwenden Sie das eigene Überwachungstool von MySQL (ShowProcessList, Showstatus), um die Datenbankgesundheit zu überwachen und die Datenbank regelmäßig zu sichern und zu organisieren. Nur durch kontinuierliche Optimierung dieser Schritte kann die Leistung der MySQL -Datenbank verbessert werden.

Braucht MySQL das Internet? Braucht MySQL das Internet? Apr 08, 2025 pm 02:18 PM

MySQL kann ohne Netzwerkverbindungen für die grundlegende Datenspeicherung und -verwaltung ausgeführt werden. Für die Interaktion mit anderen Systemen, Remotezugriff oder Verwendung erweiterte Funktionen wie Replikation und Clustering ist jedoch eine Netzwerkverbindung erforderlich. Darüber hinaus sind Sicherheitsmaßnahmen (wie Firewalls), Leistungsoptimierung (Wählen Sie die richtige Netzwerkverbindung) und die Datensicherung für die Verbindung zum Internet von entscheidender Bedeutung.

Navicat -Methode zum Anzeigen von MongoDB -Datenbankkennwort Navicat -Methode zum Anzeigen von MongoDB -Datenbankkennwort Apr 08, 2025 pm 09:39 PM

Es ist unmöglich, das MongoDB -Passwort direkt über Navicat anzuzeigen, da es als Hash -Werte gespeichert ist. So rufen Sie verlorene Passwörter ab: 1. Passwörter zurücksetzen; 2. Überprüfen Sie die Konfigurationsdateien (können Hash -Werte enthalten). 3. Überprüfen Sie Codes (May Hardcode -Passwörter).

See all articles