[ TIL 05/26 ] Django 기본 구조, 로직, 회원가입

JoonQpa·2022년 5월 27일
0
  • 🔍프로젝트 구조

  • 🔍로그인 회원가입 기능 구현

📌프로젝트 구조 만들기

  • 장고 기본 로직
  • 사용할 app 만들기
$ django-admin startapp user
$ django-admin startapp tweet
  • 프로젝트 세팅하기

추가한 앱들을 장고가 인식할 수 있도록 settting.py의 INSTALLED_APPS에 추가해준다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'tweet',
    'user',
]

📌데이터베이스와 ORM

  • 장고 실행하기

장고를 한번이라도 실행하면, DATABASES의 정보를 가지고와서 데이터베이스와 자동으로 연동을 하기때문에 실행해준다.

  • db.sqlite3이 생성되었는지 확인

  • 우측 상단의 Database 탭에서 db.sqlite3로 path를 설정해준다

⭐ORM

ORM(Object Relational Mapping)은 db를 하나의 object로 보고, 클래스로 쉽게 표현 및 사용 할 수 있게 해준다.

class myBakery:
    bread_type = ''  # 빵의 종류
    bake_time = ''  # 굽는 시간
    price = 0  # 가격

# 위와 같이 클래스를 이용하여 db구조설계 가능

📌User Model 만들기

  • user appmodels.py를 만들어 준다.
#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)
  • ⭐만든 모델 데이터 베이스에 넣기

db 변경을 알려주는 명령어 makemigrations

python manage.py makemigrations

변경 된 db를 적용 시켜주는 migrate

python mangage.py migrate
# 하단에 user.--- 이 나오면 모델이 적용되었다는 뜻

📌Admin 사용해보기

  • createsuperuser 만들기
python manage.py createsuperuser
  • admin에 model 등록하기
    user/admin.py 에 추가
from django.contrib import admin
from .models import UserModel

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

📌Django의 MVT패턴

  • user/urls.py 만들기
# <프로젝트이름>/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('user.urls'))
    # user의 usrls.py 연결
]
  • user/views.pyuser/urls.py에 연결하기
# user/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('sign-up/', views.sign_up_view, name='sign-up'),
    # url 설정, views 함수 연결
    path('sign-in/', views.sign_in_view, name='sign-in'),
]
  • user/views.py 에 html 연결하기
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/views.py 에 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 ""
  • html에서 form태그 설정
<!-- 윗 부분 생략 -->
<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 type="submit" class="btn btn-primary">회원가입</button> 버튼은, form태그methodaction에 데이터를 보내주는 역할

{% csrf_token %} 은, Django에서 post 할 때에 보안을 위해서 사용

signup.html<input>태그들의 id,name들(username,password,password2,bio) 숙지

위 정보들은 user/views.py 의 sign_up_views()함수로 들어가게 됨

  • user/views.py에서 데이터 받아서 저장하기
# 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:
            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
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')
  • signin.html form만들기
<!-- 윗부분 생략 -->
<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">
<!-- 아랫 부분 생략 -->
  • 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)

        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')
profile
Intuition factory: from noob to pro

0개의 댓글