23.4.5 Django 1-2주차 복습 및 정리

HS L·2023년 4월 5일
0

정리

목록 보기
2/7

Django 1-2주차 강의내용 복습 및 정리

1-10. 파일별 기능

settings - 장고 프로젝트 전체의 환경설정
urls - 장고 프로젝트 전체의 api를 담당(url주소 생성 및 관리)

1-11. 프로젝트 생성 후 실행

- WinError 10013시 해결방법
[WinError 10013](https://velog.io/@hyeon5819/23.4.3-TIL)

프로젝트 폴더 내에 views.py생성

- views.py에서 보여지는 것들 작업진행
- templates 에 생성한 html을 보여주기 위해서 views.py에 from django.shortcuts import render 를 import한 후 html파일을 render해주는 함수를 생성한다
- urls.py에서 html이 띄워지는 url을 생성한다.
- ex) path('first/',views.first_view,name='first_view'),
			url			파일명.함수이름

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

- 터미널에 'django-admin startapp 폴더명' 입력시 폴더 생성(app생성)
- 생성한 app을 프로젝트가 읽어올 수 있도록 settings.py에 추가
- settings.py의 INSTALLED_APPS에 폴더명 추가
- 기존 있던건 장고의 기본 기능들

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

1. 데이터베이스 연결

오른쪽 데이터베이스에서 + 클릭 > 경로 데이터소스 > 같은경로에 있는 db.sqlite3 선택 >
> SQLite 드라이버 선택 > 드라이버가 없는 경우 아래 알림표시에 있는 다운로드 > 연결 Test 
> 적용 후 확인

2. ORM이란? (클래스 -> 데이터베이스로 적용하는 것)

ORM(Object Relational Mapping)은 데이터베이스를 하나의 '객체(Object)'덩어리로 보고, 데이터베이스를 SQL언어가 아닌 클래스로 쉽게 표현 및 사용 할 수 있게 해준다.
- 기본적으로 user모델로 사용자의 관리와 로그인/로그아웃, 회원가입 장고에 다 구현이 돼있다.

기본 구성된 django 사용 전 직접 만들어보기

- user model에 필요한 것 (이름, 비밀번호, 상태메세지, 생성일, 수정일 등)
- user app > models.py에 생성
- 클래스 생성 ex) class UserModel(models.Model)
         
#user/models.py
from django.db import models

# Create your models here.
class UserModel(models.Model): 
    class Meta:                   ------> #데이터베이스에 정보를 넣어주는 역할
        db_table = "my_user"				db_table에 이름을 지정

    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)         #수정일
    #models.뒤에 있는 것들은 데이터베이스에 어떤 형태로 들어가게 되는지 설정해준다.
        -문자열 : CharField, TextField
		-날짜/시간: DateTimeField, DateField, TimeField
		-숫자 : IntegerField, FloatField
		-다른 테이블과 연관을 지어 줄 때 : ForeignKey
- 모델을 만들고난 후 데이터베이스에 알려줘야함
- 데이터베이스 변경을 알려준다
	--"데이터베이스 만들었어~, 데이터베이스에 넣을 클래스 하나 만들었어~, 이런 모델을 만들었어~"
데이터베이스 변경을 알려주는 명령어
	python manage.py makemigrations
- 변경된 데이터베이스를 반영해준다
	--"그 알려준 내용들을 데이터베이스에 적용시켜줘~"
변경된 데이터베이스를 반영 해 주는 명령어
	python manage.py migrate
- my_user가 데이터베이스에 생성됨
            

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

관리자 페이지를 직접 만들어주는 기능
연결되어 있는 데이터베이스의 데이터 수정, 추가, 삭제 가능
http://127.0.0.1:8080/admin

1. admin 계정 생성

admin페이지에 접근할 수 있는 superuser생성
super user를 생성하는 명령어
	python manage.py createsuperuser
입력한 Username, password입력 로그인

2. admin 페이지에 Usermodel등록하기

- user app > admin.py
from django.contrib import admin
from .models import UserModel -그 중 UserModel을 불러오겠다.
	└현재 경로와 같은 위치의 models.py를 불러오겠다. // '.' = '현재경로와 같은 위치의'

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

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

1. tweet모델 만들기

tweet app > 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)
    content = models.CharField(max_length=256)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
- makemigrations, migrate 입력해주기
- tweet가 데이터베이스에 생성됨

2. admin 페이지에 TweetModel등록하기

- tweet > admin.py
from django.contrib import admin
from .models import TweetModel

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

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

회원가입, 로그인 화면 띄우기

1. 템플릿 만들기

기본 베이스 html과 user관련 기능인 로그인/회원가입 html(user폴더로 묶어줄 예정)을 templates폴더 안에 만들어준다.

django 템플릿 문법 - html문법

html에서 {% %}을 사용

ex) {% extends 'base.html' %} -> base.html파일에 이어서 작성한다
공식문서

- 중복해서 html을 계속 작성하지 않아도 되도록 html파일을 이어서 작성할 수 있도록 도와준다.
- html에 파이썬의 기능들을 추가해줄 수 있도록 도와준다.

2. url - view - template 이어주기

그림으로 이해하기
1. 사용자가 url요청 -> 브라우저에서 url입력
2. mySpartaSns에 요청 접수 -> settings.py가 있는 가장 처음 작성한 앱의 urls.py(이하 1url)
3. 등록된 url찾기 -> urls.py(1url)에 연결 된 앱에 생성 한 urls.py(이하 2url)
4. 해당 url(2url에 해당되는)에 등록 된 view 찾기

