글쟁이, 코딩한다

0204 / k_digital 41일차 / 웹프로그래밍(Django) 본문

나는 코딩도 한다/TIL

0204 / k_digital 41일차 / 웹프로그래밍(Django)

Algori 2021. 2. 4. 21:47

0. 

  웹 프로그래밍 중

  

  오늘 한 일 :

   1) Django로 만든 로컬 기반 사이트를 일반 도메인에 공개. Github와 PythonAnywhere를 이용

   2) 두 번째 사이트 만들기. 설문조사 사이트.

 

 

깃Git과 깃허브Github

 

Git
소스코드 저장소 ; 버전 정리가 편리하다

 

온라인 Git 저장소 Github에 작업물을 올리는 과정

 

  1. git bash에서 cd 명령어로 프로젝트 폴더에 접근
  2. git init : 프로젝트 폴더 안에 .git 폴더 생성 # git status : git 상태 확인
  3. git add . : 프로젝트 폴더 안 모든 작업물들을 스테이지 위로 올린다
  4. git commit -m "commit" : 커밋(버전) 등록 ; 로컬 저장소에 등록 ; #권장 커밋 메시지를 확인해보자(명령형, 점 빼기 ... )
  5. git remote add origin 깃허브 URL : 깃허브 URL과 로컬 저장소를 연결
  6. git push -u origin master(main) : 폴더 안 내용들을 깃허브에 저장

아이디만 만들어뒀던 깃헙에 처음 올린 repository. 수업이 끝나는 대로 시간을 내서 여태 작업물을 잘 정돈해 올려야겠다.

어제 만든 Django 로또 사이트 코드

 

Github 용어들

  #branch : 개인 작업 환경. master(main) 브런치에서 일정 부분 떼내어 작업하고 추후 다시 원본으로 합친다.

  #README.md : 내가 올린 repository(project)를 설명하는 markdown 파일
  #.gitignore : 폴더 내 가리고 싶은 파일 설정
  #fork : 원격 저장소를 그대로 복사해 내 저장소에 사본을 만든다

 

  ##개인 작업에서는 로컬이 메인이 되도록! github에서 바로 파일을 올리거나 수정하기보다는 로컬에서 작업한 것을 올리도록 <-> 협업에서는 github 코드가 메인.

 

 

 

 

 

PythonAnywhere

  Django 작업물을 온라인 상에 배포하도록 도와주는 사이트. 용량이 낮은 결과물은 일정 기간 배포가 무료다.

 

 

  작업물 배포 과정

 

  1.  새 프로젝트 만들기 :  web탭 -> Add a new web app -> manual configuration 선택 -> python 3.7 (my version)   ! 링크가 제공
  2.  깃허브와 이어주기 : consoles탭 -> Bash 콘솔 선택-> 초기화 이후 git clone "github url" (github code clone)
  3.  가상환경 구동 : consoles탭 ->(연결)virtyalenv --python=python3.7(내 파이썬 버전) my_env(내 작업 가상환경)->    (구동)source my_env/bin/activate ->(장고 설치) pip install django==version
  4. 작업 폴더로 이동 : consoles탭 -> cd my directory(내 파일)
  5. manage.py 명령어 수행 : 1-collectstatic 2-migrate 3-createsuperuser(이름, 메일, 비밀번호 입력)                       #실제 제대로 올릴 때는 static 폴더, DB 파일을 빼고 올린다. 따라서 makemigration도 진행한다
  6. 배포용 Setting 수정 : files탭 -> 내 작업 폴더로 이동 -> settings.py -> secret_key 변경(임의로 수정) -> DEBUG=True로 -> ALLOWED_HOSTS=['내 계정.pythonanywhere.com']으로 #이 세가지는 Public 배포시 늘 수정해야 한다
  7. 가상환경 연결 : web탭 -> Virtualenv : 로 이동 -> " /home/계정이름/가상환경 이름 " 등록
  8. WSGI 수정 : web탭 -> Code: -> WSGI configuration file: -> wsgi.py를 미리 준비한 코드로 변경
  9. Reload : web-> Reload: -> 아래 초록 버튼 누르기

   => Browser를 열고 (내 계정.pythonanywhere.com)로

실제 도메인으로 배포한 사이트. (테스트 과정에서 입력한 DB 파일이 올라와있다. 제대로 올리자면 DB를 제외한 상태로 올려야 한다)

 

수정작업순서 : local -> github로 push -> anywhere에서 pull

 

# WSGI 수정 코드 :

  장고걸스 튜토리얼: https://tutorial-extensions.djangogirls.org/ko/manual_pythonanywhere_deploy#wsgi

## WSGI : 웹 요청이 들어올때 보안 등을 위해 쓰는 게이트? 파이썬 앱이 웹 서버와 통신하기 위한 수단 : request를 받아들이고 처리해 response를 내보내는 통로 ; 많은 리퀘스트를 한번에 다룰 수 있다, 경로 지정, 스타일 전처리

 

 

 

