파이썬 웹 프로그래밍

파이썬 웹 프로그래밍: Django의 핵심 기능

MoonGa 2023. 2. 3. 23:01

4.1 Admin 사이트 꾸미기

  • 장고의 admin 기능:
    • 쉬운 데이터 관리 --> 데이터의 C.R.U.D기능(create, read, update, delete)
    • 정돈된 UI
  • admin 사이트 템플릿 수정:
    • 프로젝트 내에 templates 디렉토리를 새로 생성, 이 디렉토리에 admin템플릿 파일을 복사함.
    • 새로 생성한 디렉토리는 개별 애플리케이션에서 사용되는 템플릿이 아닌, 프로젝트 전체의 룩앤필에 영향을 주고, 공통적으로 사용되는 템플릿을 담는 프로젝트 템플릿 디렉토리가됨.
    • 템플릿 디렉토리를 settings.py에 등록해야 장고가 찾을 수 있음.

4.2 장고 파이썬 셸로 데이터 조작하기

  • 장고는 파이썬 셸을 이용하여 데이터 관리할 수 있는 API를 제공함.
  • 파이썬 셸 데이터 처리는 복잡한 조건 검색 가능.
  • 클래스의 객체를 생성하는 것 = 테이블의 레코드를 생성하는 것
  • 셸의 데이터 처리 기능 = Create, Read, Update, Delete
  • Create(데이터 생성/입력):
    • 필드값을 지정하여 객체 생성 후, save() 메소드를 호출해야함. --> 변경사항 DB에 반영.
  • Read(데이터 조회):
    • 데이터 조회를 위해선 QuerySet객체(=DB테이블로부터 꺼내온 객체들의 컬렉션)를 사용해야함.
    • Queryset은 필터를 이용해서 Queryset내의 항목 중에서 조건에 맞는 레코드만 다시 추출함
    • SQL문으로 Queryset은 SELECT에 해당되고, 필터는 WHERE절에 해당됨.
    • >>> Question.objects.all()      // 테이블에서 모든 Question객체를 담고 있는 Queryset컬렉션 반환.
    •  filter(): 조건에 맞는 객체를 담고있는 queryset의 컬렉션 반환, exclude(): 조건에 맞는 객체르 제외하고 반환
  • Update(데이터 수정):
    • 필드값 수정 후, save()메소드 호출하면됨.
  • Delete(데이터 삭제)
  • 파이썬 셸 실습:
    • Question과 Choice는 1:N관계 --> 장고는 Choice_set API를 제공함.
    • 즉, Choice --> Question 방향에는 question 속성 제공, Question --> Choice 방향에는 choice_set속성 제공
    • >>> q.choice_set.all() = 관련 레코드 전부 출력
    • 언더바 2개 __ 로 객체 간 관계 표현 가능.
    • 장고 파이썬 셸 장점: SQL 쿼리 문장을 사용하지 않고 DB처리가능.

4.3 템플릿 시스템

  • randering? 템플릿 코드를 템플릿 파일(ex> HTML,XML,JSON)로 해석하는 과정
  • 템플릿 변수: {{ variable }}
  • 템플릿 필터: |사용
    • {{ name|lower }} --> name 변수값의 모든 문자를 소문자로 바꿔주는 필터임.
  • 템플릿 태그: {% tag %}
    • {% for %}: 리스트에 있는 항목들을 순회하면서 출력함.
    • {% if %}: 변수가 True면, 다음문장이 표시됨, boolean연산자 사용 가능.
    • {% csrf_token %}:
      • POST방식의 <form>을 사용하는 템플릿 코드에서는 CSRF공격을 방지하기 위해 해당 태그 사용.
      • 이 태그를 통해서 위조된 폼 요청인지 판별가능.
      • CSRF토큰이 유출될 수도 있기에 외부 URL로 보내는 <form>에는 사용금지.
    • {% url %}: URLconf를 참조하여 적합한 URL을 만듦
    • {% with %}: 특정 값을 변수에 저장함.
    • {% load %}: 사용자 정의 태그 & 필터를 로딩함.
  • 템플릿 상속: 
    • 템플릿 상속을 이용해서 템플릿 코드 재사용 가능
    • 템플릿 상속 단계:
      1. 사이트 전체의 룩앤필을 담고있는 base.html을 만듦.
      2. 사이트 하위의 섹션별 스타일을 담고 있는 base_news.html, base_sports.html등의 템플릿을 만듦(2단계 템플릿들은 1단계의 base.html에 의해 상속을 받음)
      3. 개별 페이지에 대한 템플릿을 만듦.

