Ich war neugierig auf ** Django REST Framework ** und ** Vue.js **, also habe ich versucht, sie zu kombinieren.
Anstatt die HTML-Vorlagenfunktion von Django zu verwenden, geben Sie die HTML-Daten als statische Datei zurück und zeigen Sie eine Liste der Informationen an, die vom Browser über die Rest-API mit Vue.js abgerufen wurden. (DB ist SQLite3, Beispieldaten sind die Anzahl der Bestände meines Artikels.)
Python ist ** Python 3.5.1 ** Das Paket ist unten
# pip3 freeze
Django==1.10.5
django-filter==1.0.1
djangorestframework==3.5.3
Vue.js und Axios werden von CDN abgerufen, und die Version zum Zeitpunkt der Veröffentlichung (30.01.2017) lautet wie folgt.
Das Übliche.
# django-admin startproject qiitalist
# cd qiitalist/
# python manage.py startapp stocks
Die Komposition sieht so aus. (1) - (6) Wir werden die Umsetzung einzeln betrachten. (▲ = Datei diesmal nicht verwendet)
qiitalist
│ fixture.json # ② Modell hinzugefügt │ manage.py │ ├─qiitalist │ │ settings.py # ① Einstellungen hinzufügen │ │ urls.py # ⑤ URL-Einstellung hinzugefügt │ │ wsgi.py # ▲ │ │ init.py │ │ │ └ statisch # ⑥ Statische Datei erstellen │ vue_grid.css │ vue_grid.html │ vue_grid.js │ └─stocks │ admin.py # ▲ │ apps.py # ▲ │ models.py # ② Modell hinzufügen │ tests.py # ▲ │ serializer.py ③ Serializer hinzufügen │ urls.py # ⑤ URL-Einstellung hinzugefügt │ views.py # ④ Ansicht hinzugefügt │ init.py │ └─migrations
Apps zum Implementieren und REST Framework-Einstellungen hinzugefügt.
settings.py
#Auszug nur für den Zusatz
#App hinzufügen
INSTALLED_APPS += [
'stocks',
'rest_framework',
]
#REST-API-Einstellungen (Filter, Paging)
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',),
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 5
}
# views.Definieren Sie den von py verwendeten Pfad
PACKAGE_ROOT = os.path.abspath(os.path.dirname(__file__))
STATICFILES_DIRS = (os.path.join(PACKAGE_ROOT, 'static'),)
Bereiten Sie das von der REST-API zu veröffentlichende Datenmodell und die Anfangsdaten (Fixture) vor.
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": "Ich habe mit Python angefangen, maschinell zu lernen(Ich habe auch angefangen, bei Qiita zu posten)Datenaufbereitung",
"stock_count": 29
}
},
{
"model": "stocks.stock",
"pk": 2,
"fields": {
"title": "Ramen-Kartenerstellung mit Scrapy und Django",
"stock_count": 23
}
},
{
"model": "stocks.stock",
"pk": 3,
"fields": {
"title": "Ich habe mit der maschinellen Vorverarbeitung von Python Data begonnen",
"stock_count": 22
}
},
{
"model": "stocks.stock",
"pk": 4,
"fields": {
"title": "Rabbit MQ Nachrichtenbenachrichtigungs-App mit Growl in Python ~ mit Raspeye und Julius ~",
"stock_count": 3
}
}
]
Die Definition von Serialzier, die das Modell serialisiert, wurde hinzugefügt.
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')
Ansichtsdefinition hinzugefügt.
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
#Ansicht, die eine statische Datei zurückgibt
def index(_):
#Bei Verarbeitung als Django-Vorlage mit Render usw. "{{}}Ist Vue.Es verschwindet, bevor es an js übergeht.
#Ich konnte keine gute Lösung finden und habe sie vermieden, indem ich die Datei geöffnet und statisch geworfen habe.
html = open(
os.path.join(settings.STATICFILES_DIRS[0], "vue_grid.html")).read()
return HttpResponse(html)
#Rest API Viewssets
class StockViewSet(viewsets.ModelViewSet):
queryset = Stock.objects.all()
serializer_class = StockSerializer
#Geben Sie Felder an, die in API-Filtern verwendet werden können
filter_fields = ("id", "title", 'stock_count')
Geteilt nach Eltern (Qiitalist) und Kind (Aktien).
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'),
]
Imitieren Sie das Beispiel für eine Rasterkomponente von https://jp.vuejs.org/v2/examples/grid-component.html </ font>.
vue_grid.css
/*Ausgelassen, da es sich um eine Kopie handelt*/
vue_grid.js
//Das obere Komponentenmontageteil ist eine Kopie, daher wird es weggelassen.
//Geändert, um die angegebenen Daten nur für den neuen Vue-Teil von der Rest-API abzurufen
var demo = new Vue({
el: '#demo',
data: {
searchQuery: '',
gridColumns: ["id", "title", 'stock_count'], //Veränderung
gridData: [] //Daten werden von der API abgerufen, löschen Sie sie also
},
created: function(){ //Nehmen Sie es aus der Rest-API und fügen Sie es gridData hinzu.
var self = this //Es scheint in Bezug auf den Umfang notwendig zu sein (dies.gridData.Push führt zu einem Fehler. )
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 wird entsprechend den Anzeigeelementen leicht modifiziert.-->
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Vue</title>
<!--CSS wird geladen-->
<link rel="stylesheet" type="text/css" href="/static/vue_grid.css">
<!-- JS(CDN)Lesen-->
<!-- Vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<!-- Axios(vue-Anstelle von 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 gelesen-->
<script src="/static/vue_grid.js"></script>
</html>
Erstellen Sie eine Datenbank.
# python manage.py makemigrations
# python manage.py migrate
Anfangsdaten eingeben.
# python manage.py loaddata fixture.json
Starten Sie den Server.
# python manage.py runserver
Greifen Sie über Ihren Browser auf die API-Konsole "http: // localhost: 8000 / qiita / api /" zu.
Eine Liste der Aktien finden Sie unter http: // localhost: 8000 / qiita / api / stock /. (Bis zu 5 Artikel können in der Paging-Einstellung von ① erfasst und angezeigt werden. * Hinweis: Es gibt keine besondere Bedeutung, da der registrierte Bestand 4 Artikel umfasst.)
Greifen Sie auf http: // localhost: 8000 / qiita / zu und versuchen Sie, es anzuzeigen.
Vorläufig konnte ich einen bewegenden Teil machen, so dass ich anfing, motiviert zu werden, um zu studieren.
Es ist fatal, dass die Anzahl der verarbeiteten Daten gering ist. Es ist nicht interessant, also erhöhen wir die Anzahl der Artikel ... </ i> Referenz- [API mit explosiver Geschwindigkeit mithilfe des Django REST Framework implementieren](http: // qiita. com / kimihiro_n / items / 86e0a9e619720e57ecd8) - Beispiele für Gitterkomponenten-[Generate data using Django's Fixture](http //tech-shiroibanana.hatenablog.com/entry/2017/01/28/182815)-Axios wird empfohlen, wenn Sie Ajax mit Vue ausführen.