A ship in harbor is safe, but that is not what ships are built for.

개발일지/AI 캠프

내일배움캠프 AI, 18일차 TIL - 2022.09.23

플리피나리 2022. 9. 26. 03:42
반응형

스파르타 코딩클럽 내일배움캠프 AI 웹개발자양성과정 3회차

2022.09.23. 18일차 - TIL

 

 

1. Django 기초 강의

  • 장고가 동작하는 순서
    User -> URL Conf -> View -> Model(ORM) -> DB -> Model(ORM) -> View -> Template -> User
  • 프로젝트의 기능을 고려해 '사용자'와 '글'에 관한 앱 생성
$ django-admin startapp user
$ django-admin startapp tweet

## user앱 : 사용자 관리(회원가입, 로그인, 로그아웃)을 담당
## tweet앱 : 글 관리(글쓰기, 삭제, 수정, 댓글)을 담당
  • settings.py 수정 : Django가 서버를 실행하면서 알아야 할 정보들을 적는다
    -> 생성된 앱들을 장고에게 알림
    -> INSTALLED_APPS에 'tweet'과 'user' 추가
  • ORM : 데이터베이스를 하나의 '객체'로 보고, SQL 언어가 아닌 클래스로 표현해 사용
  • User Model 만들기 - 이미 Django에서 구현되어있지만 한번 직접 만들어보기!
    - user model : 이름, 비밀번호, 상태메시지, 생성일
    - user앱 아래에 models.py 생성 후 아래 코드 추가
from django.db import models

class UserModel(models.Model):
	class Meta:  # 이 모델의 정보
    	db_table = "my_user"  # DB에 저장할 테이블 이름
        
    username = models.CharField(max_length=20, null=False)
    password = models.CharField(max_length=256, null=False)
    bio = models.CharField(max_length=256, default='')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
# Django 모델 필드의 종류
# 문자열 : CharField, TextField
# 날짜/시간 : DataTimeField, DataField, TimeField
# 숫자 : IntegerField, FloatField
# 다른 테이블과 연관 : ForeignKey
  • 만든 모델 DB에 넣기
# DB 변경을 알려주는 명령어
python manage.py makemigrations

# 변경된 DB를 반영해주는 명령어
python manage.py migrate
  • Django의 admin 기능
    - createsuperuser : 관리자 페이지에 접속하기 위한 관리자 계정 생성
python manage.py createsuperuser

       - 모델 등록 : 우리가 만든 DB 모델을 admin 페이지에서 보기 위해 -> admin 페이지에서 결과 확인

from django.contrib import admin
from .models import UserModel

admin.site.register(UserModel)  # 나의 UserModel을 Admin에 추가
  • Tweet Model 만들기
    - tweet model : 작성자, 내용, 글 생성일자, 수정일자
    - tweet 앱 아래에 models.py 생성 후 아래 코드 추가
from django.db import models
from user.models import UserModel

class TweetModel(model.Model):  
	class Meta:  # 이 모델의 정보
    	db_table = "tweet"  # DB에 저장할 테이블 이름

	# ForeignKey는 '외부 모델을 가져와 사용하겠다' 라는 의미
	# author는 새로운 사람이 아닌 UserModel의 사용자이기에
	author = models.ForeignKey(UserModel. on_delete=models.CASCADE)
	content = models.CharField(max_length=256)
	created_at = models.DateTimeField(auto_now_add=True)
	updated_at = models.DateTimeField(auto_now=True)
  • 만든 모델 DB에 넣기
# DB 변경을 알려주는 명령어
python manage.py makemigrations

# 변경된 DB를 반영해주는 명령어
python manage.py migrate
  • 모델 등록 : 우리가 만든 DB 모델을 admin 페이지에서 보기 위해 -> admin 페이지에서 결과 확인
from django.contrib import admin
from .models import TweetModel

# Register your models here.
admin.site.register(TweetModel)  # 나의 TweetModel을 Admin에 추가
  • django 템플릿을 이용해 html 페이지 작성(로그인, 회원가입, 베이스)
  • template 작성 후 view와 url을 작성
    - 사용자가 url 요청 -> 크롬/사파리 등의 인터넷 브라우저
    - mySpartaSns에 요청 접수 -> settings.py가 있는 가장 처음 작성한 앱의 urls.py(mmySpartaSns의 urls.py)
    - 등록된 url 찾기 -> urls.py에 연결된 앱에 생성한 urls/py
    - 해당 url에 등록된 view 찾기
  • 새로 생성된 앱(user, tweet)의 urls.py와 기본으로 생성되어 있는 urls.py를 서로 연결
    - user 앱 안에 urls.py 생성
    - mySpartaSns 의 urls.py 수정
