TIL - 44 westagram - 4

이동근·2021년 2월 6일
0

django

목록 보기
9/12

Mission4

구현할 내용

1. Posting app을 생성해 주세요
django에서는 주로 다루는 데이터의 종류가 달라지는 시점에서 앱을 분리합니다. 인스타그램의 게시물은 이요자 데이터와는 그 성질이 달라 데이터베이스에서 테이블을 따로 관리합니다. 따라서 주로 다루는 테이블이 달라지므로 앱을 분리하는 것이 좋습니다.

2. 게시물 모델을 생성
인스타그램에 게시물을 등록하기 위해서는 사용자, 생성 시간, 이미지 url이 필요합니다.
해당 게시물의 유저는 Foreign Key를 이요하여 이미 서비스에 가입된 사람으로 연결시켜 주세요

3. 게시물 뷰를 작성해 주세요

3-1. 게시물 등록

  • 게시물 등록 클래스를 생성해 주세요
  • 게시물을 등록할때에는 POST 메소드를 사용해야 합니다.
  • 게시물 생성 시간은 등록하는 현재 시간이어야 합니다.

3-2. 게시물 표출

  • 등록된 모든 게시물을 나열하는 게시물 표출 클래스를 생성해 주세요
  • 게시물을 나타낼 때에는 get메소드를 사용합니다.
  • 게시물을 나타낼 때에는 등록한 사람, 게시된 내용, 게시된 시각이 포함되어야 합니다.

코드 구현

User의 데이터를 관리하는 User APP에 추가로 게시물의 Posting을 관리하기 위해 app을 추가했다.
추가할때는(기억!!)

python3 manage.py startapp Posting(추가하고자 하는 앱의 이름)

앱이 두 개가 되니까 tree가 엄청 길어지게 되었다. Userapp을 처음 만들었을때 처럼 Posting앱역시init, models, view가 자동으로 생겼다.

models.py 설정


인스타그램에 게시물을 등록하기 위해서는 사용자, 생성 시간, 이미지, url가 필요합니다.
그래서 사용자, 생성시간, 이미지_url을 column으로 정했습니다.

  • create_at : 게시물을 등록하는 시간이 되야하니까 'DateTimeField'를 사용한 후, 두 가지의 속중에 선택해야 한다.(auto_now_add, auto_add)
    • auto_now_add : django model 이 최초 저장시에만 현재날짜를 입력합니다.(data.today())
    • auto_ add : django model이 save 할때 마다 현재날짜(data.today())로 갱신됩니다.

(auto_now_add 가 맞는 것 같아서 수정하겠습니다.!!!!ㅎㅎ)

  • image_url : image의 url의 데이터가 들어가야 하는 부분입니다.
    (url 전용 model 필드인 'EmailField'도 따로 있으니까 사용하셔도 됩니다.)

  • user_ID : 이 models.py에서 가장 hilight 부분입니다. 이 user는 다른 앱 즉 다른 테이블의 내용을 import 해야 합니다. Foreignkey를 설정해 주기 위해서, 경로설정을 User.userinfo를 통해 해주어야 합니다.

이제 db구현도 완성된 것 같으니, makemigrations 와 migrate 해주면 된다.

usls.py 설정

추가적으로 앱을 만들었니까 project인 'westagram'의 setting에 Posting을 추가해준다. 그리고 User 밑에 Posting이 들어가 있다.(매우 중요하니까 기억하자)

브라우저에서 보낸 request를 각 app으로 보내기 위해서 메인 urls.py 인 westagram/urls.py에 path를 사용해서 경로 설정을 해준다.

처음 app을 생성하게 되면 urls.py는 존재하지 않는다. 그래서 urls.py 를 만들어 줘야 하는데 urls.py 빈문서를 만들어서 연결하는 방법과, main urls.py를 복사해 오는 방법이다.

복사하는 방법

cp '복사할파일이있는위치'/'복사할파일' '파일을 복사할 장소'
ex) cp westagram/urls.py Posting

여기서 cp가 copy를 줄인 말이다.
위의 사진은 연결을 모두 마친 모습이다. django flow상에서 보면 urlconfig에서 받은 request는 view(views.py)로 보내지기 때문에 app에 있는 urls.py에서 view로 연결 해줘야 한다. 그래서 form, import를 사용해서 연결을 해준다.
ursl.py와 model.py와 같은 동일 선상에 있기 때문에 '.views' 로 from 해주고 views.py 안에 있는 게시물 등록과, 게시물 표출 하는 class를 import를 해준다. 그리고 urlpatterns를 통해 연결을 시켜 준다.

