Jsfiddle의 Vue.js에서 DRF로 만든 api에 액세스하고 싶습니다.
16333 단어 django-rest-frameworkVue.js장고
경위
Vue.js의 프로젝트를 웹상에서 간편하게 만들 수 있는 jsfiddle로, Django Rest Framework(이하 DRF)로 작성한 api에 액세스하고 싶고, 시도했습니다.
이 기사에 쓰기
절차
1. DRF로 api 만들기
환경 만들기mkfir simple_drf
cd simple_drf
python3 -m vena venv
source venv/bin/activate
pip install django
pip install djangorestframework
django-admin startproject config.
-- モデル用のbook API作成用のapiv1 --
python manage.py startapp book
python manage.py startapp apiv1
book/models.pyfrom django.db import models
import uuid
from django.utils import timezone
# Create your models here.
class Book(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.CharField(verbose_name='タイトル', max_length=50)
price = models.IntegerField(verbose_name='価格')
created_at = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
book/admin,pyfrom django.contrib import admin
# Register your models here.
from .models import Book
class BookModelAdmin(admin.ModelAdmin):
list_display = ('title', 'price', 'id', 'created_at')
ordering = ('-created_at',)
readonly_fields = ('id', 'created_at')
admin.site.register(Book, BookModelAdmin)
apiv1/serializers.pyfrom rest_framework import serializers
from book.models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'price']
apiv1/views.pyfrom rest_framework import viewsets
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from book.models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
apiv1/urls.pyfrom django.urls import path, include
from rest_framework import routers
from apiv1 import views
router = routers.DefaultRouter()
router.register('book', views.BookViewSet)
app_name = 'apiv1'
urlpatterns = [
path('', include(router.urls))
]
config/urls,pyfrom django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('apiv1/', include('apiv1.urls')),
]
관리 화면에서 적절하게 책을 추가했습니다.
2. Vue.js에서 DRF로 만든 api에 액세스
jsfiddle에 액세스하고 각 필드 (html, css, javascript)에 다음과 같이 기재.
HTML<div id="app">
{{ results }}
<hr>
{{ results.id }}
<hr>
{{ results.title }}
<hr>
{{ results.price }}
<hr>
</div>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
axios를 cdn에서 사용할 수 있도록하십시오.
CSS는 적절하게body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
}
Vuenew Vue({
el: '#app',
data: {
results: []
},
mounted() {
axios.get('http://127.0.0.1:8000/apiv1/book/d5da82ff-8f63-4718-9ddb-e989832170d1/')
.then(response => {this.results = response.data})
}
},
)
라이프 사이클 후크의 mounted에서 api를 사용합니다.
axios의 get 메소드에 DRF로 만든 기사의 엔드포인트를 지정. 응답의 데이터를 결과 목록에 저장합니다.
HTML의 Mustache 구문에서 {{ results }} 등을 사용하기 때문에 가져온 결과가 표시되어야합니다 ...
표시됩니다.
오류
콘솔fiddle.jshell.net/takuto/4vjsdpag/64/show/:1 Access to XMLHttpRequest at
'http://127.0.0.1:8000/apiv1/book/d5da82ff-8f63-4718-9ddb-e989832170d1/'
from origin 'https://fiddle.jshell.net' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Failed to load resource: net::ERR_FAILED
표시되지 않습니다. 콘솔을 보면 위와 같이 오류가.
origin ' htps : // 푹 dぇ. j ぇ l. 네 t ' has been blocked by CORS policyhttps://fiddle.jshell.net
가 CORS 정책에 의해 차단되었다고 합니다.
원인은?
동일한 오리진 정책입니다.
세부사항: htps : //로 ゔぇぺぺr. 모잖아. 오 rg / 그럼 / cs / ue b / sekuri ty / same-origin_poucy
보안 관점에서 서로 다른 오리진 간에 리소스를 교환하는 것을 방지합니다.
오리진은 スキーム、ポート、ホスト
의 세 가지 조합입니다.
이들이 일치하지 않으면 동일한 오리진이라고 할 수 없습니다.
오리진이란 : htps //w w. 아 t r t. 이. jp / ai t / archi c0s / 1311/26 / 네 ws007. HTML
달리 오리진에 대한 액세스를 허용하려면 CORS이라는 기능을 사용합니다. HTTP 헤더에 설정을 추가해야 합니다.
이번 에러가 일어나고 있는 이유는 DRF로 작성한 API의 오리진과 Jsfiddle의 오리진이 다르기 때문입니다.
mkfir simple_drf
cd simple_drf
python3 -m vena venv
source venv/bin/activate
pip install django
pip install djangorestframework
django-admin startproject config.
-- モデル用のbook API作成用のapiv1 --
python manage.py startapp book
python manage.py startapp apiv1
from django.db import models
import uuid
from django.utils import timezone
# Create your models here.
class Book(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.CharField(verbose_name='タイトル', max_length=50)
price = models.IntegerField(verbose_name='価格')
created_at = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
from django.contrib import admin
# Register your models here.
from .models import Book
class BookModelAdmin(admin.ModelAdmin):
list_display = ('title', 'price', 'id', 'created_at')
ordering = ('-created_at',)
readonly_fields = ('id', 'created_at')
admin.site.register(Book, BookModelAdmin)
from rest_framework import serializers
from book.models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'price']
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from book.models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
from django.urls import path, include
from rest_framework import routers
from apiv1 import views
router = routers.DefaultRouter()
router.register('book', views.BookViewSet)
app_name = 'apiv1'
urlpatterns = [
path('', include(router.urls))
]
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('apiv1/', include('apiv1.urls')),
]
jsfiddle에 액세스하고 각 필드 (html, css, javascript)에 다음과 같이 기재.
HTML
<div id="app">
{{ results }}
<hr>
{{ results.id }}
<hr>
{{ results.title }}
<hr>
{{ results.price }}
<hr>
</div>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
axios를 cdn에서 사용할 수 있도록하십시오.
CSS는 적절하게
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
}
Vue
new Vue({
el: '#app',
data: {
results: []
},
mounted() {
axios.get('http://127.0.0.1:8000/apiv1/book/d5da82ff-8f63-4718-9ddb-e989832170d1/')
.then(response => {this.results = response.data})
}
},
)
라이프 사이클 후크의 mounted에서 api를 사용합니다.
axios의 get 메소드에 DRF로 만든 기사의 엔드포인트를 지정. 응답의 데이터를 결과 목록에 저장합니다.
HTML의 Mustache 구문에서 {{ results }} 등을 사용하기 때문에 가져온 결과가 표시되어야합니다 ...
표시됩니다.
오류
콘솔
fiddle.jshell.net/takuto/4vjsdpag/64/show/:1 Access to XMLHttpRequest at
'http://127.0.0.1:8000/apiv1/book/d5da82ff-8f63-4718-9ddb-e989832170d1/'
from origin 'https://fiddle.jshell.net' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Failed to load resource: net::ERR_FAILED
표시되지 않습니다. 콘솔을 보면 위와 같이 오류가.
origin ' htps : // 푹 dぇ. j ぇ l. 네 t ' has been blocked by CORS policy
https://fiddle.jshell.net
가 CORS 정책에 의해 차단되었다고 합니다.원인은?
동일한 오리진 정책입니다.
세부사항: htps : //로 ゔぇぺぺr. 모잖아. 오 rg / 그럼 / cs / ue b / sekuri ty / same-origin_poucy
보안 관점에서 서로 다른 오리진 간에 리소스를 교환하는 것을 방지합니다.
오리진은
スキーム、ポート、ホスト
의 세 가지 조합입니다.이들이 일치하지 않으면 동일한 오리진이라고 할 수 없습니다.
오리진이란 : htps //w w. 아 t r t. 이. jp / ai t / archi c0s / 1311/26 / 네 ws007. HTML
달리 오리진에 대한 액세스를 허용하려면 CORS이라는 기능을 사용합니다. HTTP 헤더에 설정을 추가해야 합니다.
이번 에러가 일어나고 있는 이유는 DRF로 작성한 API의 오리진과 Jsfiddle의 오리진이 다르기 때문입니다.
해결하기 위해...
DRF에서
django-cors-headers
를 사용하여 CORS를 설정할 수 있습니다.DRF에 django-cors-headers 넣기
설치
$ pip install django-cors-headers
DRF의 settings.py에 추가
settings.py
INSTALLED_APPS = [
...
'corsheaders',
...
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
...
]
CORS_ORIGIN_ALLOW_ALL 또는 CORS_ORIGIN_WHITELIST 설정
settings.py
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = [
"https://fiddle.jshell.net",
]
CORS_ORIGIN_ALLOW_ALL은 다른 오리진을 모두 허용합니다.
CORS_ORIGIN_WHITELIST는, 허용하는 오리진 지정한다.
이제 다시 시도해 보세요.
했어.
睡眠が大事
라는 책에 대한 정보를 얻을 수 있습니다.
Reference
이 문제에 관하여(Jsfiddle의 Vue.js에서 DRF로 만든 api에 액세스하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/taku_hito/items/4dc905b3a07fe3aa2503텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)