월요일!
오늘은 Django에서 제공해주는 사용자 및 권한 관리 기능을 확장해서 사용한다.
오후 3시부터는 인터페이스 개발 수업에 대한 시험이 있고, 오후 4시부터 팀 프로젝트 진행!
1. users app 만들고 lecture 폴더의 settings.py에 앱 등록
↓PyCharm Terminal↓, ↓settings.py↓
python manage.py startapp users # PyCharm Terminal
--------------------------------
INSTALLED_APPS = [ # lecture 폴더의 settings.py
'users.apps.UsersConfig'
]
2. MySQL에서 auth_user의 DESC 보기. username이 id
3. auth_user DB에 사용자 연락처·얼굴 이미지가 없기 때문에 column을 추가해야 함.
PyCharm users/models.py에서 AbstractUser를 import 한 뒤 class 입력하고 settings.py에 이미 설정해 둔 MEDIA_ROOT 참고해 경로 연결해주기
DB Column을 정의하기. image 올라가는 경로 설정
↓users/models.py↓
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.conf import settings
class Member(AbstractUser):
mobile = models.CharField(max_length=20)
image = models.ImageField(upload_to=settings.MEDIA_ROOT,
blank=True,
null=True)
↓settings.py↓
Pillow 패키지 다운로드하기
↓PyCharm Terminal↓
conda install Pillow
static·settings import 해서 static 경로 추가해주기
↓lecture/urls.py↓
# Root URLConf(http://127.0.0.1:8000/)
from django.contrib import admin
from django.urls import path, include
from django.views.generic.base import TemplateView
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path('', TemplateView.as_view(template_name='index.html'), name='home'), # Main Page
path('admin/', admin.site.urls), # Admin Page
path('bbs/', include('bbs.urls'))
] + static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
Server Admin Page에서 Member class를 볼 수 있도록 설정
↓users/admin.py↓
from django.contrib import admin
from users.models import Member
admin.site.register(Member)
4. 글 작성자를 직접 입력하는 것이 아닌, 로그인하는 사람으로 잡혀야 하기 때문에 Member class 불러오고 재정의
↓bbs/models.py↓
Schema가 새로 정의되었기 때문에 MySQL에서 DB 날리고 새로 만들기
PyCharm에서 기존의 DB Table 명세서 지우기
새로운 DB Table 명세서 만들고 DB Table 적용
↓PyCharm Terminal↓
python manage.py makemigrations
python manage.py migrate
MySQL에서 Table(users_member) 만들어진 것 확인(기존의 auth_user Table이 날아가고 대체됨)
superuser 재생성
↓PyCharm Terminal↓
python manage.py createsuperuser
Server Admin Page 확인
5. Root_URL에 users app 경로 넣어주고, bbs/urls.py을 users 폴더 안에 복붙 하기
↓lecture/urls.py↓
↓users/urls.py↓
# users App의 URLConf(http://127.0.0.1:8000/users/)
from django.urls import path
from users import views
app_name = 'users'
urlpatterns = [
path('login/', views.login, name='login'),
]
↓users/views.py↓
from django.shortcuts import render
def login(request):
pass
6. Server Main Page에서 로그인을 하는 사람만 게시판으로 들어갈 수 있도록 설정
authenticated로 request 안의 사용자 계정이 인증이 됐는지 안 됐는지 확인
↓templates/index.html↓
↓templates/index.html↓
<main class="px-3">
<p class="lead">
{% if request.user.is_authenticated %}
{{ request.user.username }} 님 환영합니다.
{% else %}
로그인이 필요합니다.
{% endif %}
</p>
<p class="lead">
{% if request.user.is_authenticated %}
<a href="/bbs/list/"
class="btn btn-lg btn-primary">Enter BBS!!</a>
<a href="/users/logout/"
class="btn btn-lg btn-danger">Logout</a>
{% else %}
<a href="/users/login/"
class="btn btn-lg btn-warning">Login</a>
{% endif %}
</p>
</main>
logout url 경로 추가해주기
↓users/urls.py↓
# users App의 URLConf(http://127.0.0.1:8000/users/)
from django.urls import path
from users import views
app_name = 'users'
urlpatterns = [
path('login/', views.login, name='login'),
path('logout/', views.logout, name='logout'),
]
Django가 제공해주는 logout 기능을 이용. index.html의 Logout 버튼을 누르면 로그아웃+메인으로 이동
import redirect·logout. 키워드 이름이 모듈과 같아 SyntaxError가 나므로 alias로 모듈의 별칭 만들고 사용. Root URLConf의 Main Page namespace를 이용해 redirect
↓users/views.py↓
from django.shortcuts import render, redirect
from django.contrib.auth import logout as django_logout
def login(request):
pass
def logout(request):
django_logout(request)
return redirect('home')
7. Django가 제공해주는 login 기능을 이용.
http://localhost::8000/bbs/list/를 직접 치고 들어올 수 없도록, b_list 함수에 인증 기능을 조건문으로 추가
↓bbs/views.py↓
def b_list(request):
if request.user.is_authenticated:
posts = Board.objects.all().order_by('-id')
context = {
'posts': posts
}
return render(request, 'bbs/list.html', context)
else:
return redirect('home')
users 디렉터리 밑에 templates/users 폴더 만들기
users/templates/users 폴더에 login.html 파일 생성 후 Bootstrap 예시 중 로그인 화면(sign-in/)의 페이지 소스 가져와 복붙, css 파일 가져와서 static/css 디렉터리 안에 넣기
https://getbootstrap.kr/docs/5.1/examples/sign-in/
bbs/templates/bbs 폴더의 create.html 파일을 참조(base.html, bootstrap4)해서 login.html 만들기
↓login.html↓
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block html_header %}
<script src="/static/js/menu_btn.js"></script>
<style>
.bd-placeholder-img {
font-size: 1.125rem;
text-anchor: middle;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
@media (min-width: 768px) {
.bd-placeholder-img-lg {
font-size: 3.5rem;
}
}
</style>
<link href="/static/css/signin.css" rel="stylesheet">
{% endblock %}
{% block html_body %}
<main class="form-signin">
<form action="/users/loginProcess/"
method="post">
{% csrf_token %}
<h1 class="h3 mb-3 fw-normal">Please sign in</h1>
{% bootstrap_form my_form %}
<button class="w-100 btn btn-lg btn-primary" type="submit">Sign in</button>
<p class="mt-5 mb-3 text-muted">© 2017–2021</p>
</form>
</main>
{% endblock %}
users 디렉터리 밑에 forms.py 생성 후 class 만들기
↓users/forms.py↓
from django import forms
from users.models import Member
class LoginForm(forms.ModelForm):
class Meta:
model = Member
fields = ['username', 'password']
labels = {
'username': '사용자 이름',
'password': '비밀번호'
}
widgets = {
'username': forms.TextInput(
attrs= {
'class': 'form-control',
'placeholder': '사용자 이름을 입력하세요'
}
),
'password': forms.PasswordInput(
attrs= {
'class': 'form-control',
'placeholder': '비밀번호를 입력하세요'
}
)
}
↓users/views.py↓
from django.shortcuts import render, redirect
from django.contrib.auth import logout as django_logout, \
login as django_login
from users.forms import LoginForm
def login(request):
login_form = LoginForm()
context = {
'my_form': login_form
}
return render(request, 'users/login.html', context)
def logout(request):
django_logout(request)
return redirect('home')
loginProcess URL 경로 잡기
↓users/urls.py↓
# users App의 URLConf(http://127.0.0.1:8000/users/)
from django.urls import path
from users import views
app_name = 'users'
urlpatterns = [
path('login/', views.login, name='login'),
path('logout/', views.logout, name='logout'),
path('loginProcess/', views.login_process, name='login_process'),
]
login_process 함수 정의 + 인증 처리(authenticate)
↓users/views.py↓
from django.shortcuts import render, redirect
from django.contrib.auth import logout as django_logout, \
login as django_login, authenticate
from users.forms import LoginForm
from django.http import HttpResponse
def login(request):
login_form = LoginForm()
context = {
'my_form': login_form
}
return render(request, 'users/login.html', context)
def logout(request):
django_logout(request)
return redirect('home')
def login_process(request):
if request.method == 'POST':
login_form = LoginForm(request.POST)
username = login_form.data['username']
password = login_form.data['password']
user = authenticate(username=username, password=password)
if user is not None:
django_login(request, user)
return redirect('home')
else:
return HttpResponse('로그인 실패. 다시 접속해 주세요!')
이로써 로그인·로그아웃 구현 완료!
1. 1/17 월 | 2. 1/18 화 | 3. 1/19 수 | 4. 1/20 목 | 5. 1/21 금 |
취업 특강 | Python 환경 설정 (파이참, 아나콘다, 주피터 노트북) |
Python 데이터 타입 (list, tuple) |
Python 데이터 타입 (range, string, dictionary, set, bool) |
Python 사용자 정의 함수, 객체지향, 사용자 정의 클래스 |
6. 1/24 월 | 7. 1/25 화 | 8. 1/26 수 | 9. 1/27 목 | 10. 1/28 금 |
Python 사용자 정의 클래스, 사용자 정의 모듈 |
DB(MySQL) DBMS, MySQL 환경 설정, DB/테이블 생성, DB 입력·활용, Index |
DB(MySQL) View, 백업과 복원, DB 모델링, 관계(PK, FK), DML(CRUD), 데이터 타입 |
DB(MySQL) DML(CRUD), WHERE 조건, 패턴 매칭, SubQuery, 정렬, 그룹핑, 집계 함수, 트랜잭션(ACID 특성) |
DB(MySQL) JOIN, UNION, NOT IN, WEB |
11. 2/3 목 | 12. 2/4 금 | 13. 2/7 월 | 14. 2/8 화 | 15. 2/9 수 |
WEB WebStorm 환경 설정, HTML, CSS, JavaScript, jQuery CDN |
WEB jQuery 문법, Selector, Method |
WEB jQuery Method, Event, AJAX |
GitHub 특강 소스코드 관리, Fork, Clone, Branch, Commit, Push, Pull-Request, Rebase |
GitHub 특강 프로젝트 관리, Fetch, Rebase, Merge, Conflict |
16. 2/10 목 | 17. 2/11 금 | 18. 2/14 월 | 19. 2/15 화 | 20. 2/16 수 |
WEB jQuery AJAX, Bootstrap, Open API |
Django WSGI, MVC, MVT, ORM, 투표 시스템 |
Django MVT, ORM |
Django MVT, ORM, Redirect |
Django 게시판 |
21. 2/17 목 | 22. 2/18 금 | 23. 2/21 월 | 24. 2/22 화 | 25. 2/23 수 |
Django 게시판, Model Form |
Django 게시판, 프로젝트 조 편성 |
Django 사용자 및 권한 관리, 테스트 |
Django 프로젝트 |
Django 프로젝트 |
* 컨디션 조절!