path : 쉽게 말해서 길을 설정해주기 위해서 사용하는 path그리고 위의 사진westagram/urls.py 에서 보이듯이 path('user',..)해놨습니다. 여기서 쉽게 말해서 user는 westagram/urls.py의 경로를 'user' 라고 정해줬다고 생각 하면쉽다. browser에서 들어온 request를 westagram/urls.py를 지나 각 앱의 urls.py로 들어왔을 때 연결된 views.py에서 기능을 구현시키기 위해 각각 이름을 지어주는데 게시물을 포스팅하는 View를 구현하기위해서 경로를 post로 지정해준 것이다. 그리고 중요한 것은 '/'의 위치이다.

각 경로는 '/'로 연결을 하는데 posting등록의 view인 ContentSignupView로 설정을 위해서는 'user/post'형식으로 이어져야한다. 그래서 main urls.py에 '/'를 적어주게 되면 app에 있는 에는 없어야지, 'user/post' 이런식으로 이어진다.

'post/' 이런식으로 / 를 뒤에 넣어주게 되면 하위 디렉토리 개념으로 이해하기때문에 '/'를 뒤에 적어주면 안된다.

as_view(중계 메소드)

path를 보게 되면 views.py 에서 구현된 class 뒤에 as_view()라는 코드가 추가 되어 있는 것을 볼 수 있을 것이다.

as_view 함수는 클래스의 인스턴스를 생성하고 인스턴스의 dispath() 메소드를 호출한다. dispath() 메소드는 요청을 검사해서 GET < POST 등의 어떤 HTTP 메소드로 요청되었는지 알아낸 다음, 인스턴스 내에서 해당 이름을 갖는 메소드로 요청을 중계해줍니다. -> 만약 메소드가 정의되어있지 않는다면 'HttpResponseNotAllowed' 오류가 발생합니다.

django에 내장되어 있는 view 클래스에는 as_View(), 와 dispath()메소드가 정의되어 있다.

View 장고 공식문서
https://docs.djangoproject.com/en/3.1/ref/class-based-views/base/#django.views.generic.base.View.dispatch

diapatch : view요청의 일부 request 인수와 인수를 받아들이고 Http 응답을 반환하는 메소드

연결을 완료했으므로 Views.py를 구성하면 된다.

Views.py

Mission2 View를 했던 것 처럼

  • 파이선 내장함수 json을 import 해주고![]
  • django 내장 클래스 http를 불러오고 HttpResponse, JsonResponse를 해준다.
  • Posting/models 의 class 'UserPosting'을 임포트 해준다.

이 부분을 이해하기 위해서는 settings.py의 'INSTALLED_APP'을 봐야한다.

여기서 보면 'User'앱과, 'Posting'이 되어있는 것을 볼수 있다.
django는 앱을 인식할때 순서대로 인식한다.

이 내용을 Circular import dependencies 라고 한다.

django는 settings.py 안에 있는 INSTALLED_APPS 라는 배열에 있는 app들을 위에서 부터 순서대로 정의한다. 그래서 순서대로 User, Posting 순서로 app을 정의하게 된다.라고 합니다. (이 내용은 더욱 공부할 필요가 있는 것 같습니다.!!)

무튼그래서 from User.models import Userinfo 를 해줌으로써, 다른 앱에 있는 models.py를 임포트 했다. 이제 View를 짤 준비가 완료되었다.

Views에서 구현해야할 내용은 게시물 등록과 가져오는 것을 할 것이다.

게시물 등록

  • 게시물 등록 클래스를 생성해 주세요
  • 게시물을 등록할 때에는 post 메소드를 사용해야 합니다.
  • 게시물 생성 시간은 등록하는 현재 시간이어야 합니다.

CountSignupView라는 이름을 사용해서 만들었습니다.
등록한 게시물에 대해서 db에 저장하기 때문에 post를 사용했습니다
Mission2, 3에서 구현 했던 내용과 별로 다를 것이 없지만 다른 앱의 내용을 import 를 하는 것이 가장 중요했던것 같습니다. if 구문을 사용해서 Userinfo.objects.filter를 사용해서 받은 이름이 db에 존재하는지 존재여부를 확인한 뒤 그 이름이 있을때 create를 해주는 형식으로 만들었다.

게시물 표출

등록된 모든 게시물을 나열하는 게시물을 표출 클래스를 생성해 주세요
게시물을 나타낼때에는 get메소드를 사용하면 됩니다.
게시물을 나타낼때에는 등록한 사람, 게시물, 게시된 내용, 게시된 시각이 포함되어야 합니다.


게시물을 가져와서 표출 해주는 것이기 때문에 get을 썼습니다.
평소에는 all()을 사용해서 list_comprehension을 사용해서 만들었지만 인터넷을 찾아보니 values()의 dictionary형태로 받아서 list()를 씌워주는 방법을 발견해서 사용했습니다. 단순히 db에 있는 내용을 가져오는 코드를 구현하면 되는 것이기 때문에 굳이 다른 조건을 추가할 필요가 없었습니다.

profile
하루하루 1cm 자라는 개발자

0개의 댓글