Vue-Django Read API
axios list Django coding
django에서 /api/post/list/ 처리하는 로직 만든다.
1
blog에 만들어도 되지만 api 따로 만들어 모으자.
python manage.py startapp api
만들어진 앱에서 __init__.py, apps.py, views.py 제외하고 필요없는건 지웠다. (테이블은 다른 앱에서 만들고 api에서는 다른 앱에 있는 테이블을 임포트해서 사용하는 방식으로 할거니까)
* 역시 settings.py -> models.py -> urls.py -> views.py -> (templates) 순으로 코딩한다.
client에 json 응답을 줄것이기 때문에 templates 처리는 불필요하다. 테이블도 안만들거니까 models 코딩도 없다.
2
settings/base.py
INSTALLED_APPS 에 'api.apps.ApiConfig' 추가
3
api/urls.py 만들기
from django.urls import path
from api import views
app_name='api'
urlpatterns = [
path('/post/list/', views.ApiPostLV.as_view(), name='post_list'),
#/api/ 는 앞에서 정의할거니까 빼자
]
settings/urls.py
from django.contrib import admin
from django.urls import path
from . import views
from django.conf.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.HomeView.as_view(), name='home'), # 홈 패스
path('blog/', include('blog.urls')), # 블로그 패스
#from django.conf.urls import include 주의
path('api/', include('api.urls')),
]
4
api/views.py
from django.views.generic.list import BaseListView
from blog.models import Post
class ApiPostLV(BaseListView):
model = Post
클래스형 뷰와 관련해서는 꼭 알아야하는 사이트가 있다. (ccbv.co.uk)
get 메서드에서 마지막에 render_to_response() 메서드를 호출한다. ccbv에서 코드 붙여넣자.
from django.views.generic.list import BaseListView
from blog.models import Post
class ApiPostLV(BaseListView):
model = Post
def render_to_response(self, context, **response_kwargs):
"""
Return a response, using the `response_class` for this view, with a
template rendered with the given context.
Pass response_kwargs to the constructor of the response class.
"""
response_kwargs.setdefault('content_type', self.content_type)
return self.response_class(
request=self.request,
template=self.get_template_names(),
context=context,
using=self.template_engine,
**response_kwargs
)
return 되는걸 보면 html로 reponse를 보낸다. 이걸 json format으로 response를 보내도록 바꾸자
from django.http import JsonResponse
from django.views.generic.list import BaseListView
from blog.models import Post
class ApiPostLV(BaseListView):
model = Post
def render_to_response(self, context, **response_kwargs):
qs= context['object_list']
postList= [obj_to_post(obj) for obj in qs]
return JsonResponse(data=postList,safe=False,status=200)
* JasonResponse 쓸때는 세개의 인자를 기억. data는 client에 보내줄 데이터를 대입해주고
safe에는 우리가 보내려는 데이터 즉, postList가 딕셔너리 형태면 true 아니면 false. List 보내니까 False 주자.
status 인자에는 응답코드를 넣어주면 된다.
context 변수에는 post table에서 가져온 모든 레코드가 들어있다.
위에서 가져온 레코드들 즉 query set을 json 형식으로 바꿔줘야하는데
postList= [{...},{...}], in DRF serialization 이 부분이, 만약 장고 레스트 프레임웤을 사용하고 있다면 직렬화(serialization) 에 해당하는 부분이다.
쿼리셋에 있는 각 오브젝트들을 obj_to_post() 함수로 넘겨서 직렬화하자. (postList= [obj_to_post(obj) for obj in qs])
'웹 프로그래밍' 카테고리의 다른 글
[pinterest clone (1)] 기술스택 (0) | 2021.04.25 |
---|---|
[Django Tutorial] Blog 만들기 (18) (0) | 2021.04.24 |
[Django Tutorial] Blog 만들기 (16) (0) | 2021.04.24 |
[Django Tutorial] Blog 만들기 (15) (0) | 2021.04.23 |
[Django Tutorial] Blog 만들기 (13) (0) | 2021.04.22 |