J'étais curieux de connaître ** le framework Django REST ** et ** Vue.js **, alors j'ai essayé de les combiner.
Au lieu d'utiliser la fonction de modèle html de Django, renvoyez les données HTML sous forme de fichier statique et affichez une liste d'informations obtenues à partir du navigateur via l'API Rest avec Vue.js. (DB est SQLite3, les exemples de données sont le nombre d'actions de mon article.)
Python est ** Python 3.5.1 ** Le package est ci-dessous
# pip3 freeze
Django==1.10.5
django-filter==1.0.1
djangorestframework==3.5.3
Vue.js et axios sont récupérés par CDN, et la version au moment de la publication (2017/1/30) est la suivante.
L'habituel.
# django-admin startproject qiitalist
# cd qiitalist/
# python manage.py startapp stocks
La composition ressemble à ceci. (1) - (6) Nous examinerons la mise en œuvre individuellement. (▲ = Fichier non utilisé cette fois)
qiitalist
│ fixture.json # ② Modèle ajouté │ manage.py │ ├─qiitalist │ │ settings.py # ① Ajouter des paramètres │ │ urls.py # ⑤ Paramètre d'URL ajouté │ │ wsgi.py # ▲ │ │ init.py │ │ │ └─ static # ⑥ Créer un fichier statique │ vue_grid.css │ vue_grid.html │ vue_grid.js │ └─stocks │ admin.py # ▲ │ apps.py # ▲ │ models.py # ② Ajouter un modèle │ tests.py # ▲ │ serializer.py ③ Ajouter un sérialiseur │ urls.py # ⑤ Paramètre d'URL ajouté │ views.py # ④ Vue ajoutée │ init.py │ └─migrations
Ajout d'applications à implémenter et de paramètres du Framework REST
settings.py
#Extrait uniquement pour l'ajout
#Ajouter une application
INSTALLED_APPS += [
'stocks',
'rest_framework',
]
#Paramètres de l'API REST (filtres, pagination)
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',),
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 5
}
# views.Définir le chemin utilisé par py
PACKAGE_ROOT = os.path.abspath(os.path.dirname(__file__))
STATICFILES_DIRS = (os.path.join(PACKAGE_ROOT, 'static'),)
Préparez le modèle de données à publier par l'API REST et les données initiales (fixture).
models.py
from django.db import models
class Stock(models.Model):
class Meta:
db_table = "stock"
id = models.AutoField(primary_key=True)
title = models.TextField()
stock_count = models.IntegerField()
fixture.json
[
{
"model": "stocks.stock",
"pk": 1,
"fields": {
"title": "J'ai commencé l'apprentissage automatique avec Python(J'ai aussi commencé à poster sur Qiita)Préparation des données",
"stock_count": 29
}
},
{
"model": "stocks.stock",
"pk": 2,
"fields": {
"title": "Création de carte Ramen avec Scrapy et Django",
"stock_count": 23
}
},
{
"model": "stocks.stock",
"pk": 3,
"fields": {
"title": "J'ai commencé l'apprentissage automatique avec le prétraitement des données Python",
"stock_count": 22
}
},
{
"model": "stocks.stock",
"pk": 4,
"fields": {
"title": "Application de notification de message Rabbit MQ avec Growl en Python ~ avec Raspeye et Julius ~",
"stock_count": 3
}
}
]
Ajout de la définition de Serialzier qui sérialise le modèle.
serializers.py
from rest_framework import serializers
from stocks.models import Stock
class StockSerializer(serializers.ModelSerializer):
class Meta:
model = Stock
fields = ("id", "title", 'stock_count')
Ajout de la définition de vue.
views.py
import os
from django.conf import settings
from django.http.response import HttpResponse
from rest_framework import viewsets
from stocks.models import Stock
from stocks.serializer import StockSerializer
#Vue qui renvoie un fichier statique
def index(_):
#Lorsqu'il est traité comme un modèle Django avec rendu, etc., "{{}}Est Vue.Il disparaît avant de passer à js.
#Je n'ai pas pu trouver une bonne solution, alors je l'ai évitée en ouvrant et en jetant le fichier sous statique.
html = open(
os.path.join(settings.STATICFILES_DIRS[0], "vue_grid.html")).read()
return HttpResponse(html)
#Ensembles de vues de l'API Rest
class StockViewSet(viewsets.ModelViewSet):
queryset = Stock.objects.all()
serializer_class = StockSerializer
#Spécifiez les champs pouvant être utilisés dans les filtres API
filter_fields = ("id", "title", 'stock_count')
Divisé par parent (qiitaliste) et enfant (actions).
urls.py(qiitalist)
from django.conf.urls import include, url
from stocks.urls import urlpatterns as qiitalist_url
urlpatterns = [
url(r'^qiita/', include(qiitalist_url)),
]
urls.py(stocks)
from django.conf.urls import include, url
from rest_framework import routers
from stocks.views import StockViewSet, index
router = routers.DefaultRouter()
router.register(r'stock', StockViewSet)
urlpatterns = [
# qiita/api/stock/
url(r'api/', include(router.urls)),
# qiita/
url(r'', index, name='index'),
]
Imitez l'exemple de composant de grille de https://jp.vuejs.org/v2/examples/grid-component.html </ font>.
vue_grid.css
/*Omis car il s'agit d'une copie*/
vue_grid.js
//La partie de montage du composant supérieur est une copie, elle est donc omise.
//Modifié pour obtenir les données spécifiées de l'API Rest uniquement pour la nouvelle partie Vue
var demo = new Vue({
el: '#demo',
data: {
searchQuery: '',
gridColumns: ["id", "title", 'stock_count'], //Changement
gridData: [] //Les données sont récupérées par l'API, supprimez-les
},
created: function(){ //Prenez-le de l'API Rest et ajoutez-le à gridData.
var self = this //Il semble nécessaire en termes de portée (ce.gridData.Push entraînera une erreur. )
axios.get('/qiita/api/stock/')
.then(function(response){
for(var i = 0; i < response.data.results.length; i++){
self.gridData.push(response.data.results[i]);
}
});
}
})
vue_grid.html
<!-- vue_grid.html est légèrement modifié en fonction des éléments affichés.-->
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Vue</title>
<!--Chargement CSS-->
<link rel="stylesheet" type="text/css" href="/static/vue_grid.css">
<!-- JS(CDN)Lis-->
<!-- Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<!-- Axios(vue-Au lieu de ressource)-->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<script type="text/x-template" id="grid-template">
<table>
<thead>
<tr>
<th v-for="key in columns"
@click="sortBy(key)"
:class="{ active: sortKey == key }">
{{ key | capitalize }}
<span class="arrow" :class="sortOrders[key] > 0 ? 'asc' : 'dsc'">
</span>
</th>
</tr>
</thead>
<tbody>
<tr v-for="entry in filteredData">
<td v-for="key in columns">
{{entry[key]}}
</td>
</tr>
</tbody>
</table>
</script>
<div id="demo">
<form id="search">
Search <input name="query" v-model="searchQuery">
</form>
<demo-grid
:data="gridData"
:columns="gridColumns"
:filter-key="searchQuery">
</demo-grid>
</div>
</body>
<!--JS lire-->
<script src="/static/vue_grid.js"></script>
</html>
Créez un DB.
# python manage.py makemigrations
# python manage.py migrate
Saisissez les données initiales.
# python manage.py loaddata fixture.json
Démarrez le serveur.
# python manage.py runserver
Accédez à la console API http: // localhost: 8000 / qiita / api /
depuis votre navigateur.
Obtenez une liste des stocks sur http: // localhost: 8000 / qiita / api / stock /
.
(Jusqu'à 5 articles peuvent être acquis et affichés dans le réglage de pagination de ①. * Remarque: Il n'y a pas de signification particulière car le stock enregistré est de 4 articles)
Accédez à http: // localhost: 8000 / qiita /
et essayez de l'afficher.
Pour le moment, j'ai pu faire une pièce mobile, alors j'ai commencé à me motiver à étudier. Vue.js est presque une copie, mais j'ai pensé qu'il était plus facile à utiliser (intuitivement) que AngularJS et React.js. Il est fatal que le nombre de données traitées soit faible. Ce n'est pas intéressant, alors augmentons le nombre d'articles ...
Recommended Posts