Cet article est comme LISP, mais c'est l'article du 5ème jour de Python Part 2 Advent Calendar 2015.
Il y a une phrase "Django + LISP" dans le README de Hy. Le code source qui montre le concept selon lequel l'application Django peut être implémentée dans Hy est affiché, mais comme je ne sais pas quoi faire avec cela seul, je vais expliquer étape par étape à partir du lieu de démarrage du projet
.
J'ai créé un référentiel sur github et j'ai poussé le commit séparément pour chaque étape, alors veuillez vous y référer.
démarrer le projet
Pour le moment, utilisez Python ordinaire pour django-admin.py start project
. La version de Django que vous utilisez est la 1.9.
django-admin.py startproject hellohy
Ceci est le commit au stade de start project
.
Tous les langages de programmation mènent à LISP, je voudrais donc éliminer le plus possible le code Python et le remplacer par Hy.
C'est le commit qui a réécrit le code immédiatement après avoir créé le projet dans Hy.
Il y a deux points sur lesquels je suis tombé un peu.
hy manage.hy runserver
ne fonctionnait pas même si je remplaçais manage.py
par Hy.
--Il semble que vous deviez mettre ʻimport hy dans le script de démarrage (
manage.py` dans ce cas) pour définir un module avec Hy.Voir ici pour savoir comment convertir Hy en ʻimport xde Python,
from y import z`. C'est évident en un coup d'œil.
À ce stade, même si vous supprimez tous les fichiers py
à l'exception de manage.py
, python manage.py runserver
fonctionnera et vous pourrez y accéder avec votre navigateur.
Après startproject
, l'ajout d'un module d'application Django avec startapp
est un flux standard de Django, mais à ce stade, il était clair qu'un module Python serait ajouté même avec startapp
. Ajoutez d'abord le modèle d'application.
C'est ce commit.
Utilisez ce ʻapp_template pour exécuter
startapp`.
python manage.py startapp --template=hellohy/app_template -ehy myapp
Le point est
--Spécifiez votre propre répertoire de modèles d'application avec --template
.
--Ajoutez l'extension du fichier à traiter comme modèle avec -e
.
C'est.
Voici un commit qui a créé une application appelée myapp
avec la commande ci-dessus et ajouté une vue qui affiche un modèle très simple appelé myapp.views.top
.
Tutoriel Hy a un exemple de code de type Django, mais à ce stade Vous pouvez voir que ce n'est pas un pseudo code, mais un code qui fonctionne réellement.
Voici un commit qui ajoute un modèle pour afficher les données sur la base de données.
La définition du modèle est la suivante.
(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)])
Considérez un Topic
comme un objet qui représente l'URL de la source d'un titre d'actualité. Les points importants sont les suivants.
--def class
utilise la dernière version de développement de la syntaxe Hy.
def class
models.DateTimeField (default = timezone.now)
est exprimé comme (models.DateTimeField: default timezone.now)
.Après avoir défini le modèle, la procédure pour make migrations
, migrate
est la même que pour Django normal.
Ceci est un exemple d'obtention de plusieurs objets Topic
définis ci-dessus et de rendu du modèle.
(import [django.shortcuts [render]]
[myapp.models [Topic]])
(defn top [req]
(def topics (-> (Topic.objects.all)
(.order_by "-id")))
(render req "top.html" {"topics" topics}))
Un exemple d'obtention d'un objet avec une clé primaire et de rendu d'un modèle.
(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}))
Je l'ai implémenté jusqu'au point d'ajouter une liste et une vue détaillée avec le commit suivant.
Je pense que l'avantage d'utiliser Django est qu'il est facile d'effectuer des tests unitaires, alors ajoutons également des tests unitaires cette fois-ci.
C'est ce commit.
J'aurais aimé pouvoir exécuter le test unitaire avec juste ce tests.hy
, mais le testeur n'a pas trouvé le .hy
, donc cela ressemble à un truc, mais le ciel avec le même nom. Le fichier .py
de est ajouté.
J'aimerais faire quelque chose à propos de cette astuce, mais j'ai réussi le test pour le moment.
$ python manage.py test myapp
Creating test database for alias 'default'...
....
----------------------------------------------------------------------
Ran 4 tests in 0.051s
OK
Destroying test database for alias 'default'...
J'ai présenté la procédure pour implémenter l'application Django sur Hy.
Si vous l'essayez vous-même, vous comprendrez que Hy peut faire ressortir toute la puissance de Django, vous pouvez donc sentir que tous les langages de programmation atteignent LISP.
La prochaine fois, j'aimerais explorer les possibilités de Hy à travers la méthode de déploiement de l'application Django écrite en Hy dans l'environnement réel.
Recommended Posts