New Project

설문조사 사이트 생성

  기본적으로 로또 번호 생성 사이트와 같은 프로세스를 거치기에 새로 알아볼만한 부분들만 정리한다.

 

  가상환경 -> 프로젝트 생성 -> 앱 생성 -> setting 조정

  

프로젝트(웹사이트) prsite_2와 앱 poll을 생성한 모습. settings.py 역시 기본 설정값을 바꿔줬다.

1- url 권한 위임
=> 일정 앱 url 뒤에 오는 변화는 모두 해당 앱 폴더에서 감당하도록 위임

 

  apps/ 폴더 뒤에 오는 모든 url은 apps 폴더 내 urls.py가 감당(포함)하도록 한다
      path('apps/', include('apps.urls'))

include 메소드는 url 권한을 하부 앱 폴더의 urls.py에 위임해주는 역할을 한다.

 

2- model(DB) 짜기

 

#DB를 짜기 전에는 어딘가에 직접 구조를 그려보거나 조작하고 해보자

#ForiegnKeys : 다른 테이블 항목을 빌려오기

  ##models.ForeignKey ##(on_delete=models.CASCADE)로 빌려온 테이블 수정도 이어받을 수 있다.(sql ON CASCADE 명령어)

Choice 클래스의 question 메소드를 잘 살펴보자.

 

#python manage.py sqlmigrate 폴더이름 DB이름 ex. apps 0001 : 클래스를 만들때 django가 적용하는 SQL 명령문을 살펴볼 수 있다.

 

3- shell(명령 프롬프트(cmd)에서 Table 확인&생성하기)

 

Shell로 Table 항목 살펴보기
 q = Question(question_text = "What's the best treatment?", pub_date = timezone.now())일 때
  Class.objects.all( ) : 테이블(클래스) 전체 항목 확인

 

객체 생성과 간단한 DB Table 확인. save()를 실행해야 DB 파일에 확정적으로 저장된다.


  Question.objects.get(pk=1) : 테이블에서 pk가 1인 항목 확인
  Question.objects.get(pk=1).column : 테이블에서 pk가 1인 항목의 column 내용 확인 #불러온 내용을 변수에 저장하는 것도 가능 ## 해당 변수로 클래스 내 함수들을 실행해도 좋다
  Question.objects.filter(column__startswith='hey') : startswith 등 필터 연산도 가능하다

 

  Question를 찍어낸 객체 object(q)는 [<Question : Question object (1)>] 형태로 나타난다. 무슨 이야기인지 알아보기가 어려움. 이를 눈에 보이도록 표현하는 것이 str 함수. 클래스에 추가한다.

     

  또 다른 테이블 Choice에 객체 q로 만든 열과 Foreignkey 연결된 항목이 있다.
      이때 q.Choice_set.all( ) 함수를 쓰면 객체 q와 연결된 Choice 항목을 모두 가져온다
      q.Choice_set.create( )로 항목을 생성하기도 한다.

여러가지 명령어 연습

 

 

4-에러 페이지 대응

 

일어날 수 있는 에러들을 모두 한 페이지로 몰아둔다.

 

방법 1.

from django.shortcuts import get_object_or_404

    #제대로 작동하면 문제없이 진행, 에러가 나면 모두 404 에러 페이지로 몰아둔다.

       question = get_object_or_404(Question, pk=question_id)

방법2.

from django.http import Http404
  try:
        question = Question.objects.get(pk=question_id)

  except Question.DoesNotExist:
     raise Http404('question {} does not exist'.format(question_id))
      # raise : 특별한 변화가 없더라도 뒤에 따라오는 에러를 일으킨다. 모두 404 페이지로 모으기

 

detail 메소드의 get_object_or_404를 눈여겨보자. 그 밑의 try문은 raise Http404 활용방법.


#추후 404 에러페이지는 따로 template을 만들어준다. 에러페이지 대응도 웹사이트를 만들 때 중요.

 

5-url 패턴 자동 생성

 

  html 파일 안에서 하드코딩 대신 url 패턴을 집어넣어준다

 

  url은 굉장히 길어지거나 복잡해지기 쉬워서 그대로 집어넣으면 파일이 지저분해지기 쉽다. urls.py에서 전체 도메인 자체를 변수 하나로 받아주고(app_name = 'apps'), html에서 연결할 특정 주소(detail)와 관계('apps:detail')지어준다. 이어 urls.py에서 지정한 변수(detail을 결정해줄 question.id)도 연달아 집어넣어준다.

 

앱 폴더 내 urls.py에서 app_name 지정해주기
html 코드에서 url 패턴을 이용한 모습. 위의 주석 처리한 코드는 하드코딩한 url.

Comments