파이썬 장고 실무 기초 2주차
프로젝트 구조 만들기
프로젝트 구조 만들기
sns 앱의 기능은 크게 세 가지로 나눌 수 있다.
사용자 관리 (회원가입 / 로그인 / 로그아웃) , 글쓰기, 친구 만들기
이걸 다시 나누면 사용자
, 글
로 나눌 수 있으므로 이 두 기능을 하는 앱을 만든다.
👉 User
: 사용자 관리 ( 회원가입/로그인/로그아웃)
👉 Tweet
: 글 관리( 글쓰기, 삭제, 수정, 댓글)
$ django-admin startapp user
$ django-admin startapp tweet
프로젝트 세팅하기
mySpartaSns/mySpartaSns
폴더 : 이 프로젝트를 관리하는 모든 정보들을 갖고 있는 곳
mySpartaSns/mySpartaSns/settings.py
: Django
가 서버를 실행하면서 알아야 할 정보들
settings.py의 설정들 중 INSTALLED_APPS에 우리가 만든 앱을 추가
# mySpartaSns/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tweet',
'user',
]
데이터베이스와 Django ORM
데이터베이스
settings.py
에는 데이터베이스와 관련된 정보도 들어있음
👉 데이터베이스 연결 성공!
강의는 파이참이지만 나는 VSCode로 실습 중이기 때문에 SQLite Viewer를 깔았다.
SQLite 라는 확장 프로그램도 있고 그게 더 다운 수가 많았는데 뭐가 다른 건지 모르겠다.
SQLite Viewer는 2021년이고 SQLite 는 2018년인 것 보니까 그냥 새로운 프로그램인 것 같기도 하고 SQLite Viewer는 따로 설정을 해줘야 하는 것 같아서 그냥 SQLite Viewer 깔았다.
잘 나오기도 하고!!
ORM?
👉 Object Relational Mapping
데이터베이스를 하나의 객체라고 하는 것. 즉, 데이터베이스에 들어가있는 데이터들을 하나의 클래스로 보겠다는 것
클래스처럼 ORM 모델을 만들 때에도 어떤 역할을 하는 모델을 생성 할 것인지, 어떤 요소들을 담을것인지 고민이 필요하다.
모델 만들기 요약
1) 해당하는 폴더 속 models 파일에 원하는 모델 만들기
2) 데이터베이스에 알려주기 (모델 등록)
python manage.py makemigrations # 만들었어!
python manage.py migrate # 적용시켜줘!
3) admin에 넣어주기
User Model 만들기
- 원하는 모델 만들기
User 모델을 만들거기 때문에 user의 models폴더에서 진행
#user/models.py
from django.db import models
# Create your models here.
class UserModel(models.Model):
class Meta:
db_table = "my_user"
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)
UserModel 만든 클래스 이름
username 이름
password 비밀번호
bio 생체정보
create_at 생성일
updated_at 수정일
class Meta
: 👉 모델의 정보를 담고 있다. 데이터베이스에 정보를 넣어주는 역할을 하는 곳
cf) django 모델 필드의 종류
문자열 : CharField, TextField
날짜/시간: DateTimeField, DateField, TimeField
숫자 : IntegerField, FloatField
다른 테이블과 연관을 지어 줄 때 : ForeignKey
User Model 데이터베이스에 넣기
- 데이터베이스에 알려주기
데이터베이스에 들어가보면,
my_user
가 잘 생기고, 넣은 값들도 잘 들어간 것을 확인할 수 있다.
Django Admin
http://127.0.0.1:8000/admin 하면
이러한 화면이 나오는데, django에서 제공하는 super user를 만들고 로그인해야 admin 페이지에 접근할 수 있다.
python manage.py createsuperuser
☝️관리자 계정 만들기☝️
성공~
그리고 다시 http://127.0.0.1:8000/admin 로 들어가서 관리자 페이지에 들어가고
생성한 계정으로 로그인하면,
관리자 기능을 사용할 수 있는 페이지가 뜬다.
- user model admin에 넣어주기 (모델 등록)
# user/admin.py
from django.contrib import admin # django에서 admin 툴을 사용하겠다
from .models import UserModel # 우리가 생성한 모델을 불러온다
# Register your models here.
admin.site.register(UserModel) # 이 코드가 나의 UserModel을 Admin에 추가 해 줍니다
ORM의 활용과 Admin 익숙해지기
Tweet 모델 만들기
- 원하는 모델 만들기
# tweet/models.py
from django.db import models
from user.models import UserModel # 유저 앱에 있는 모델 중 이름 usermodel 가져옴
# Create your models here.
class TweetModel(models.Model):
class Meta:
db_table = "tweet"
author = models.ForeignKey(UserModel, on_delete=models.CASCADE) # fpreignkey --> 다른 데이터베이스에서 내용을 가져오겠다
content = models.CharField(max_length=256)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
모델을 만들었으므로
다시 데이터베이스에 알려줄 차례
Tweet 모델 적용하기
- 데이터베이스에 알려주기
python manage.py makemigrations
python manage.py migrate
Tweet model admin에 넣어주기
# tweet/admin.py
from django.contrib import admin
from .models import TweetModel
# Register your models here.
admin.site.register(TweetModel)
그리고 다시 관리자 페이지로 들어가보면,
사용자 관리와 로그인
회원가입, 로그인 화면 띄우기
1) HTML 작성 ( render 함수 사용)
templates
> base.html
templates
> user
> signin.html
templates
> user
> signup.html
👉 django 템플릿 : html 문법
https://docs.djangoproject.com/ko/3.1/topics/templates/
{% extends 'base.html' %}
👉 base.html 파일 위에 추가해준다! (여러번 쓰지 않고 이어서 작성할 수 있음)
2) url - view - template 이어주기
cf) 장고의 MVT 패턴
https://chaeyami.tistory.com/42#%EC%9E%A5%EA%B3%A0%EC%9D%98_MVT_%ED%8C%A8%ED%84%B4
Model (models.py) , View (views.py) , Template (html)
중에서 template는 완성했고, 이제 view, url 만들 차례
1. 사용자가 url 요청 → 크롬/사파리 등의 인터넷 브라우저
2. mySpartaSns에 요청이 접수 → settings.py가 있는 가장 처음 작성한 앱의 urls.py
3. 등록된 url을 찾기 → urls.py에 연결 된 앱에 생성 한 urls.py
4. 해당 url에 등록 된 view를 찾기
사용자 관리이기 때문에 user
앱에 만들 거다. 그리고 mySpartaSns
와 잘 연결해줘야 한다.
위 강의 내용 복습 - mySpartaSns : 이 프로젝트를 관리하는 모든 정보들을 갖고 있는 곳
👇 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에 연결시키겠다!
]
mySpartaSns와 user앱의 url이 연결 후 url에 맞는 화면을 보여주기 위해 views.py를 작성
user앱의 views.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')
작성한 views.py 를 user 앱의 urls.py에 연결
👉 user앱의 views.py에 작성 한 함수들을 user의 url에 적용
👉 회원가입(signup)의 주소는 'sign-up', 로그인(signin)의 주소는 'sign-in'
# user/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('sign-up/', views.sign_up_view, name='sign-up'),
path('sign-in/', views.sign_in_view, name='sign-in'),
]
http://127.0.0.1:8000/sign-up
http://127.0.0.1:8000/sign-in
회원가입 기능 만들기
기능 | url | 방식 |
회원가입 페이지 | sign-up | GET |
가입정보 전송 | sign-in | POST |
1) user앱 회원가입 화면에 POST 추가하기
user > views.py 속 sign_up_view 함수에 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 "" # 후에 마저 작성
2) HTML에서 form태그 설정
signup.html의 <form>
태그 속성에 method와 action 추가
<!-- signup.html -->
<!-- 윗 부분 생략 -->
<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">
<!-- 아랫 부분 생략 -->
button 👉 form태그의 method로 action에 데이터를 보내주는 역할
{% csrf_token %} 👉 Django에서 POST 할 때 보안을 위해서 사용
3) user의 views.py에서 전송되는 데이터 받아서 저장하기
username, password, password2, bio 👉 받아오는 정보, sign_up_view() 로 들어감
정보 : html ---> views.py
password와 password2가 일치하는지 확인하고 저장
user > views.py > sign_up_view()
# user/view.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': # POST 방식이라면
# 기존 return "" 부분
# html에서 받아온 내용 가져오기
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') # 같지 않으면 입력화면 다시 띄우기
else:
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):
return render(request, 'user/signin.html')
redirect 👉 저장 완료 후 로그인페이지 (/sign-in) url로 이동
cf) POST.get('username',None) --> None : 'username' 키가 존재하지 않을 때 반환할 기본값
로그인 기능 만들기
서버와 클라이언트 사이에서 '요청'과 '응답'을 합니다. 그 때에 같은 사람이 요청을 하는지 확인을 할 수 있도록 도와주는 '세션'을 사용하려고 합니다. '세션'은 '사용자의 정보'를 저장 할 수 있다! 로 생각하고, 코드를 활용하는 법을 알아보도록 하겠습니다!
1) user 앱 로그인 화면에 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')
2) HTML에서 form태그 설정
username, password를 /sign-in 으로 보내줌
3) user의 views.py에서 전송되는 데이터 받아서 저장하기
# user/views.py
def sign_in_view(request):
if request.method == 'POST': # 요청 메서드가 POST인지
# username과 password를 받아서 패스워드를 검사
username = request.POST.get('username', None)
password = request.POST.get('password', None)
return HttpResponse("로그인 성공!")
elif request.method == 'GET':
return render(request, 'user/signin.html')
GET 요청은 로그인 페이지를 보여주는 역할을 하고,
POST 요청은 실제 로그인 정보를 전송하여 로그인을 시도하는 역할을 한다.
UserModel을 사용해서 사용자 불러오기
- 입력받은 username, password가 등록된 유저의 것인지 확인하는 코드
잘 된당!
회원가입 중복방지
# 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)
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')
else:
exist_user = UserModel.objects.filter(username=username)
if exist_user:
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/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(me.username)
else:
return redirect('/login')
elif request.method == 'GET':
return render(request, 'user/signin.html')
뭔가 얼렁뚱땅이긴한데
하다보면 뭐라도 되겠지
GitHub 댓글