반응형
스파르타 코딩클럽 내일배움캠프 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')
반응형
'개발일지 > AI 캠프' 카테고리의 다른 글
내일배움캠프 AI - 19일차 TIL, 2022.09.26 (0) | 2022.09.27 |
---|---|
내일배움캠프 AI - 4주차 WIL (0) | 2022.09.26 |
내일배움캠프 AI, 17일차 TIL - 2022.09.22 (0) | 2022.09.23 |
내일배움캠프 AI, 16일차 TIL - 2022.09.21 (0) | 2022.09.21 |
내일배움캠프 AI, 15일차 TIL - 2022.09.20 (1) | 2022.09.21 |