Today I Learned
장고 프로젝트 4주차까지 완강하고 프로젝트 진행 중인 상태!
어제 TIL 쓰고 새벽까지 개념을 익혀서 그런지 졸리긴 한데 어제보다 익숙해진 것 같다.
장고 프로젝트 공부하다 보니 익힌 개념들
(나중에 제대로 정리해서 포스팅해야겠다..)
*렌더링(Rendering)이란, Django에서 View에서 처리된 결과를 HTML,XML,JSON형태로 변환하여 클라이언트에게 보여주는 것을 의미, View에서 전달받은 데이터를 템플릿을 통해 HTML형태로 변환하여 클라이언트에게 보여줌
*Redirect란, View에서 처리된 결과를 다른 URL로 이동시키는 것
사용자가 입력한 데이터를 처리한 후, 다른 URL로 이동시켜 결과를 보여준다.
이 때, 이동한 URL을 redirect()함수에 인자로 전달하여 처리한다.
*세션(Session)은 웹 서버와 브라우저 사이의 연결을 유지시키는 기술 중 하나로, 세션은 서버측에서 관리되며 클라이언트가 서버에 요청(request)를 보내면 서버는 그 요청을 바당서 클라이언트에 대한 정보를 저장하고, 클라이언트에게 고유한 세션 ID를 부여한다. 그리고 서버는 클라이언트에게 해당 세션 ID를 쿠키나 URL 매개변수로 보내주어 클라이언트 측에서도 이를 저장한다.
- 장고에 migrations는 데이터베이스 스키마를 변경할 때 사용하며, migrations는 모델 변경 사항을 추적, 데이터 베이스 스키마를 수정하는 데 필요한 SQL 명령어를 생성한다.
- migrate는 migrations에서 생성된 SQL명령어를 데이터베이스에 적용하는 작업 수행
=> 따라서 모델의 변경사항이 있을 때마다, 새로운 마이그레이션을 생성하고 migrate 명령어를 실행하여 데이터베이스 스키마를 수정하는 작업을 수행해야 한다.
- 장고 URL 패턴 매칭 시, urlpatterns 리스트에서 패턴이 선언된 순서대로 매칭이 이루어진다.
따라서, urlpatterns 리스트에서 패턴이 정의된 순서는 매칭 결과에 영향을 미치므로, 고려하여 패턴을 선언하도록 한다.
-@login_required는 로그인 하지 않으면 접근이 불가능 하게 만드는 기능이고, request.user.is_authenticated는 로그인의 여부만 검증 해 주는 기능이다! 두 기능이 비슷하기 때문에 잘 구분해야한다.
@login_required
def detail_tweet(request, id):
my_tweet = TweetModel.objects.get(id=id)
tweet_comment = TweetComment.objects.filter(tweet_id=id).order_by('-created_at')
return render(request, 'tweet/tweet_detail.html', {'tweet':my_tweet, 'comment':tweet_comment})
****여기서 tweet_id = id 라는 표현은
TweetComment 모델의 tweet 필드는 TweetModel 모델의 인스턴스를 참조하는 외래 키(ForeignKey).
ForeignKey 필드의 값은 참조하는 모델의 primary key 값이다. tweet_comment에서 tweet_id를 사용하는 이유는 TweetComment 모델에서 TweetModel을 참조하는 필드명이 tweet이기 때문에 참조하는 모델의 primarykey인 id를 가져올 때 tweet_id로 명시적으로 지정하기 위함
따라서 TweetComment.objects.filter(tweet_id=id)에서 id는 TweetModel 모델의 primary key값을 의미하며, 해당 id 값을 가진 TweetModel 모델의 모든 TweetComment 객체를 가져오게 된다.
- 장고 템플릿 언어
{% %} : 템플릿 언어의 태그, 파이썬 코드 실행/반복문/조건문등의 제어문 처리
{{ }} : 변수 출력하기 위한 템플릿 언어의 변수
- request.user.is_authenticated
: 요청을 보낸 사용자가 로그인 되어 있는 사용자가 맞는 지 확인하는 함수
- 장고 ORM Model은 테이블끼리 관계를 가진다.
데이터베이스 관계
(1) one-to-many
(2) one-to-one
(3) many-to-many
from django.contrib import auth
장고의 인증(authentication) 시스템과 관련된 모듈을 가져오는 것
'auth'모듈에는 로그인, 로그아웃, 사용자 인증 같은 기능을 구현하는 클래스나 함수가 포함되어 있다.
from django.contrib.auth import get_user_model
장고에서 기본 제공하는 User모델이 아닌, 개발자가 직접 커스텀한 User모델을 사용하기 위해
get_user_model()함수를 가져오는 것
get_user_model()함수는 'AUTH_USER_MODEL'설정에 지정된 User모델 클래스를 반환한다.
<프로젝트 공부하면서 만났던 오류들>
1. 프로젝트 구조를 나누어
user앱 / tweet앱을 만들었다.
$ django-admin startapp user
$ django-admin startapp tweet
문제는 이 명령어를 입력할 때에
파일 경로를 제대로 확인하지 않고 명령어를 입력했다.
많은 에러 메세지가 출력되고 마지막쯤에
ModuleNotFoundError: No module named 'tweet'
라는 문구를 확인했다.
경로를 장고프로젝트 폴더가 있는 곳으로 이동 시키고 난 후 실행하니 제대로 잘 동작했다.
-> runserver를 실행할 때 처럼 경로를 잘 확인하는 것을 기억하기.
2. 들여쓰기 또한 주의
탭과 스페이스를 혼용하니 Indentation Error가 떴다
스페이스 4칸을 권장하는 파이썬에서는 스페이스 사용을 하장
3.
# tweet/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'), # localhost:8000 과 views.py 폴더의 home 함수 연결
path('tweet/', views.tweet, name='tweet') # localhost:8000/tweet 과 views.py 폴더의 tweet 함수 연결
]
# Create your views here.
def home(request):
user = request.user.is_authenticated # 사용자가 인증을 받았는지 (로그인이 되어있는지)
if user:
return redirect('/tweet')
else:ERHJYUI89
return redirect('/sign-in')
def tweet(request):
if request.method == 'GET':
return render(request, 'tweet/home.html')
이렇게 코드가 작성된 상태에서
서버를 껐다가 켜도 자동으로 tweet 경로로 이동이 된다.로그인 하지 않은 상태라서 /sign-in 페이지가 뜰 줄 알았는데
찾아보니 브라우저의 캐시 기능 때문에 /tweet 경로에 접속한 적이 있고,그 때 로그인 된 상태였다면, 서버를 껐다켜도 캐시 정보를 이용하여 자동으로 /tweet 경로로 이동할 수도 있다고 해서캐시를 삭제 해보았다.
캐시 삭제를 하고 서버를 껐다가 켜니 /sign-in페이지가 잘 뜬다! 해결 완료!
-> 시크릿 모드를 이용하는 것도 방법
'내일배움캠프 > 내일배움캠프 TIL' 카테고리의 다른 글
내일배움캠프 TIL 20일차 (0) | 2023.04.07 |
---|---|
내일배움캠프 AI 5기 TIL 19일차 (0) | 2023.04.06 |
내일배움캠프 AI 5기 TIL 17일차 (2) | 2023.04.04 |
내일배움캠프 AI 5기 TIL 16일차 (0) | 2023.04.03 |
내일배움캠프 AI 5기 TIL 15일차 (0) | 2023.03.31 |