1. url을 연결할 app에 urls.py(2url)생성

2. urls.py(2url↔1url)연결해주기

- mySpartaSns > urls.py(1url)
- from django.urls import path에 ', include' 추가
- urlpatterns에 include를 사용하여 user.urls추가
	--path('',include('app.urls')) -> app의 urls.py를 포함시킨다.
			┕공백

3. app의 urls.py에 연결할 views.py 작성하기

(user app 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의 signin.html을

4. 작성한 views.py를 urls.py에 연결하기

(user app 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'),
    		┕url		┕views.py의 sign_in_view 실행
]

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

동일한 url에서 여러 동작들이 실행되기 때문에 'GET'과 'POST'에 따라 기능들을 나눠줘야함
ex) 회원가입 페이지 띄워주기 -> GET방식
	가입정보 입력/전송 -> POST방식

1. user의 views.py sign_up_view에 'GET', 'POST' 구분/ 추가하기

- sing_up_view와 연결된 templates > singup.html에서 들어오는 방식에 따라 구분
from django.shortcuts import render, redirect -> 마지막 회원가입 완료시 로그인화면을 띄워주기 위해 ', redirect'을 추가한다.
from .models import UserModel -> POST방식으로 들어온 데이터를 저장해줘야하기때문에 import해준다.

def sign_up_view(request):
    if request.method == 'GET':
        return render(request, 'user/signup.html')
    elif request.method == 'POST':		┌**signup.html의 input의 name과 맞춰줘야함
        username = request.POST.get('username',None)		#POST방식으로 들어온 데이터중에서
        password = request.POST.get('password', None)		username, password, password2, bio
        password2 = request.POST.get('password2', None)		를 받을거다. 만약 없다면 None으로 설정해준다.
        bio = request.POST.get('bio', None)

        if password != password2:							#만약 password, password2가 같지 않다면
            return render(request, 'user/signup.html')		signup페이지를 다시 띄워준다.
        
        else:												#그게 아니면(=password, password2가 같다면)
            new_user = UserModel()							new_user라는 UserModel을 만들어준다.
            new_user.username = username					해당하는 데이터들을 가진
            new_user.password = password
            new_user.bio = bio
            new_user.save()									***데이터베이스에 저장

        return redirect('/sign-in')							#회원가입이 완료된 후 로그인 페이지 띄워주기

2. signup.html수정

- POST요청으로 회원가입 정보를 보낼 form박스를 수정해준다.
- input의 name값이 post로 보내질 내용들이다.

POST사용시 보안 토큰 생성

{% csrf_token %}

장고에서 데이터를 post방식으로 보낼 때 보안을 지켜주기 위해서 적어주는 기능
from 아래에 보안토큰 코드를 넣어준다.
<form class="form-area" method="post" action="/sign-up/">
{% csrf_token %}

form태그

화면에 있는 데이터를 서버로 전송할때 많이 사용되는 태그 
<form class="form-area" method="post" action="/sign-up/">
								┕통신방법 지정	┕url 지정(**뒤에 /가 없으면 오류남**)

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

session(세션)

- 서버와 클라이언트 사이에서 '요청'과 '응답'을 한다. 그 때 같은 사람이 요청을 하는지 확인할 수 있도록 도와주는 역할.
	-- '세션'은 '사용자의 정보'를 저장 할 수 있다.

1. user app의 views.py sign_in_view 내용 수정

from django.shortcuts import render, redirect
from .models import UserModel
from django.http import HttpResponse -> 로그인이 성공한다면 로그인 성공이라는 메세지 출력을 위해 추가한다.

def sign_in_view(request):
    if request.method == 'POST':
        username = request.POST.get('username',None)
        password = request.POST.get('password',None)

					┌UserModel.objects = 이미 데이터베이스에 연결돼있는 객체
        me = UserModel.objects.get(username=username)
			.get = 중에서 가져온다┘	└앞의 username은 UserModel의 데이터에 있는 username / 뒤의 username은 POST로 받아 온 데이터
        └>> # UserModel에 있는 username들 중에서 POST로 받아온 username과 같은 user를 me로 가져오겠다.
            
        if me.password == password:						#불러온 me의 password값이랑 입력된 password값이랑 같다면
            request.session['user'] = me.username		#session(사용자 정보를 저장할 수 있는 공간)에 user(me.username)를 넣는다.
            return HttpResponse('로그인 성공!')
        else:
            return redirect('/sign-in')

    elif request.method == 'GET':
        return render(request, 'user/signin.html')

2. signin.html수정

- POST요청으로 로그인 정보를 보낼 form박스를 수정해준다.
- input의 name값이 post로 보내질 내용들이다.

POST사용시 보안 토큰 생성

{% csrf_token %}

장고에서 데이터를 post방식으로 보낼 때 보안을 지켜주기 위해서 적어주는 기능
from 아래에 보안토큰 코드를 넣어준다.
<form class="form-area" action="/sign-in/" method="post">
{% csrf_token %}

form태그

화면에 있는 데이터를 서버로 전송할때 많이 사용되는 태그 
												┌통신방법 지정
<form class="form-area" action="/sign-in/" method="post">  ->  <>내부의 action, method 순서는 상관없음
									┕url 지정(**뒤에 /가 없으면 오류남**)
profile
식이

0개의 댓글