미니 채용 관리 시스템 : 특정 채용 공고에 지원자가 지원하는 API 구현
https://teamsparta.notion.site/0708-15927058599e45d5a40741d0599ae809
ACCESS_TOKEN_LIFETIME은 50분, REFRESH_TOKEN_LIFETIME은 1일로 설정
# user/urls.py
...
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
# user/
urlpatterns = [
...
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
# settings.py
...
SIMPLE_JWT = {
# Access 토큰 유효 시간 설정하기
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=50),
# Refresh 토큰 유효 시간 설정하기
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': False,
'UPDATE_LAST_LOGIN': False,
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'VERIFYING_KEY': None,
'AUDIENCE': None,
'ISSUER': None,
'JWK_URL': None,
'LEEWAY': 0,
'AUTH_HEADER_TYPES': ('Bearer',),
'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',
'JTI_CLAIM': 'jti',
'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}
# post/models.py
...
class JobApplication(models.Model):
candidate = models.ForeignKey(User, verbose_name="지원자", on_delete=models.CASCADE)
jobpost = models.ForeignKey(JobPost, verbose_name="채용 공고",on_delete=models.CASCADE)
created_at = models.DateTimeField("지원일", auto_now_add=True)
class Meta:
db_table = 'job_applications'
# post/serializers.py
...
class JobApplicationSerializer(serializers.ModelSerializer):
jobpost = JobPostSerializer(read_only=True)
class Meta:
model = JobApplication
fields = ('id', 'candidate', 'jobpost', 'created_at')
- 지원하는 유저정보는 별도로 받지 않고 발급받은 access token 으로 인증할 것
- request 예시(Bearer Token)
# post/urls.py
...
from .views import ApplicationView
urlpatterns = [
...
path('apply', ApplicationView.as_view()),
]
# post/views.py
# 채용 지원 기능
class ApplicationView(APIView):
# 채원 지원
def post(self, request):
print(request.data)
job_post_id = request.data.get('job_post', "")
user = request.user
job_post = JobPost.objects.filter(id=job_post_id)
if 0 < len(job_post):
job_post = job_post.first()
else:
return Response({"error": "job_post가 존재하지 않습니다."}, status=status.HTTP_400_BAD_REQUEST)
data = {
'candidate': user.id
}
job_application_serializer = JobApplicationSerializer(data=data)
if job_application_serializer.is_valid():
job_application_serializer.save(jobpost=job_post)
return Response({'message': '저장 완료!'}, status=status.HTTP_200_OK)
return Response(job_application_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# permissions.py
from rest_framework.permissions import BasePermission
class IsCandidateUser(BasePermission):
"""
UserType이 candidate인 유저만 가능
"""
message = '지원자만 사용하실 수 있습니다.'
def has_permission(self, request, view):
try :
user_type = request.user.user_type.user_type
except:
user_type = None
return bool(request.user and user_type == "candidate" )
# return False
# post/views.py
# 채용 지원 기능
class ApplicationView(APIView):
permission_classes = [IsCandidateUser]
authentication_classes = [JWTAuthentication]
# 채원 지원
def post(self, request):
...