4.4 폼 처리하기

  • html에서의 폼:
    • 웹 개발 시, 사용자로부터 입력을 받기 위해 폼을 사용함.
    • HTTP 프로토콜 중 폼에서 사용할 수 있는 메소드는 GET,POST
    • 장고는 폼의 데이터 전송 시, POST사용.
    • POST: 서버 시스템의 상태를 바꾸는 요청(ex> DB의 내용을 변경하는 요청)
    • ※ GET: 시스템의 상태를 바꾸지 않는 요청, 검색폼
    • CSRF : 장고가 보안을 강화하기 위해 제공하는 기능
  • 장고의 폼 기능:
    • 폼 생성에 필요한 데이터를 폼 클래스로 구조화하기
    • 폼 클래스의 데이터를 렌더링하여 HTML 폼 만들기
    • 사용자로부터 제출된 폼과 데이터를 수신하고 처리하기
    • 모델 클래스의 필드가 DB의 필드로 매핑되는거처럼, 폼 클래스의 필드도 HTML폼의 <input> 엘리먼트에 매핑됨.
    • 객체 렌더링 시, 3가지 과정
      1. 렌더링할 객체를 뷰로 가져오기(ex> DB로부터 객체를 추출하기)
      2. 해당 객체를 템플릿 시스템으로 넘겨주기
      3. 템플릿 문법을 처리해서 HTML 마크업 언어로 변환하기
  • 폼 클래스로 폼 생성:
    • 폼도 클래스로 정의해서 간단하게 만들 수 있음.
    • 사용자의 이름을 취득하기 위한 템플릿: POST로 브라우저에게 폼 데이터를 URL /your-name/으로 보내달라고 요청.
      • {{ current_name }} 템플릿 변수는 템플릿 렌더링을 요청하는 뷰에서 그 변수값을 지정해줌.
<form action="/your-name/" method="post">
    <label for="your_name">Your name: </label>
    <input id="your_name" type="text" name="your_name" value="{{ current_name }}">
    <input type="submit" value="OK">
</form>
  • 뷰에서 폼 클래스 처리:
    • 폼을 처리하는 뷰는 2개가 필요함. = 폼을 보여주는 뷰, 제출된 폼을 처리하는 뷰 = 장고에서는 하나의 뷰로 통합하여 처리
    • 하나의 뷰에서 2가지 기능 처리를 위해선, 처음 사용자에게 보여주는 폼과 사용자가 데이터를 입력한 후 제출된 폼을 구분하여 처리할 수 있어야함. = http 메소드로 구분함

 

4.5 클래스형 뷰

  • 뷰를 함수, 클래스로 작성할 수 있음.
  • 클래스형 뷰의 장점:
    • 상속과 믹스인 기능을 사용해서 코드를 재사용할 수 있음.
    • 뷰를 체계적으로 구성할 수 있음.
    • 제네릭뷰도 클래스형 뷰로 작성되어 있음.
  • 클래스형 뷰의 시작점:
    • URLconf에서 함수형 뷰가 아닌 클래스형 뷰를 사용한다는 점을 표시해줘야함.
    • as_view(): 클래스형 뷰의 진입 메소드
      • 클래스의 인스턴스를 생성, 그 인스턴스의 dispatch() 메소드를 호출함.
      • dispatch()메소드: 요청을 검사해서 어떤 HTTP메소드(GET, POST...)로 요청되었는지 확인 후에, 인스턴스 내에서 해당 이름을 갖는 메소드로 요청을 중재해줌. --> 해당 메소드가 정의되어 있지 않을 경우 HTTPResponseNotAllowed 익셉션을 발생시킴.
      • 즉, MyView클래스는 View클래스를 상속받고, View클래스에는 as_view(), dispatch() 메소드가 정의되어있음.
  • 클래스형 뷰의 장점:
    • HTTP 메소드(POST)에 따른 처리 기능을 코딩할 때, IF함수를 사용하지 않고 메소드명으로 구분가능 --> 코드구조가 깔끔해짐
    • 다중 상속과 같은 객체 지향 기술이 가능해서, 클래스형 제네릭뷰 및 믹스인 클래스 사용가능 --> 코드의 재사용성,생산성 높임.
    • HTTP 메소드에 따른 처리 로직 구분:
      • 클래스형 뷰에서는 HTTP메소드 이름으로 클래스 내에 메소드를 정의하면됨. but 메소드명은 소문자로!!(get(), post()..)
      • HEAD 요청의 경우, 응답은 바디 없이 헤더만 보내주면됨.(네트워크 대역폭 낭비방지)
    • 상속 기능 가능:
      • 작성하는 클래스형 뷰의 대부분은 장고가 제공하는 제네릭 뷰를 상속받아 작성함.
      • 제네릭 뷰는 뷰 개발 과정에서 단순 반복 작업을 덜어주는 기능함.
      • 제네릭 뷰? 뷰 개발 과정에서 공통적으로 사용할 수 있는 기능을 추상화하고, 이를 장고에서 미리 만들어 기본적으로 제공하는 클래스형 뷰를 뜻함.