Dieser Artikel ähnelt LISP, ist jedoch der Artikel zum 5. Tag von Python Part 2 Adventskalender 2015.
In der README von Hy befindet sich ein Satz "Django + LISP". Der Quellcode zeigt das Konzept, dass die Django-App in Hy implementiert werden kann, aber ich weiß nicht, was ich damit allein tun soll, daher werde ich Schritt für Schritt vom Ort des "Projektstarts" aus erklären.
Ich habe ein Repository auf Github erstellt und das Commit für jeden Schritt separat verschoben. Bitte beziehen Sie sich darauf.
Projekt starten
Verwenden Sie vorerst gewöhnliches Python für django-admin.py start project
. Die von Ihnen verwendete Version von Django ist 1.9.
django-admin.py startproject hellohy
Dies ist das Commit in der Phase des "Startprojekts".
Alle Programmiersprachen führen zu LISP, daher möchte ich Python-Code so weit wie möglich entfernen und durch Hy ersetzen.
Dies ist das Commit, mit dem der Code unmittelbar nach dem Erstellen des Projekts für Hy neu geschrieben wurde.
Es gibt zwei Punkte, auf die ich ein wenig gestoßen bin.
hy manage.hy runserver
nicht funktioniert hat, auch wenn ich manage.py
durch Hy ersetzt habe.Unter hier erfahren Sie, wie Sie Hy für import x
und from y import z
in Python konvertieren. Es ist auf einen Blick offensichtlich.
Selbst wenn Sie zu diesem Zeitpunkt alle "py" -Dateien mit Ausnahme von "manage.py" löschen, funktioniert "python manage.py runserver" und Sie können tatsächlich mit Ihrem Browser darauf zugreifen.
app_template
Nach "startproject" ist das Hinzufügen eines Django-Anwendungsmoduls mit "startapp" ein Standardfluss von Django, aber zu diesem Zeitpunkt war klar, dass ein Python-Modul auch mit "startapp" hinzugefügt werden würde. Fügen Sie zuerst die Anwendungsvorlage hinzu.
Das ist dieses Commit.
Verwenden Sie diese app_template
, um startapp
auszuführen.
python manage.py startapp --template=hellohy/app_template -ehy myapp
Der Punkt ist
--template
Ihr eigenes Anwendungsvorlagenverzeichnis an.-e
hinzu.Das ist.
Hier ist ein Commit, das mit dem obigen Befehl eine Anwendung namens "myapp" erstellt und eine Ansicht hinzugefügt hat, in der eine sehr einfache Vorlage mit dem Namen "myapp.views.top" angezeigt wird.
Hy Tutorial enthält Django-Modell-ähnlichen Beispielcode, jedoch zu diesem Zeitpunkt Sie können sehen, dass es sich nicht um einen Pseudocode handelt, sondern um einen Code, der tatsächlich funktioniert.
Hier ist ein Commit, das ein Modell hinzufügt, um die Daten in der Datenbank anzuzeigen.
Die Definition des Modells lautet wie folgt.
(import [django.db [models]]
[django.utils.timezone :as timezone])
(defclass Topic [models.Model]
[title (models.TextField)
url (models.URLField)
created_at (models.DateTimeField :default timezone.now)])
Stellen Sie sich ein Thema als ein Objekt vor, das die URL der Quelle für einen Nachrichtentitel darstellt. Die wichtigen Punkte sind wie folgt.
--def class
verwendet die neueste Entwicklungsversion der Hy-Syntax.
--Klasseneigenschaften werden in einer Liste für das dritte Argument des Makros def class
angegeben
models.DateTimeField (default = timezone.now)
wird ausgedrückt als (models.DateTimeField: default timezone.now)
.Nach dem Definieren des Modells ist das Verfahren für "Migrationen durchführen" und "Migrieren" dasselbe wie für normales Django.
Dies ist ein Beispiel für das Abrufen mehrerer oben definierter "Topic" -Objekte und das Rendern der Vorlage.
(import [django.shortcuts [render]]
[myapp.models [Topic]])
(defn top [req]
(def topics (-> (Topic.objects.all)
(.order_by "-id")))
(render req "top.html" {"topics" topics}))
Ein Beispiel für das Abrufen eines Objekts mit einem Primärschlüssel und das Rendern einer Vorlage.
(import [django.shortcuts [render]]
[django.http [Http404]]
[myapp.models [Topic]])
(defn topic_detial [req topic_id]
(def topic (try
(Topic.objects.get :pk topic_id)
(except [e Topic.DoesNotExist](raise Http404))))
(render req "topics/topic_detail.html" {"topic" topic}))
Ich habe es bis zum Hinzufügen einer Listen- und Detailansicht mit dem folgenden Commit implementiert.
Ich denke, dass der Vorteil von Django darin besteht, dass es einfach ist, Unit-Tests durchzuführen. Fügen wir also auch dieses Mal Unit-Tests hinzu.
Das ist dieses Commit.
Ich wünschte, ich könnte den Unit-Test nur mit diesem tests.hy
durchführen, aber der Testläufer hat das .hy
nicht gefunden, also fühlt es sich wie ein Trick an, aber der Himmel mit dem gleichen Namen. Die .py
-Datei von wird hinzugefügt.
Ich würde gerne etwas gegen diesen Trick unternehmen, aber ich habe den Test vorerst bestanden.
$ python manage.py test myapp
Creating test database for alias 'default'...
....
----------------------------------------------------------------------
Ran 4 tests in 0.051s
OK
Destroying test database for alias 'default'...
Ich habe das Verfahren zur Implementierung der Django-App auf Hy eingeführt.
Wenn Sie es selbst versuchen, werden Sie verstehen, dass Hy die volle Leistung von Django entfalten kann, sodass Sie das Gefühl haben, dass alle Programmiersprachen LISP erreichen.
Das nächste Mal möchte ich die Möglichkeiten von Hy anhand der Methode zur Bereitstellung der in Hy geschriebenen Django-App in der realen Umgebung untersuchen.
Recommended Posts