일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- G-Suite
- 탐욕 알고리즘
- 리스트
- 추천 영상
- List
- venv
- MongoDB
- gpu 병렬처리
- pymongo
- 바로학교
- 깃허브
- 유튜브
- 파이썬
- DB
- flask
- 구글 드라이브
- Django
- 충북
- 알고리즘
- python
- nocookie
- 코딩
- selenium
- Google Drive
- docker-compose
- 링크
- 그리디 알고리즘
- 아이폰
- 장고
- 단축어
Archives
- Today
- Total
SSAMKO의 개발 이야기
[django] 데코레이터로 API에 토큰(token) 적용하기 본문
반응형
외부에 API를 제공할때, 해당 URI로 아무나 접근하는 것을 막기 위해 간단하게 적용할 수 있는 방법으로 크게 두 가지가 있다.
첫번째로는 django settings.py에서 ALLOWED_HOST를 수정하여, white list를 구성하는 방법이 있는데,
이 방법은 소수의 제한적 접근을 허용할때는 유용하지만, 요청할 대상이 많아지면 힘들어진다.
이때는 간단히 토큰을 제공하는 방법으로 해결할 수 있다.
이 토큰을 여러 method에 손쉽게 적용할 수 있도록 데코레이터를 사용했다.
# decorator.py
from functools import wraps
from django.core.exceptions import PermissionDenied
def check_token(func):
"""Decorator for checking whether this request is valid or not"""
token = 'ssamko**code!'
@wraps(func)
def new_view_func(request, *args, **kwargs):
"""check ID, Password or token here"""
if request.headers.get('Token') and request.headers['Token'] == token:
response = func(request, *args, **kwargs)
return response
else:
raise PermissionDenied
return func(request, *args, **kwargs)
return new_view_func
request.headers.get('Token')을 먼저 써주지 않으면,
요청에 token값이 아예 없을 경우 error가 발생한다. 따라서, 먼저 token의 유무를 판단하고, 정합성을 판단하도록 작성했다.
PermissionDenied는 django에서 제공하는 exception중 하나로 403 forbidden 응답을 반환한다.
아래와 같이 view.py에 적용할 수 있다.
from django.http import HttpResponse
from django.views.decorators.http import require_http_methods
from .decorator import check_token
@require_http_methods(["GET"])
@check_token
def recommend_(request):
name = request.GET.get('name', default='EBS')
return HttpResponse(name)
@require_http_methods() 데코레이터로 필요한 method로만 접근하도록 제한한다. 어길 경우 405 Method Not Allowed 에러를 응답한다.
method를 먼저 체크하고, 그 다음 @check_token을 통해 토큰을 체크한다.
반응형
'Django' 카테고리의 다른 글
[Django] rest_framework APIClient 'json' 사용시 request 처리 (0) | 2021.07.01 |
---|---|
[django] api 속도(응답시간) 테스트 코드 (0) | 2021.01.24 |
[django] DB연동없이 파일 업로드 받아 처리하는 API (2) | 2021.01.18 |
[Django] Test 코드 작성시 header 추가하기 (1) | 2021.01.15 |
[Django] TestCase 이용해서 테스트 코드 짜기 (0) | 2021.01.14 |
Comments