A. @csrf_exempt 를 사용하면 된다.
참고: csrf란? 사이트 간 요청 위조
API를 만들 경우 CSRF 보안이 필요하지 않다. API 서버는 API Key 등 다른 인증 방식을 사용한다.
그래서 csrf를 끌 필요가 있다.
출처: Cross Site Request Forgery protection
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
return HttpResponse('Hello world')
코드 예는 다음과 같다.
from django.http import JsonResponse
from django.views import View
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
class API(View):
def get(self, request):
json = {'code': 'get'}
return JsonResponse(json)
def post(self, request):
json = {'code': 'post'}
return JsonResponse(json)
def put(self, request):
json = {'code': 'put'}
return JsonResponse(json)
def delete(self, request):
json = {'code': 'delete'}
return JsonResponse(json)
urls.py에 아래처럼 추가하면 작동한다.
urlpatterns = [
path('api/test', api.API.as_view(), name='api'),
...
]
또는 이렇게 할 수도 있다.
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def api(request):
if request.method == "GET":
json = {'code': 'get'}
return JsonResponse(json)
if request.method == "POST":
json = {'code': 'post'}
return JsonResponse(json)
if request.method == "PUT":
json = {'code': 'put'}
return JsonResponse(json)
if request.method == "DELETE":
json = {'code': 'delete'}
return JsonResponse(json)
위 경우 api 함수를 선언했으므로 아래처럼 해줘야 한다.
urlpatterns = [
path('api/test', api.api, name='api'),
...
]
@csrf_exempt를 추가하지 않을 경우에는 csrf token이 필요하다는 에러가 뜨면서 post, put, delete가 작동하지 않는다.