본문 바로가기

멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차/WEB

2/21 월

728x90

월요일!

 

오늘은 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'
]

http://localhost:8000/admin/auth/user/

2. MySQL에서 auth_user의 DESC 보기. username이 id

MySQL lecture0216_db

3. auth_user DB에 사용자 연락처·얼굴 이미지가 없기 때문에 column을 추가해야 함.

 

PyCharm users/models.py에서 AbstractUser를 import 한 뒤 class 입력하고 settings.py에 이미 설정해 둔 MEDIA_ROOT 참고해 경로 연결해주기

settings.py

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↓

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↓

bbs/models.py

Schema가 새로 정의되었기 때문에 MySQL에서 DB 날리고 새로 만들기

MySQL lecture0216_db

PyCharm에서 기존의 DB Table 명세서 지우기

bbs/migrations/0001_initial.py

새로운 DB Table 명세서 만들고 DB Table 적용

↓PyCharm Terminal↓

python manage.py makemigrations
python manage.py migrate

MySQL에서 Table(users_member) 만들어진 것 확인(기존의 auth_user Table이 날아가고 대체됨)

MySQL lecture0216_db

superuser 재생성

↓PyCharm Terminal↓

python manage.py createsuperuser

MySQL lecture0216_db

Server Admin Page 확인

http://localhost:8000/admin/users/member/add/

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

↓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>

http://localhost:8000/

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">&copy; 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')

http://localhost:8000/users/login/

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('로그인 실패. 다시 접속해 주세요!')

http://localhost:8000/users/loginProcess/
http://localhost:8000/

이로써 로그인·로그아웃 구현 완료!

 

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
프로젝트

* 컨디션 조절!

728x90

'멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차 > WEB' 카테고리의 다른 글

2/18 금  (0) 2022.02.19
2/17 목  (0) 2022.02.17
2/16 수  (0) 2022.02.16
2/15 화  (0) 2022.02.15
2/14 월  (0) 2022.02.14