django

django rest API

Posted by 동식이 블로그 on April 19, 2019

190419

REST API

  • postman 설치
  • tmdb api 사용
    • 회원가입 후 api 권한 획득하기
test
  • get-top-rated 요청 보내보기
    • movie/top_rated
1
2
## 서버주소
https://api.themoviedb.org/3/movie/top_rated
  • 위 주소를 postman으로 요청보내기

  • required인 api_key를 같이 보내줘야 함

    • postman에서 추가
    • JAON형식으로 응답이 옴
1
https://api.themoviedb.org/3/movie/top_rated?api_key=mykey
  • url주소 뒤에 붙는건 postman에 입력한 api_key정보가 들어가서 요청

  • language 추가 : ko-kr

1
https://api.themoviedb.org/3/movie/top_rated?api_key=mykey&language=ko-kr
  • details 요청 보내보기
    • movie/
1
https://api.themoviedb.org/3/movie/278?api_key=mykey&language=ko-kr
  • AUTHENTICATION : 인증, 내가 가지고 있는 계정이 이 서비스에 접근이 가능 하게, OAuth
  • Create request token

    • postman을 통해 api_key를 넣어서 토큰을 발급 받는다

    • 1
      
      https://api.themoviedb.org/3/authentication/token/new?api_key=mykey
      
    • 결과값은 success / expires_at / request_token
  • Ask the user for permission

    • 1
      
      https://www.themoviedb.org/authenticate/{REQUEST_TOKEN}
      
    • 결과 : 3rd Party Authentication Request
  • Create a session ID (POST방식)

    • 얘는 required가 두개

    • Request Body는 JSON방식으로 token을 넣어줘야 함

      • postsman에서 raw를 누르고 보내주면 됨

      • 1
        2
        3
        
        {
        	"request_token":"토큰값"
        }
        
    • 1
      
      https://api.themoviedb.org/3/authentication/session/new?api_key=mykey
      
    • 결과 : success / session_id
  • Rate Movie
    • api_key,session idQuery Parmas에 추가
    • value(평점)을 JASON으로 추가

api 서버 만들기

1
2
3
django-admin startproject rest
django-admin startapp movies
pip install django_rest_framework # 설치 후 installed_app에 추가(rest_framework)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# models.py
from django.db import models

class Genre(models.Model):
    name = models.CharField(max_length=20)
        
class Movie(models.Model):
    title = models.CharField(max_length=30)
    audience = models.IntegerField()
    poster_url = models.TextField()
    description = models.TextField()
    genre = models.ForeignKey(Genre, related_name='movies', on_delete=models.CASCADE)
    
class Score(models.Model):
    content = models.CharField(max_length=140)
    score = models.IntegerField()
    movie = models.ForeignKey(Movie, related_name='scores', on_delete=models.CASCADE)
  • 폴더 추가 - 파일 다운로드 후
1
2
python manage.py loaddata genre.json
python manage.py loaddata movie.json
1
2
3
4
5
6
7
8
9
# rest-urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include('movies.urls')),
    # 이 주소는 api를 위한 주소라는걸 명시
]
1
2
3
4
5
6
7
8
9
# movies-urls.yp
## app_name설정을 안하는 이유는 api니까
### app_name은 html에서 편리하게 사용하기 위함이고, api는 html을 x니까
from django.urls import path
from . import views

urlpatterns=[
    path('movies/', views.movie_list),
    ]
1
2
3
4
5
6
7
8
9
10
# movies-serializers.py
## 얘는 JSON형식으로 받기 위한것
### modelform과 구조가 매우 비슷
from rest_framework import serializers
from .models import Movie

class MovieSerializer(serializers.ModelSerializer):
    class Meta:
        model = Movie
        fields = '__all__'
1
2
3
4
5
6
7
8
9
10
11
12
13
# movies-views.py
from django.shortcuts import render
from .models import Movie
from rest_framework.decorators import api_view
from .serializers import MovieSerializer
from rest_framework.response import Response

# get방식으로 받겠다 라는 의미
@api_view(['GET'])
def movie_list(request):
    movies = Movie.objects.all()
    serializer = MovieSerializer(movies, many=True) # 데이터를 여러개 보여줄 때 주는 옵션
    return Response(serializer.data)
  • 문서화 하기
1
pip install django-rest-swagger # installed에 rest_framework_swagger로 추가
1
2
3
4
5
6
# rest-urls
from rest_framework_swagger.views import get_swagger_view

schema = get_swagger_view(title="영화정보 API")

    path('', schema),
  • 루트주소로 가게되면 위에서 해준 문서로 가게 됨

API서버는 html을 return하는게 아니라 JSON을 리턴 !

#####