๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ ์ด์ ์์ผ ์์ฑํ ์ ์์๋ค.
์๋ฒ ๊ธฐ๋ฅ์ด ํ๋ํ๋ ๊ตฌํ๋ ๋๋ง๋ค ์ ๋ง์ด์ง ์ธ์์ ๋ณด๋์ ๋๊ผ๊ณ ๊ฐ์ด ์์ ํ๋ ํ์๋ค๊ณผ ๋ฐฉ๊ธ๋ฐฉ๊ธ ์ฆ๊ฒ๊ฒ ์์ ์ ์์๋ค.
๊ทธ๋ฌ๋,
๋งํ์ ์น์ ๊ตฌํํ๋ ๋จ๊ณ์ ์ง์
ํ์ ๋๋ ์ด์ ์ ๊ตฌํํด ๋์๋ ๊ธฐ๋ฅ๋ค์ ํ์ ํจ์ด ๋๋ฌ๋๋ฉด์ ํ์๋ค์๊ฒ ๋๋ฌด ๋ฏธ์ํ๋ค.
์ด๋ค ๊ฒ๋ค์ด ๋ฌธ์ ์๊ณ ๊ทธ์ ๋ํด ์ด๋ค ๊ณต๋ถ๋ฅผ ํด์ผํ ์ง ์ ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค.
์ฐ๋ฆฌ์ ๋ฉ์ธ ์ฝํ
์ธ ๋ App์ด๊ธฐ์ App๊ณผ์ ์ฐ๊ณ์๋ง ์ ๊ฒฝ์ ์ผ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ง์ ๋ ๊ธฐ๋ฅ์ ํ๋ฆฌํฐ๋ณด๋ค๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ ๊ธฐ๋ฅ์ ๊ตฌํ์๋ง ์ด์ ์ ๋๊ณ ์์
ํ๋ค.
django์์ ์ ๊ณตํ๋ model๊ณผ class๋ฑ์ api๋ฅผ ์ฌ์ฉํ์ง ์์ ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์๊ฐ์ด ์ง๋ ์๋ก ์น๋ช ์ ์ธ ๋ฌธ์ ๊ฐ ๋์๋ค.
๊ตฌํ ์งํ์๋ ๋ธ ๋ฏ์ด ๊ธฐ๋ปํ์๋๋ฐ ์ด ์ฝ๋๊ฐ ๋ชจ๋ ๊ฑธ ๋ง์น๊ฒ ๋ ์ค์ ๋ชฐ๋๋ค.
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
@csrf_exempt
def user_list(request):
# ํ์๋ชฉ๋ก
if request.method == 'GET':
query_set = Account.objects.all()
serializer = AccountSerializer(query_set, many=True)
return JsonResponse(serializer.data, safe=False)
# ํ์๊ฐ์
elif request.method == 'POST':
data = JSONParser().parse(request)
# ์ด๋ฏธ ์กด์ฌํ๋ ID
if Account.objects.filter(pid=data['pid']).exists():
msg = dict(
msg="Already Exists"
)
return JsonResponse(msg, status=400)
# ์ง๋ ฌํ ๋ฐ ์ ์ฅ
serializer = AccountSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
๋ฐ์ดํฐ ์ ์ก ๋จ๊ณ์์ User ์๋ณ์ ์ด๋ ค์์ด ๋๋ฌ๋ฌ๋ค.
๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์
๊ธฐ๋ฅ์ ๊ตฌํํด๋๊ณ ์ดํ App์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ค์ผ ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋๋ถํฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
App์ฐจ์์์์ ํด๊ฒฐ
์ด ๋ถ๋ถ์ ๋คํ์ค๋ฝ๊ฒ๋ Unity์์ ์์ฒด์ ์ผ๋ก ์ง์ํ๋ playerprefs๋ผ๋ ๊ธฐ๋ฅ์ด ์์๊ธฐ์ ๋์ด๊ฐ ์ ์์๋ค.
Request๋ง๋ค User๊ฐ ๋๊ตฐ์ง๋ฅผ ์ฒจ๋ถํ์ฌ ์๋ฒ๋ก ์ ์กํ๊ณ , ๊ทธ ๋๋ถ์ ๋ฐ์ User ์ ๋ณด๋ฅผ ์ด์ฉํด ORM์ ํตํ ๋ฐ์ดํฐ ์ถ์ถ์ด ๊ฐ๋ฅํ๋ค.
playerprefs๊ฐ ์์๋ค๋ฉด ๋ชจ๋ ๊ฑธ ๊ฐ์ ์์ด์ผ ํ์ ๊ฒ์ด๋ค.
์๋ฌด๋ฆฌ App์ด ์ฃผ๋ ฅ์ด๋ผ ํด๋ Web์์ ์์ ์ ์ด๋๊ธฐ๋ก์ ํํฐ๋งํด์ ํ์ธํ๋ ๊ธฐ๋ฅ์ ์ค์ํ๋ค.
์ฌ๊ธฐ์ ๋๋ฌ๋ ์น๋ช ์ ์ธ ๋ฌธ์ ๋ Web์ด loginํ user๊ฐ ๋๊ตฐ์ง ์๋ณํ ์ ์๋ค๋ ๊ฒ์ด์๋ค.
์ฌ์ค ์ด๋ฏธ ์๊ณ ์์์ง๋ง JWT ๋๋ Session ๊ธฐ๋ฅ์ ๋ถ์ฌ์ ํด๊ฒฐ ํ ์ ์์ ์ค๋ก ์์๋ค.
ํ์ง๋ง ๋ง์์ด ๋๋ฌด ๊ธํ๋ค.
ํ๋ก ํธ๋ ํ๋ก ํธ๋๋ก ์ง๋๊ฐ ์ ๋๊ฐ์ง ์์๋ค. bootstrap์ด๋ tailwindcss๋ฅผ ์ด์ฉํ ๋์์ธ๋ ๋ด์ผ ํ๋ค.
๊ฒฐ๊ตญ์ ์ธ์ฆ ๊ธฐ๋ฅ ๊ตฌํ์์๋ ์์ ๋ผ๊ณ , ๊ธํ ๋๋ก html์ ๋ฆฌํดํ๋ฉด์ context์ id๋ฅผ ๋ถ์ฌ๋ณด๋ด์ ORM์ ํตํด ๊ด๋ จ ์ ๋ณด๋ฅผ ํต์งธ๋ก ์ฌ๋ ค๋ฒ๋ฆฌ๋ ๋ฌด์ํ ์ง์ ํด์ผ ํ๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="btn-group">
<a href="{% url 'exlogin' %}" class="btn btn-info"> Logout </a>
</div>
<!--๋ฌธ์ ์ ๊ทธ ๋ถ๋ถ-->
<h1> Welcome! {{pid}}. Check you RECORDS. </h1>
<br><br><br>
<h3> BICEPS CURL </h3>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col"> Total Count </th>
<th scope="col"> L-Count </th>
<th scope="col"> R-Count </th>
<th scope="col"> RunTime </th>
<th scope="col"> Date </th>
</tr>
</thead>
<tbody>
{% for record in biceps_queryset %}
<tr>
<td>{{forloop.counter}}</td>
<td><a href="#">{{record.count}}</a></td>
<td><a href="#">{{record.count1}}</a></td>
<td><a href="#">{{record.count2}}</a></td>
<td><a href="#">{{record.times}}</a></td>
<td><a href="#">{{record.day}}</a></td>
</tr>
{% endfor %}
</tbody>
</table>
<br><br><br><br><br>
<h3> SQUAT </h3>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col"> Total Count </th>
<th scope="col"> RunTime </th>
<th scope="col"> Date </th>
</tr>
</thead>
<tbody>
{% for record in squat_queryset %}
<tr>
<td>{{forloop.counter}}</td>
<td><a href="#">{{record.count}}</a></td>
<td><a href="#">{{record.times}}</a></td>
<td><a href="#">{{record.day}}</a></td>
</tr>
{% endfor %}
</tbody>
</table>
<br><br><br><br><br>
<h3> Push Up </h3>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col"> Total Count </th>
<th scope="col"> RunTime </th>
<th scope="col"> Date </th>
</tr>
</thead>
<tbody>
{% for record in pushup_queryset %}
<tr>
<td>{{forloop.counter}}</td>
<td><a href="#">{{record.count}}</a></td>
<td><a href="#">{{record.times}}</a></td>
<td><a href="#">{{record.day}}</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
html์๋ ์ ํ ์ต์ํ์ง ์๊ธฐ์ <br><br><br><br><br>
์ ๋๋ ค ๋ฐ์ ๋ถ๋ถ๋ ๋ณด์ธ๋ค.
์์ html์ ๋ค์์ ์ฝ๋๋ก ํธ์ถ๋๋ค.
@csrf_exempt
def exlogin(request):
if request.method == "POST":
form = LoginForm(request.POST)
if form.is_valid():
data = form.cleaned_data
pid_get = data['pid']
pwd_get = data['pwd']
try:
target = Account.objects.get(pid=pid_get)
except Account.DoesNotExist:
return render(request, 'Web/error.html', {'err': 0})
posted_inform = Account.objects.values("pid", "pwd").get(pid=pid_get)
posted_account = posted_inform['pid']
posted_password = posted_inform['pwd']
if pid_get == posted_account and pwd_get == posted_password:
biceps_queryset = BicepsCurl.objects.filter(pid=pid_get)
squat_queryset = Squat.objects.filter(pid=pid_get)
pushup_queryset = PushUp.objects.filter(pid=pid_get)
context = {
'pid': pid_get,
'biceps_queryset': biceps_queryset,
'squat_queryset': squat_queryset,
'pushup_queryset': pushup_queryset,
}
return render(request, 'Web/main.html', context)
if pwd_get != posted_password:
return render(request, 'Web/error.html', {'err': 1})
else:
form = LoginForm()
ctx = {
'form': form,
}
return render(request, 'Web/exlogin.html', ctx)
login form์ผ๋ก ์ ๋ ฅ๋ฐ์ id๋ฅผ ๊ทธ๋๋ก ์จ์ ์ค์ง '์ด๋๋ง' ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ์ฝ๋๋ค. ๋๋ฆ error ํ์ด์ง๋ ๋ง๋ค์ด์ ๊ทธ๋ด์ธํ๊ฒ ๋ณด์ด๊ฒ ํ์ง๋ง ์ด๊ฑด ์ง์ง ์ฝ๋๋ฅผ ์ง ๋ด๊ฐ ๋ด๋ ์ฌ๊ธฐ์ ๋ค๋ฆ์ด ์๋ค.
์ฌ์ง์ด ID ๋ถ์ผ์น ์ฝ๋ ๋ถ๋ถ์ ์๋ํ์ง๋ ์๋ ๋ค๋ ๊ฒ์ด ํ๊ณ์ ํจ์ .
๊ทธ๋๋ง PW ๋ถ์ผ์น ์ฝ๋๊ฐ ๊ธฐ์ ์ ์ผ๋ก ๋์๊ฐ๋ฉด์ ์ด ํ๋๋ก ๋จน๊ณ ์ฌ๋ ์ง๊ฒฝ์ ์ด๋ฅด๋ ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ธฐ๋ฅ ์ฝ๋์ ๋ถ์ด์๋ @csrf_exempt
๋ฅผ ๋ณด๋ฉด ์ ๋ง์ด์ง ๋ง์์ด ์ํ๋ค.
have to learn:
๊ทธ๋ ๋ค๋ฉด ๋ฌด์์ ๊ณต๋ถํด์ผํ ๊น?
์ผ๋จ ๋์ฝ๋ผ์ค ์ ์๋์ cookie - token - session - JWT์ ๊ดํ ์ค๋ช ์์์ ๋ดค๋ค.์ด๊ฒ๋ค์ด ์ด๋ค ์ํฉ์ ์ฐ์ด๋์ง๋ฅผ ์ด์ ๋ ์๋ค.
๋ฌธ์ ๋ ์ ํํ ๊ตฌํ์ด ๋๊ฒ ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ๊ดํ ๊ฒ์ ๊ตฌ๊ธ๋์ด ํด๊ฒฐํด์ฃผ์ค ๊ฒ์ด๋ค.
์ด๋ฏธ ๋ง์ ๋ ํผ๋ฐ์ค๊ฐ ์๋ค๋ ์ฌ์ค์ ์๋ค.
์ ํํ๊ฒ ๋ฐ๋ผํ๋ฉด์ ํด๋ก ์ฝ๋ฉ์ ์๋ํ ๊ฒ์ด๋ค.
๋ฐ์๋ณด๋ฉด์ ๋ฐฐ์ฐ๋ ๊ฒ ๊ฐ์ฅ ์ ํํ๋ค๊ณ ๋๋ผ๋ ์ค์ด๋ค.
์๋ง์ ์๋๊ฐ ์์์ง๋ง ๊ฒฐ๊ตญ์ ๋ถ์ ๋ ์ฑ๋ก ์ ๋ค์ด๋ฒ๋ฆฐ ํ์ ๋ค์ ๋ณด๊ณ ์์ํ๋ ๊ฐ์ด์ด ์ธ์์ด ๋๋ค.
@csrf_exempt
์ด๋๋ถํฐ ์ด๋ป๊ฒ๋ ํด์ผ ํ๋ค.
๋ณด์ ๊ธฐ๋ฅ์ ์ํํ๋ ๋์ธ๋ฐ ์ด๊ฑธ ๊บผ๋ฒ๋ฆฌ๋ ์๋ฌดํผ ์๋ชป๋๋ค.
์ ๊ฑธ ๋ถ์ด์ง ์์ผ๋ฉด forbidden(403)
์ ๋ณด๊ฑฐ๋ missing CSRF ์ด์ฉ๊ตฌ...
๋ฅผ ์ฃผ๋ก ์์ ํ๊ฒ ๋๋ค.
์ด๊ธฐ์๋ App์์ DB์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์์ฒญ์ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ์ง์์ ์ผ๋ก ์ฐ๊ธฐ ์์ํ๋ค.
์ค๊ฐ์ ์์๋ณผ ๊ธฐํ๊ฐ ๋ถ๋ช ํ ์์์ ๊ฒ์ธ๋ฐ ๊ทธ๋ฅ ์ข๋ค๊ณ ๋ณต๋ถํ๋ฉด์ ๊ธฐ๋ฅ ํ์ฅ์๋ง ์ ๊ฒฝ ์ด ๊ฒฐ๊ณผ๊ฐ ๋งค์ฐ ์ฒ์ฐธํด์ก๋ค.
๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์
๊ธฐ๋ฅ์ ๊ตฌํํ๋ ค๋ ์๋ ์ค์ django REST framework
๋ฅผ ์ฐ๊ฒ ๋์๋ค.
์ด ๋จ๊ณ์์ ๋ณธ์ง์ ๊ณต๋ถํ์ง ์๊ณ ์ ํ๋ธ๋ฅผ ๋ฐ๋ผํ๋ฉด์ ํด๋ก๋๋ง ํ๋ค ๋ณด๋ ์ด๋ ๊ฒ ๋ ๊ฒ์ด๋ผ ๋๋๋ค.
REST framework ๊ณต์๋ฌธ์๋ฅผ ์ ํํ ๋ฐ๋ผํด๋ณด๋ฉด์ ์ด๊ฒ์ด ์ ๊ณตํ๊ณ ์ ํ๋ ํต์ฌ์ด ๊ธฐ๋ฅ์ด ๋ฌด์์ธ์ง ์์๊ฐ ๊ฒ์ด๋ค.
ํจ์ํ view๋ณด๋ค๋ ํด๋์คํ view ์ฆ, django์์ ์ ๊ณตํ๋ ์ ์ฉํ API ์์ฃผ๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด์ django์ ์ฅ์ ์ ์ต๋ํ ์ด๋ฆด ๊ฒ์ด๋ค.
์ฌ์ ํ ์ด๋ ๊ฒ ์๊ฐํ๋ค.
์ ํํ๊ณ ์์ฐฌ ๋ฏธ์์ฑ
๋ณด๋ค๋ ์๋ฌดํผ ๋์๊ฐ๋ ์์ฑ๋ ๋ฌด์ธ๊ฐ
๊ฐ ๋ ํ์คํ๋ค.
๊ทธ๋ฐ๋ฐ ์ด ์๋ฌดํผ ๋์๊ฐ๋ ์์ฑ๋ ๋ฌด์ธ๊ฐ
๋ ์ ๋นํ ๊ฐ์ถ ๊ฑด ๊ฐ์ถฐ์ผ ํ๋ค๋ ๊ฑธ ๋ผ์ ๋ฆฌ๊ฒ ๋๋ผ๊ณ ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ง์ ๋ง ์์ด์ผํ ๊ฒ์ ๋จผ์ ์ฑ๊ฒจ์ผ๊ฒ ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ํ ๋๋ก ์์ฑํ๋ค.
์์ฑ ํ์ ๋ฐ์ฑํ๋ค.
์ข
ํฉํ์๋ฉด,
์์ฑํ๋ฉด์ ๋ฐ์ฑํ๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.