decorator
์ถ๊ฐ + ์ ๋ํ
์คํธ ์ํด ์์๋ก ์ ์ ์ ๋ณด๋ kakao_id
๋ก ๋ฐ์๊ฑธ request.usr
๋ก ์ฝ๋์์ + ์ ์ ํํฐ ์กฐ๊ฑด ๋ณ๊ฒฝ(if)
class ReviewView(View):
# 8000/products/1/review
@login_required
def post(self, request):
try:
data = json.loads(request.body)
user = request.user # --> decorator์์ ๋ฐ์์ฌ ์ ์ ์ ๋ณด
# kakao_id = data['kakao_id'] # --> ์์ user์ ๋์ unit test์ฉ ์์๋ก ๋ถ๋ฌ์จ user ์ ๋ณด
product_id = data['product_id']
content = data['content']
image = data.get('image_url', None)
# if not User.objects.filter(id=kakao_id).exists():
if not User.objects.filter(id=user.id).exists():
return JsonResponse({'message':'UNAUTHORIZED_USER'}, status=401)
if not Product.objects.get(id=product_id):
return JsonResponse({'message':'NO_PRODUCT'}, status=400)
Review.objects.create(
# user_id = kakao_id,
user_id = user.id,
product_id = product_id,
content = content,
image_url = image
)
return JsonResponse({'message':'SUCCESS'}, status=200)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except Product.DoesNotExist:
return JsonResponse({'message':'NO_PRODUCT'}, status=400)
:: path parmeter
๋ก product_id
๋ฅผ ๋ฐ๊ณ
data['product_id']
--> product_id = product_id
์์ ๊ฐ๋ฅ
class ReviewView(View):
# 8000/products/1/review
@login_required
def post(self, request, product_id):
try:
data = json.loads(request.body)
# user = request.user # --> decorator์์ ๋ฐ์์ฌ ์ ์ ์ ๋ณด
# kakao_id = data['kakao_id'] # --> ์์ user์ ๋์ unit test์ฉ ์์๋ก ๋ถ๋ฌ์จ user ์ ๋ณด
product_id = product_id
content = data['content']
image = data.get('image_url', None)
# if not User.objects.filter(id=kakao_id).exists():
if not User.objects.filter(id=request.user.id).exists():
return JsonResponse({'message':'UNAUTHORIZED_USER'}, status=401)
if not Product.objects.get(id=product_id):
return JsonResponse({'message':'NO_PRODUCT'}, status=400)
Review.objects.create(
# user_id = kakao_id,
user_id = request.user.id,
product_id = product_id,
content = content,
image_url = image
)
return JsonResponse({'message':'SUCCESS'}, status=200)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except Product.DoesNotExist:
return JsonResponse({'message':'NO_PRODUCT'}, status=400)
5์ผ์ฐจ์ ์์ฑํ ์ฝ๋์ ๋น๊ตํ๋ฉด,
get ๋ฉ์๋๋ฅผ ํตํด์๋ง ํค๋์ product_id๋ฅผ ๋ฐ์์ฌ ์ ์์๊ฑฐ๋ผ๊ณ ๋ฏฟ์๋ค.
์ค๋ ์ค์ ์์
์ด ๋๋๊ฐ๋ ๊ณผ์ ์ค์,
ํ์๋ค์ ๋ก๊ทธ์ธ๊ณผ ๋ก๊ทธ์ธ๋ฐ์ฝ๋ ์ดํฐ ๋ฑ์ด ๋จธ์ง๋์
main์ ์ต์ ํ๋ฅผ ์ํจํ
login decorator๋ฅผ ReviewView
์ post ๋ฉ์๋
์ ๋ค์ ์ ์ฉํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์์ ํ๊ธฐ๋ก ํ๋ค.
๊ทผ๋ฐ, ๋ฌธ์ ๊ฐ ์๊ธด๊ฒ์ด๋ค!!
1์ฐจ ํ๋ก์ ํธ์ ๋ค๋ฅด๊ฒ 2์ฐจ ํ๋ก์ ํธ๋๋ ์์
๋ก๊ทธ์ธ API
๋ฅผ ์ ์ฉํ๊ฒ ๋์๋ค.
์์ง ์์
๋ก๊ทธ์ธ์ ํ๋ฐฑ ํต์ ์ด ์๋ฃ๋์ง ์์,
tokon์ ๋ด๊ฐ ๋ฐ์์ฌ์ ์๋ ์ํฉ์ ์ฒํ๊ฒ์ด๋ค.
token์ ์ด๋ป๊ฒ ํ๋ฉด ์
๋ ฅ์ ํ ์ ์์์ง ๊ณ ๋ฏผํ๋ค๊ฐ
postman์ ์ด์ฉํ ๋ header
์ ์์๋ก ์๋ฌด ํ ํฐ์ ์์ฑํ๋๋ ์ญ์๋...login decorator API
์์ ์ค์ ํ invalide token
message๊ฐ ๋ฐ์ํ์๋ค.
๊ฒฐ๊ตญ,
์ด๋ป๊ฒ token์ ์์ฑํ ์ ์๋์ง ๊ณ ๋ฏผํ๋ค๊ฐ ๋ฉํ ๋๊ป ๋์์ ์์ฒญํ์๋ค.
๋ด๊ฐ ์์
๋ก๊ทธ์ธ์ผ๋ก ์ง์ token์ ๋ฐ์์์์ง๋ง
shell์์ DB์ ์์๋ก ์ ์ฅ๋์ด ์๋ ์ ์ ์ id๊ฐ
์ผ๋ก token์ ์ง์ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ์๊ฒ๋์๋ค.
๋ฐ๋ก,
์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด bcrypt
๋ฅผ ์ด์ฉํ์ฌ ์ง์ token์ ๋ง๋ค๋ฉด ๋๋๊ฒ์ด๋ค!!
login view์์,
๋ด๊ฐ token์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ์ ๋ณด๋ ์๋(๐)์ ๊ฐ๋ค.
hines_token = jwt.encode({'id' : user.id}, SECRET_KEY, ALGORITHM)
๊ทธ๋ผ,
์ง์ shell์ ์
๋ ฅํ์ฌ ํ ํฐ์ ๋ฐํํด๋ณด์!
๊ทธ๋ฆฌ๊ณ ,
๋ฐํํ token์ postman์ ํค๋์ ๋ด์์
ReviewView์ ์์ฑํ ์ฝ๋๋ฅผ
postman์ผ๋ก ํ์ํ ํค๊ฐ๊ณผ ๋ฒจ๋ฅ๊ฐ์ ์
๋ ฅํ๊ณ
success ๋ฉ์ธ์ง๊ฐ ๋จ๋์ง ํ์ธํด๋ณด๊ธฐ!
<์ต์ข
๋ฆฌ๋ทฐ ๋ฐ๊ธฐ ์ ์์ ํ ์ฝ๋ ๐>
[ ์ถ๊ฐ ]
์ด์ ์ ์์ฑํ
๋ฐฉ๋ฒ1)
๋ด๊ฐ ์์ฑํ ๋ฐฉ๋ฒ#products views.py def post (self, requset) try: data = json.loads(requset.body) product_id = data['product_id'] content = data['content'] image = data.get('image_url', '') #products urls.py from django.urls import path, include from .views import ProductListView, ProductDetailView, CategoriesView, ReviewVie urlpatterns=[ path('/<int:product_id>', ProductDetailView.as_view()), ]
๋ฐฉ๋ฒ1)
์ veiws.py๋ฅผ ์์ฑ ํ ๋น์์, product_id๋ฅผ pathparameter๋ก ๋ฐ์์ฌ ์์ ์ด์๊ณ , product_id๋ฅผ ๋ค์ body์ ๋ด์์ ธ ์ค๋ ๋ฐฉ์์ผ๋ก ์์ฑํ์๋ค.
๋ฐฉ๋ฒ1)
์ฒ๋ผ body์ product_id๋ฅผ ๋ฐ์๋ ๋๊ณ ,
์๋์ ๋ฐฉ๋ฒ2)
์ ๊ฐ์ด ์ด์ฐจํผ pathparmeter๋ก ๋ฐ์์ค๊ฒ ๋๋ฉด,
product_id๋ฅผ ๋ฐ๋ก Review๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํ๋ค๊ณ ํ์
จ๋ค.
๋ฐฉ๋ฒ2)
๋ฉํ ๋์ ์๋ ค์ฃผ์ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒdef post (self, requset, product_id) try: data = json.loads(requset.body) product_id = product_id content = data['content'] image = data.get('image_url', '')
์ฆ, ์์ฑ ํ ์ ์๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง๋ฅผ ๋ค ์๋ฉด ์ข๊ณ ,
์ ์ ํ๊ฒ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์๊ณ ์ฌ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค!