파이썬 웹 프로그래밍
장고에서 제공하는 제네릭 뷰는 다음과 같이 4가지로 분류할 수 있다.
- Base View: 뷰 클래스를 생성하고, 다른 제네릭 뷰의 부모 클래스를 제공하는 기본 제네릭 뷰
- View: 가장 기본이 되는 최상위 제네릭 뷰
- TemplateView: 템플릿이 주어지면 해당 템플릿을 랜더링
- RedirectView: URL이 주어지면 해당 URL로 리다이렉트
- Generic Display View: 객체의 리스트를 보여주거나, 특정 객체의 상세 정보 제공
- DetailView: 객체 하나에 대한 상세한 정보를 보여줌
- ListView: 조건에 맞는 여러 개의 객체를 보여줌
- Generic Edit View: 폼을 통해 객체를 생성, 수정, 삭제하는 기능을 제공
- FormView: 폼이 주어지면 해당 폼을 보여줌
- CreateView: 객체를 생성하는 폼을 보여줌
- UpdateView: 기존 객체를 수정하는 폼을 보여줌
- DeleteView: 기존 객체를 삭제하는 폼을 보여줌
- Generic Date View: 날짜 기반 객체의 년/월/일 페이지로 구분해서 제공
- YearArchiveView: 년도가 주어지면 그 년도에 해당하는 객체를 보여줌
- MonthArchiveView: 월이 주어지면 그 월에 해당하는 객체를 보여줌
- DayArchiveView: 날짜가 주어지면 그 날짜에 해당하는 객체를 보여줌
4.5.5 클래스형 뷰에서 폼 처리
폼 처리 과정을 아래와 같이 3가지 경우로 구분
- 최초의 GET: 폼은 비어있거나 미리 채워진 데이터를 가짐
- 유효한 데이터를 가진 POST: 데이터를 처리함. 주로 디라이렉트 처리됨
- 유효하지 않은 데이터를 가진 POST: 보통은 에러 메시지와 함께 폼이 다시 출력됨
FormView 제네릭 뷰를 사용하면 FormView 클래스에 이미 정의되어 있기 때문에 클래스 내에 get(), post() 메소드 정의도 불필요하게 됩니다.
FormView 유의사항
- formclass: 사용자에게 보여줄 폼을 정의한 forms.py 파일 내의 클래스명
- templatename: 폼을 포함하여 렌더링할 템플릿 파일 이름 - successurl: MyFormView 처리가 정상적을 완료되었을 때 리다이렉트시킬 URL
- formvalid() 함수: 유효한 폼 데이터로 처리할 로직 코딩. 반드시 super() 함수를 호출해야 함
4.6 로그 남기기
4.6.1 로거
파이썬의 로그 레벨
- DEBUG:
- INFO:
- WARNING:
- ERROR:
- CRITICAL: 치명적인 문제점이 발생 시 이에 대한 정보로, 로그 레벨의 최상위 수준
4.6.2 핸들러
핸들러는 로거에 있는 메시지에 무슨 작업을 할지 결정하는 엔진입니다. 즉, 메시지를 화면이나 파일 또는 네트워크 소켓 등 어디에 기록할 것인지와 같은 로그 동작을 정의합니다.
4.6.5 로거 사용 및 로거 이름 계층화
- snippet.python
import logging # 로거 이름으로 계층화 logger = logging.getLogger('project.interesting.stuff')
로거 객체는 각 로그 레벨별로 로깅 호출 메소드를 가지고 있다.
- logger.debug()
- logger.info()
- logger.warning()
- logger.error()
- logger.critical()
이외에 두 가지 로깅 메소드가 추가로 가능
- logger.log(): 원하는 로그 레벨을 정해서 로그 메시지를 생성
- logger.exception(): 익셉션 스택 정보를 포함하는 ERROR 레벨의 메세지를 생성
로깅 설정 예시
- snippet.python
LOGGING = { }
5.1.3 애플리케이션 - Model 코딩하기
모델 작업은 다음과 같은 순서대로 진행
- snippet.shell
vi settings.py vi models.py vi admin.py python manage.py makemigrations python manage.py migrate python manage.py runserver
5.1.5 애플리케이션 - Template 코딩하기
5.1.6 애플리케이션 - Template 상속 기능 추가
{% load static %} 템플릿 태그는 static이라는 사용자 정의 태그를 로딩해주고, 그 다음에 {% static %} 사용자 정의 태그를 통해 admin/css/base.css 스타일시트 파일을 찾게 됩니다.
base_books.html 템플릿 파일을 아래와 같이 작성
- snippet.html
{% extends "base.html" %} <title>{% block title%}Books Application Site{% endblock%}</title> {% block sidebar%} {{ block.super }} <ul> <li><a href="/books/">Books_Home</a></li> </ul> {% endblock %}
장고의 설계 원칙
일반 사항
- 약한 결합(Loose coupling)
- 경량 코드(Less code)
- 신속 개발(Quick development)
- 반복 방지(DRY, Don't Repeat Yourself)
- 암시보다는 명시적으로 표현(Explicit is better than implicit)
- 일관성(Consistency)
모델
- 암시보다는 명시적으로 표현(Explicit is better than implicit)
- 관련 도메인 로직을 모두 포함(Include all relevant domain logic)
데이터베이스 API
- SQL 효율성(SQL efficiency)
- 간결하고 강력한 문법(Terse, powerful syntax)
- 필요 시 쉽게 작성할 수 있는 SQL(Option to drop into raw SQL easily, when needed)
URL 설계
- 약한 결합(Loose coupling)
- 제약없는 유연설(Infinite flexibility)
- 베스트 프랙티스 권장(Encourage best practices)
- 결정적인 URL(Definitive URLs)
템플릿 시스템
- 표현과 로직의 분리(Separate logic from presentation)
- 중복 배제(Discourage redundancy)
- HTML과 분리(Be decoupled from HTML)
- 템플릿 언어로 XML 금지(XML should not be used for template languages)
- 디자이너의 능력 가정(Assume designer competence)
- 여백을 확실하게 처리(Treat whitespace obviously)
- 프로그래밍 언어를 만들지 말자(Don't invent a programming language)
- 안정성과 보안(Safety and security)
- 확장성(Extensibility)
뷰
- 간단함(Simplicity)
- 요청 객체의 사용(Use request objects)
- 약한 결합(Loose coupling)
- GET, POST 간 차이(Differentiate between GET and POST)
캐시 시스템
- 경량 코드(Less code)
- 일관성(Consistency)
- 확장성(Extensibility)