# mySpartaSns/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('user.urls'))  # user 앱의 urls.py에 연결시킬 것을 선언
]

       - user 앱의 views.py 작성

from django.shortcuts import render


# Create your views here.
def sign_up_view(request):
    return render(request, 'user/signup.html')


def sign_in_view(request):
    return render(request, 'user/signin.html')

       - user앱의 view.py의 함수들을 user의 url에 적용시키기 위해 user 앱의 urls.py 작성

from django.urls import path
from . import views

urlpatterns = [
    path('sign-up/', views.sign_up_view, name='sign-up'),  # 회원가입의 주소는 sign-up
    path('sign-in/', views.sign_in_view, name='sign-in'),  # 로그인의 주소는 sign-in
]
  • user model을 사용해 회원가입 기능 만들기
    - url 'sign-up'은 'GET' 방식을 통해 화면을 보여줌
    - url 'sign-up'의 'POST' 방식을 통해 가입정보를 입력하고 전송할 것
    - user의 views.py 내 sing_up_view 함수에 POST 방식 추가
# 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 ""

       - HTML의 form 태그 수정(signup.html)

<!-- 윗 부분 생략 -->
<form class="form-area" method="post" action="/sign-up/">

	<!--Django에서 post할 때 보안을 위해 사용-->
	{% csrf_token %}
    
	<!-- 중간 부분 생략 -->
    
	<!--해당 버튼은 form 태그의 method로 action에 데이터를 보내주는 역할-->
	<button type="submit" clss="btn btn-primary">회원가입</button>
    
<!-- 아랫 부분 생략 -->

        - user의 views.py에서 전송되는 데이터를 받아 저장

from django.shortcuts import render, redirect
from .models import UserModel

def sign_up_view(request):
    if request.method == 'GET':
        return render(request, 'user/signup.html')
    elif request.method == 'POST':
        username = request.POST.get('username', None)  # html의 input에서 입력했던 것들을 받아와 저장
        password = request.POST.get('password', None)
        password2 = request.POST.get('password2', None)
        bio = request.POST.get('bio', None)

	# password와 password2가 일치하는지 확인 해 주고, 일치하면 저장
        if password != password2:
            return render(request, 'user/signup.html')
        else:
            new_user = UserModel()
            new_user.username = username
            new_user.password = password
            new_user.bio = bio
            new_user.save()
        return redirect('/sign-in')  # 저장 완료 시 로그인 페이지로 이동
  • user model을 사용해 로그인 기능 만들기
    - 세션은 '사용자의 정보' 저장 가능
    - user의 views.py 내 로그인을 처리할 sing_in_view 함수에 POST 방식 추가
# 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')

      - HTML의 form 태그 수정(signin.html)

<!-- 윗부분 생략 -->
<!-- action과 method 추가 -->
<form class="form-area" action="/sign-in/" method="post">
	{% csrf_token %}
<!-- 아랫 부분 생략 -->

       - user의 views.py에서 전송되는 데이터를 받아 저장(sign_in_view 함수)

# user/views.py
def sign_in_view(request):
    if request.method == 'POST':  # 요청 메서드가 post인지 검사
    	# 전달된 값 저장
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)

	# username과 password를 검사하기 위해
        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주차 과제
    - 회원가입 시 이미 있는 사용자 인지 확인하는 코드 추가
    - 로그인 성공 후 HttpResponse를 사용해 화면에 '사용자 이름' 출력 코드 추가
from django.shortcuts import render, redirect, get_object_or_404
from .models import UserModel
from django.http import HttpResponse


# Create your views here.
def sign_up_view(request):
    if request.method == 'GET':
        return render(request, 'user/signup.html')
    elif request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)
        password2 = request.POST.get('password2', None)
        bio = request.POST.get('bio', None)

        if password != password2:
            return render(request, 'user/signup.html')
        #elif UserModel.objects.get(username=username):
           # return redirect('/sign-in')
        else:
            check_user = UserModel.objects.filter(username=username)
            # filter를 이용해 username과 동일한 이름이 있는지 확인

            if check_user:  # 동일한 user명이 있다면
                return render(request, 'user/signup.html')
            else:  # 동일한 user명이 없다면
                new_user = UserModel()
                new_user.username = username
                new_user.password = password
                new_user.bio = bio
                new_user.save()
                return redirect('/sign-in')


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(f'{me.username}님의 로그인 성공!')
        else:
            return redirect('/sign-in')
    elif request.method == 'GET':
        return render(request, 'user/signin.html')
반응형