๋ณธ ํ๋ก์ ํธ๋ ํจ์บ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํฉ๋๋ค.
<์ด์ ๊ธ>
https://silvercoding.tistory.com/15
[DJANGO ๊ธฐ์ด] 5. Static ํ์ผ ๊ด๋ฆฌ, ๋ถํธ์คํธ๋ฉ CSS ํ ๋ง ์ ์ฉ
๋ณธ ํ๋ก์ ํธ๋ ํจ์บ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํฉ๋๋ค. <์ด์ ๊ธ> https://silvercoding.tistory.com/14 https://silvercoding.tistory.com/13 https://silvercoding.tistory.com/12 https://silvercoding.tistory.com/11 [D..
silvercoding.tistory.com
์ธ์
ํด๋ผ์ด์ธํธ <------------------> ์๋ฒ
ํด๋ผ์ด์ธํธ ์์ ์ฟ ํค๊ฐ ๋ค์ด์๋ค. ์ฌ๊ธฐ์ ์ฟ ํค๋ ์ ์ฅ์์ ๊ฐ๋ค. ์น ๋ธ๋ผ์ฐ์ ์์ ์ฟ ํค๋ผ๋ ์ ์ฅ๊ณต๊ฐ์ด ์๋๋ฐ ์ด ์ ์ฅ๊ณต๊ฐ์ ํ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ ๊ฒ์ด๋ค.
๋ธ๋ผ์ฐ์ ๋ฅผ ์ผ์ ์๋ฒ์ ์์ฒญ์ํ๊ณ , ์๋ต์ ๋ฐ๋๋ค. ์๋ฒ์์๋ ํค๋์ ์ฟ ํค ์ ๋ณด๋ฅผ ๋ฃ์ด์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ค. ํด๋ผ์ด์ธํธ๋ ๊ทธ ์ ๋ณด๋ฅผ ์ฟ ํค์ ์ ์ฅํ๋ค.
์๋ฒ ์์์๋ ์ฟ ํค๋ก ์ฌ์ฉํ ํค๋ฅผ ๋ง๋ ๋ค. ์ด๊ฑธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ ค์ค๋ค. ํด๋ผ์ด์ธํธ๋ ์๊ธฐ ์ฟ ํค ์ ์ฅ์์ ์ ์ฅํ๋ค. ์น์ฌ์ดํธ ๋ณ๋ก ๋๋์ด์ ์ ์ฅํ๊ฒ ๋๋ค.
์ด์ ๋ฆฌ ---> 1. (ํด๋ผ์ด์ธํธ) ์ฌ์ดํธ์ ๋ค์ด๊ฐ๋ฉด ์๋ฒ์ ์์ฒญ
2. (์๋ฒ) ์๋ฒ ์์์๋ ์๋ก์ด ํค๋ฅผ ์์ฑํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฃ์ ํ, ๊ทธ ํค๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ค.
3. (ํด๋ผ์ด์ธํธ) ํด๋ผ์ด์ธํธ๋ ๊ฐ๊ฐ์ ์น์ฌ์ดํธ์ ํด๋นํ๋ ํค๋ฅผ ์ฟ ํค์ ์ ์ฅํ๋ค.
4. (ํด๋ผ์ด์ธํธ) ๋ค์๋ถํฐ ์น์ฌ์ดํธ์ ๋ค์ด๊ฐ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ํ๋ ๋ชจ๋ ์์ฒญ์ ์ด ์ฟ ํค๋ฅผ ๊ฐ์ด ๋ณด๋ธ๋ค.
5. (์๋ฒ) ๊ทธ๋ผ ์๋ฒ๋ ๊ทธ ์ฟ ํค์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊บผ๋ด์์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ด๋ ต๊ณ ๋ณต์กํด๋ณด์ธ๋ค. ํ์ง๋ง ์ฅ๊ณ ์์ ์ค์ ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๊ต์ฅํ ์ฌ์๋ณด์ธ๋ค.
๋ก๊ทธ์ธ ํ์ด์ง ๊ตฌํ
1. Template ์์ฑ
templates ---> login.html ํ์ผ ์์ฑ
ํ์๊ฐ์ ํ์ด์ง์ ๋น์ทํ ๊ตฌ์ฑ์ด๋ฏ๋ก register.html ์ ๋ณต๋ถํด์์ ์์ ์ ์กฐ๊ธ ํด์ค๋ค.
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/bootstrap.min.css" />
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js" integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT" crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
<div class="row-mt5">
<div class="col-12 text-center">
<h1>๋ก๊ทธ์ธ</h1>
</div>
</div>
<div class="row mt-5">
<div class="col-12">
{{error}}
</div>
</div>
<div class="row mt-5">
<form method="POST" action=".">
{% csrf_token %}
<div class="form-group mb-3">
<label for="username" class="form-label">์ฌ์ฉ์ ์ด๋ฆ</label>
<input type="text" class="form-control" id="username" placeholder="์ฌ์ฉ์ ์ด๋ฆ" name="username">
</div>
<div class="form-group mb-3">
<label for="password" class="form-label">๋น๋ฐ๋ฒํธ</label>
<input type="password" class="form-control" id="password" placeholder="๋น๋ฐ๋ฒํธ" name="password">
</div>
<button type="submit" class="btn btn-primary">๋ก๊ทธ์ธ</button>
</form>
</div>
</div>
</body>
</html>
์ฌ์ฉ์ ์ด๋ฆ, ๋น๋ฐ๋ฒํธ๋ง ๋จ๊ฒจ๋๋๋ค.
2. View ์์ฑ
community ---> user ---> views.py
login ํจ์๋ฅผ ์์ฑ ํด์ค๋ค.
def login(request):
return render(request, 'login.html')
์ฐ์ login.html ๊ณผ ์ฐ๊ฒฐํด์ฃผ์๋ค.
3. Url ์ฐ๊ฒฐ
community ---> user ---> urls.py
urlpatterns = [
...
path('login/', views.login),
]
์ด๋ค ์ฃผ์๋ฅผ ์ฐ๊ฒฐํ์ ๋ ์์์ ๋ง๋ view๋ฅผ ์ฐ๊ฒฐํด ์ค๊ฑด์ง ์์ฑํ๋ ์ฝ๋์ด๋ค. ์ด๋ ๊ฒ ์์ฑํ๋ฉด .../user/login/ ์ด๋ผ๋ ์ฃผ์๋ฅผ ์น๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ค์ด๊ฐ๊ฒ ๋๋ค.
์ฐ์ ์ฌ๊ธฐ๊น์ง ํด์ ํ์ธํด๋ณด์.
ํด๋น ์ฃผ์์ ๋ก๊ทธ์ธ ํ์ด์ง๊ฐ ์์ฑ๋์๋ค.
4. ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์์ฑ
--- check password
community ---> user ---> views.py
check_password importํด์ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํด์ค๋ค.
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
elif request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
res_data = {}
if not (username and password):
res_data['error'] = "๋ชจ๋ ๊ฐ์ ์
๋ ฅํด์ฃผ์ธ์."
else:
fcuser = User.objects.get(username = username)
if check_password(password, fcuser.password):
pass
else:
res_data['error'] = "๋น๋ฐ๋ฒํธ๊ฐ ํ๋ ธ์ต๋๋ค."
return render(request, 'login.html', res_data)
๊ฐ์ ๋ชจ๋ ์ ๋ ฅํ์ง ์๊ฑฐ๋, ๋น๋ฐ๋ฒํธ๋ฅผ ํ๋ฆฌ๊ฒ ์ ๋ ฅํ์ ๊ฒฝ์ฐ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋์ด๋ค.
๋ก๊ทธ์ธ์ ์ฑ๊ณตํ์ ๋๋ ์ฐ์ pass๋ก ๋จ๊ฒจ๋๊ณ ํ์ธ์ ํด๋ณด์.
์คํ์ ํด๋ณด๋ ๋ชจ๋ ์ ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
--- Session ํ์ฉํ์ฌ ๋ก๊ทธ์ธ
๊ทธ๋ค์ ๋น๋ฐ๋ฒํธ ์ผ์นํ์ ๋์ ์ฝ๋๋ฅผ ์์ฑํด์ค๋ค. ์ฌ๊ธฐ์ ์ธ์ ์ ํ์ฉํ๋ค.
community ---> user ---> views.py
...
if check_password(password, fcuser.password):
request.session['user'] = user.id
return redirect('/')
...
์ ์ฝ๋์์ pass๋ถ๋ถ๋ง ๊ณ ์ณ์ค๋ค. ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ๋ฉด ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ์ฝ๋์ด๋ค. request.session์ ๋์ ๋๋ฆฌ ์ฒ๋ผ ์ฌ์ฉํ๋ฉด ๋๋ค. user๋ผ๋ key์ user์ id ๊ฐ์ ๋ฃ์ด ์ฃผ๊ณ , ํ์ด์ง์ ํํ๋ฉด์ผ๋ก ๊ฐ๋ ์ฝ๋ redirect('/')๋ฅผ ์์ฑํด ์ฃผ์๋ค. ๋ด๋ถ์ ์ผ๋ก ๋ก๊ทธ์ธ์ด ๋๋ ๊ณผ์ ์ ๋ณต์กํด๋ณด์์ง๋ง, ์ฅ๊ณ ๋ฅผ ํ์ฉํ๋ฉด ์ด๋ ๊ฒ ๋ฐ์ดํฐ ์ ์ฅ๋ง ํด์ฃผ๋ฉด ์์์ ์ฒ๋ฆฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌํ๋ค.
community ---> user ---> views.py
home ํจ์๋ฅผ ์์ฑํด์ค๋ค.
def home(request):
user_id = request.session.get('user')
if user_id:
user = User.objects.get(pk=user_id)
return HttpResponse(user.username + "๋ ํ์ํฉ๋๋ค!")
return HttpResponse("Home!")
session์์ ์ ์ฅํด๋์๋ user key๋ฅผ ๋ฐ์์ user_id์ ์ ์ฅํด์ฃผ๊ณ , ๊ทธ์ ํด๋นํ๋ User๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ user์ ์ ์ฅํ๋ค. h๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ค๋ฉด ๊ทธ user์ username์ HttpResponse๋ก ๋์์ฃผ๋ ์ฝ๋์ด๋ค.
community ---> urls.py
์ด๋ฒ์ user์์ url์ด ์๋ community ์์ url ํ์ผ์ ์ด์ด์ค๋ค.
urlpatterns = [
...
path('', home)
]
url์ ์๋ฌด๊ฒ๋ ๋ถ์ด์ง ์์์ ๋ home ๋ทฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์ฝ๋๊น์ง ๋ง์ณค๋ค. ํ์ธํด๋ณด์!
๊ทธ๋ฅ ์๋ฒ์ ๋ค์ด๊ฐ๋ฉด Home!, ๋ก๊ทธ์ธ์ ํ๋ฉด username์ด ์ ๋์์ง๋ค.
*** ๋ด๋ถ์ ์ผ๋ก๋
๊ฐ๋ฐ์๋๊ตฌ(F12) ๋ฅผ ํค๋ฉด application ํญ ---> cookie ---> sessionid ---> ํ๋์ ์๋ณ์ ๊ฐ ์ ์ฅ๋์ด ์๋ค.
์นํ์ด์ง๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๋ ์๋ณ์์ธ ๊ฒ์ด๋ค.
๊ฐ๋จํ ๋ก๊ทธ์์ ๊ตฌํ
community ---> user ---> view.py
logout ํจ์ ์์ฑ
def logout(request):
if request.session.get('user'):
del (request.session['user'])
return redirect('/')
๊ฐ๋จํ๊ฒ ์ธ์ ์ user ํค๊ฐ์ด ์ ์ฅ๋์ด ์์ผ๋ฉด ๊ทธ๊ฒ์ ์ง์ฐ๋ ์ฝ๋์ด๋ค.
user ---> urls.py
์์ง ํ๋ฉด์ ๊ตฌ์ฑํ์ง ์์์ผ๋ฏ๋ก url์ logout ์ ์น๋ฉด ๋ก๊ทธ์์ ๋๋ ์ฝ๋๋ฅผ ์จ์ค๋ค.
urlpatterns = [
...
path('logout/', views.logout),
]
์ด์ .../user/logout ์ด๋ผ๊ณ ์น๋ฉด ๋ก๊ทธ์์์ด ๋๊ณ ํํ๋ฉด์ผ๋ก ๋์๊ฐ๊ฒ ๋ ๊ฒ์ด๋ค.
๊ฒฐ๊ณผ
๋ก๊ทธ์ธ์ด ๋ ์ฑ๋ก logout ์ฃผ์๋ฅผ ์ณค๋๋ ์ฑ๊ณตํ๋ค!
'์น > Django' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DJANGO ๊ธฐ์ด] 7. Template ํ์ฅ, ์์ (0) | 2021.06.19 |
---|---|
[DJANGO ๊ธฐ์ด] 5. Static ํ์ผ ๊ด๋ฆฌ, ๋ถํธ์คํธ๋ฉ CSS ํ ๋ง ์ ์ฉ (0) | 2021.06.19 |
[DJANGO ๊ธฐ์ด] 4. ํ์๊ฐ์ ํ์ด์ง ๋ง๋ค๊ธฐ (MTV ๊ตฌ์กฐ - T, V ์์ฑ) (0) | 2021.06.16 |
[DJANGO ๊ธฐ์ด] 3. Django admin, ๊ฐ๋ฐ ์๋ฒ ํ์ฉ (0) | 2021.06.14 |
[DJANGO ๊ธฐ์ด] 2. MTV์ Model ์์ฑ, sqlite db ๊ธฐ๋ณธ์ ์ธ ๊ด๋ฆฌ (0) | 2021.06.14 |