선발대

[스파르타] Django 기초반 2주차 (완강) 본문

스파르타코딩클럽/강의 정리

[스파르타] Django 기초반 2주차 (완강)

신선한 스타트 2022. 1. 20. 00:03

1. 수업 후기

 

  • 강의 개수: 9개
  • 총 강의시간: 1시간 44분
  • 수업 목표:
  • 1. Django의 구조를 알아보고, 필요한 기초 명령들을 익혀본다.
  • 2. 데이터베이스를 연결하고, 데이터베이스를 사용하는 방법을 알아본다.
  • 3. 사용자 모델을 만들고, 회원가입과 로그인 기능을 직접 만든다.

 

안녕하슈크림

 

2. 수업내용 정리

2-1. 2주차 이번주 배울 것
더보기

 

  • Django 실행, 관리를 위한 명령어 알아보기
  • Django ORM 알아보고 DB와 연동하여 사용해보기
  • Admin 기능 알아보기
  • 사용자 모델 만들고 사용자 관리 기능을 구현해보기 (회원가입 / 로그인)

 

2-2. 프로젝트 구조 만들기
더보기

01. 장고가 일하는 순서

 

  • user ←→ URL Conf, Template → View → Model (ORM) → DB
  • 우리가 주로 작성할 곳은 URL, View.
  • URL: 사용자가 어떤 주소로 접근할 수 있게 정해주는 공간 (url.py)
  • View: URL에서 어떤 기능, 역할을 할 것인지 만들어주는 공간 (views.py)

 

02. 프로젝트 구조 만들기

 

  • SNS 만들기
  • 사용자 관리 (회원가입 / 로그인 / 로그아웃)
  • 글쓰기
  • 친구 만들기

 

$ django-admin startapp user
$ django-admin startapp tweet

 

  • app 생성 (위의 명령어)
  • user앱: 사용자 관리 (회원가입 / 로그인 / 로그아웃)을 담당
  • tweet앱: 글 관리 (글쓰기, 삭제, 수정, 댓글)을 담당
  • 터미널에서 입력하기 전에 가상환경에서 실행 중인지 확인 필요.

 

03. 프로젝트 세팅하기

 

  • mySpartaSns: 프로젝트를 관리하는 모든 정보들을 갖고 있는 곳
  • app 만들면 setting.py에 추가해야 함.
  • setting.py: Django가 서버 실행하면서 알아야 할 정보들을 적어줘야 함.

 

# 새로운 앱을 만들었다고 장고에게 말해준다.
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'tweet',
    'user',
]

 

2-3. 데이터베이스와 Django ORM 알아보기
더보기

01. 데이터베이스 연결하기

 

  • Django와 데이터베이스를 연동하고, PyCharm에서 데이터베이스 확인해보기
  • 장고 한번이라도 실행하면 setting.py에 있는 DATABASES 정보로 DB와 자동 연동함.
  • db.sqlite3이 생성되었는지 확인하기: 있으면 데이터베이스 연결이 잘 되어있구나~
  • 눈으로 확인하기 위해 아래의 과정 진행. 
  • 데이터베이스를 한 눈에 볼 수 있도록 파이참이 도와주는 도구
  • 우측의 Database를 눌러 연결하기 - Data Source from Path - db.sqlite3
  • 한번 해두면 앞으로 데이터베이스 생성될 때마다 옆에서 확인 가능함

 

02. ORM이란?

 

  • ORM(Object Relational Mapping): DB를 하나의 '객체(Object)' 덩어리로 보고,
  • 데이터베이스를 SQL언어가 아닌 클래스로 쉽게 표현 및 사용할 수 있게 해준다.
  • 클래스 이름, 내부에 선언된 변수들이 '비슷한 성격'들을 가지고 있음.
  • 파이썬을 이용해서 데이터를 다룰 수 있게 함.
  • 원래 일반적으로는 SQL언어를 이용해서 DB를 다뤘음.

 

03. User Model 만들기

 

  • Django는 기본적으로 User 모델 제공. 사용자의 관리, 로그인, 로그아웃이 이미 다 구현되어있음.
  • Django에서 제공하는 models.py를 사용해서 각 요소의 데이터 형식, 각 필드에 제한을 두었음.
  • Django 모델 필드의 종류: 외우지 말고 눈으로만 익히기

 

문자열 : CharField, TextField
날짜/시간: DateTimeField, DateField, TimeField
숫자 : IntegerField, FloatField
다른 테이블과 연관을 지어 줄 때 : ForeignKey

 

04. 만든 모델 데이터베이스에 넣기

 

  • 방금 우리가 열심히 만든 User Model을 데이터베이스에 넣어주려고 함.

 

  • 1. makemigrations: 데이터베이스 변경을 알려주는 명령어
  • 터미널: python manage.py makemigrations

 

  • 2. migrate: 변경된 데이터베이스를 적용시켜주는 명령어
  • 터미널: python manage.py migrate

 

2-4. Django Admin - admin 기능 맛보기
더보기

01. createupseruser

 

  • 장고는 이미 구현된 많은 기능들이 있는데 그 중 대표적인 것이 Admin임.
  • http://127.0.0.1:8000/admin (관리자 페이지 접속하기)
  • Django에서 제공하는 super user를 만들어야 admin 페이지에 접근 가능.
  • 서버 끄고, python manage.py createsuperuser 터미널 입력.
  • 관리자 계정 만드는 것 이어서 입력. (패스워드는 화면에 안 나옴)

 

02. admin 화면

 

  • Site administration: admin이 우리에게 제공하는 기능들을 볼 수 있음.
  • Admin 페이지에 들어가서 Users를 보면 우리가 방금 생성한 관리자가 들어있음.
  • Django에서 기본적으로 제공하는 User 모델임.

 

03. 우리의 모델 등록

 

  • User앱 > admin.py > 우리가 아까 만든 UserModel 넣어주기: 
from django.contrib import admin
from .models import UserModel

# Register your models here.
admin.site.register(UserModel) # 이 코드가 나의 UserModel을 Admin에 추가해준다.

 

  • Admin 페이지에서 새로고침하면 UserModel 들어간 것을 확인할 수 있음.

 

2-5. ORM의 활용과 Admin 익숙해지기
더보기

01. Tweet 모델 만들기

 

  • user 앱에서 작업했으니, 이번에는 tweet 앱에서 작업하기
  • SNS 게시글에 필요한 기능: 작성자, 내용, 글 생성일자, 수정일자
  • tweet앱 > models.py
# tweet/models.py
from django.db import models
from user.models import UserModel


# Create your models here.
class TweetModel(models.Model):
    class Meta:
        db_table = "tweet"

    author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
    # ForeignKey: 외부 모델 가져와서 사용하겠다는 의미
    # author은 User Model의 사용자가 작성한 글임
    
    content = models.CharField(max_length=256)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

 

02. 데이터베이스에 알려주고 적용하기

 

  • 모델을 만들었으면 데이터베이스에도 알려줘야 함.
  • 서버 끄고 아래 명령어들 입력.
  • python manage.py makemigrations
  • python manage.py migrate
  • 입력 후 다시 서버 실행.
  • DB 확인.

 

03. admin에 넣어주기

 

  • admin 페이지에서 볼 수 있도록 작성.
  • tweet앱 > admin.py > admin에 추가하는 코드 작성

 

from django.contrib import admin
from .models import TweetModel

# Register your models here.
admin.site.register(TweetModel)

 

  • http://127.0.0.1:8000/admin : 페이지에서 tweet 모델이 추가된 것을 확인할 수 있음.

 

2-6. 사용자 관리와 로그인 - 화면 띄우기
더보기

01. 템플릿 만들기 (HTML 작성하기)

 

  • user - signin.html, signup.html
  • base.html
  • { % : 장고에서 말하는 템플릿 문법.
  • 우리가 중복해서 html 계속 작성하지 않고 html에 파이썬 기능들을 추가해줄 수 있는 문법들.

 

02. url - view - template 이어주기

 

  • 장고 MVT 패턴: M(Modle), T(Template), V(View)
  • 사용자가 url 요청 > 브라우저 > MySpartaSns > setting.py가 있는 앱의 urls.py > 연결앱 urls.py > view
  • mySpartaSns > urls.py: path('', include('user.urls'))  

 

  • user의 urls.py에 연결할 user앱의 views.py 작성.
  • views.py: render로 html 파일 연결해주는 것

 

  • 작성한 views.py를 urls.py에 연결해주기
  • user/urls.py: path로 주소랑 실행할 함수 적어준다.

 

2-7. 사용자 관리와 로그인 - 회원가입 기능 만들기
더보기

01. 어떻게 만들 것인가?

 

  • 회원가입 페이지 url: sign-up, GET
  • 가입정보 입력, 전송 url: sign-up, POST
  • GET, POST 둘 다 인터넷으로 통신하는 방법들
  • GET: 값 읽어올 때 사용
  • POST: 값을 주거나 수정, 삭제 요청할 때 사용

 

02. user의 views.py sign_up_view에 POST 추가하기

 

  • HTTP 요청 방식을 구분하는 코드를 추가함.
# user/views.py
def sign_up_view(request):
    if request.method == 'GET': # GET 메서드로 요청이 들어 올 경우
        return render(request, 'user/signup.html')
    elif request.method == 'POST': # POST 메서드로 요청이 들어 올 경우
        
        return ""

 

03. HTML에서 form 태그 설정

 

  • <form> 태그는 화면에 있는 데이터를 서버로 보내줄 때 사용함. (html에서 서버로)
  • signup.html의 <form>태그 속성에 method(POST, GET)와 action(보낼 URL)을 추가함.
  • action 뒤에 / 없으면 오류남.
<!-- 윗 부분 생략 -->
<div class="wrap">
    <h2 class="title-center"> 회원가입 </h2>
    <form class="form-area" method="post" action="/sign-up/">
        {% csrf_token %}
        <div class="form-group mt-2 mb-2">
            <label for="username">이름</label>
            <input type="text" class="form-control" id="username" name="username">
        </div>
        <div class="form-group mt-2 mb-2">
<!-- 아랫 부분 생략 -->

 

  • {% csrf_token %}: Django에서 POST로 데이터 전송할 때 보안을 위해 자주 사용해줘야 함.
  • <input>태그들의 id, name들을 잘 기억하기. name을 서버로 전송함.
  • <form>태그 안의 <button> type = "submit"은 form을 실행시켜주는 역할.
  • POST 방식으로, action의 URL로.

 

04. user의 views.py에서 전송되는 데이터 받아서 저장하기

 

  • 화면에서 사용자 정보를 받아서 model에 저장해야 함. 따라서 UserModel 데이터베이스에 저장.
  • html의 input에 입력한 친구들은 user / views.py / sign_up_view() 함수로 들어감.
  • sign_up_view() 함수에서 데이터 받아오고, 패스워드 확인.
  • new_user을 UserModel()의 빵틀로 찍어내고, 거기에 새로운 데이터들 입력함.
  • new_user.save() 하면 DB에 저장됨.
  • redirect 함수 이용하면 로그인 페이지 /sign-in url로 이동시켜줌.
  • 이거 이용하면 회원가입 페이지 말고 로그인 페이지로 가는 것임.

 

2-8. 사용자 관리와 로그인 - 로그인 기능 만들기
더보기

01. url, view 세팅하기

 

  • 세션: 사용자의 정보를 저장하는 공간. 같은 사람이 요청을 하는지 확인 가능.
  • user / views.py에 로그인을 처리해줄 함수(sign_in_view) 생성 후, url과 이어주기.
  • 이미 url은 이어졌기 때문에 views.py의 함수만 수정함.
# user/views.py
from django.http import HttpResponse

def sign_in_view(request):
		if request.method == 'POST':
        return HttpResponse("로그인 성공!")
    elif request.method == 'GET':
        return render(request, 'user/signin.html')

 

02. signin.html의 form 태그 속성 넣기

 

  • html에서 url, view로 데이터 넘겨줘야 하므로, form 태그의 action, method 이용.
  • input의 name을 기억하도록. 이대로 /sign-in url로 보내주기 때문.
<!-- 윗부분 생략 -->
<div class="wrap">
    <h2 class="title-center"> 로그인</h2>
    <form class="form-area" action="/sign-in/" method="post">
        {% csrf_token %}
        <div class="form-group mt-2 mb-2">
<!-- 아랫 부분 생략 -->

 

03. view의 로그인 작업 마무리하기

 

  • username, password가 /sign-in으로 전달. sign_in_view 함수가 실행됨.
  • user / sign_in_view 함수에 로그인 기능 추가하기. 세션 기능 사용할 것임.
# user/views.py
def sign_in_view(request):
    if request.method == 'POST':
        username = request.POST.get('username', None)
	      password = request.POST.get('password', None)

        return HttpResponse("로그인 성공!")
    elif request.method == 'GET':
        return render(request, 'user/signin.html')

 

  • 조건문 통해서 요청 메소드가 POST인지 검사함.
  • username, password 받아서 패스워드 검사하기 위해서는 '사용자' 불러와야 함.
  • UserModel 사용해서 사용자 불러오는 작업해보기
  • 아래의 코드를 추가해준다. 그럼 끝!

 

# user/views.py
def sign_in_view(request):
    if request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)

        me = UserModel.objects.get(username=username)  # 사용자 불러오기
        if me.password == password:  # 저장된 사용자의 패스워드와 입력받은 패스워드 비교
            request.session['user'] = me.username  # 세션에 사용자 이름 저장
            return HttpResponse("로그인 성공!")
        else: # 로그인이 실패하면 다시 로그인 페이지를 보여주기
            return redirect('/sign-in')
    elif request.method == 'GET':
        return render(request, 'user/signin.html')

 

2-9. 2주차 Wrap Up!! & 숙제 설명
더보기

01. 오늘의 복습

 

  • 장고의 여러 명령어를 배움. (startapp, makemigrations, migrate)
  • 장고 Admin 화면을 띄움.
  • ORM에 대해 배웠고, Admin에 나의 데이터베이스 모델을 추가했음.
  • POST, GET을 분리해서 하나의 view에 넣었음.

 

02. 숙제

 

  • user / views.py를 수정하는 숙제임. 숙제 완료한 후 views.py 제출하기
  • 숙제1: 회원가입 시 이미 있는 사용자인지 확인하는 코드 작성하기.
  • 숙제2: 사용자가 로그인 성공 후, HttpResponse를 사용해서 화면에 '사용자 이름' 출력.
Comments