파이썬 웹 프로그래밍
파이썬 웹 프로그래밍: 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 %}: 사용자 정의 태그 & 필터를 로딩함.
- 템플릿 상속:
- 템플릿 상속을 이용해서 템플릿 코드 재사용 가능
- 템플릿 상속 단계:
- 사이트 전체의 룩앤필을 담고있는 base.html을 만듦.
- 사이트 하위의 섹션별 스타일을 담고 있는 base_news.html, base_sports.html등의 템플릿을 만듦(2단계 템플릿들은 1단계의 base.html에 의해 상속을 받음)
- 개별 페이지에 대한 템플릿을 만듦.
4.4 폼 처리하기
- html에서의 폼:
- 웹 개발 시, 사용자로부터 입력을 받기 위해 폼을 사용함.
- HTTP 프로토콜 중 폼에서 사용할 수 있는 메소드는 GET,POST
- 장고는 폼의 데이터 전송 시, POST사용.
- ※ POST: 서버 시스템의 상태를 바꾸는 요청(ex> DB의 내용을 변경하는 요청)
- ※ GET: 시스템의 상태를 바꾸지 않는 요청, 검색폼
- CSRF : 장고가 보안을 강화하기 위해 제공하는 기능
- 장고의 폼 기능:
- 폼 생성에 필요한 데이터를 폼 클래스로 구조화하기
- 폼 클래스의 데이터를 렌더링하여 HTML 폼 만들기
- 사용자로부터 제출된 폼과 데이터를 수신하고 처리하기
- 모델 클래스의 필드가 DB의 필드로 매핑되는거처럼, 폼 클래스의 필드도 HTML폼의 <input> 엘리먼트에 매핑됨.
- 객체 렌더링 시, 3가지 과정
- 렌더링할 객체를 뷰로 가져오기(ex> DB로부터 객체를 추출하기)
- 해당 객체를 템플릿 시스템으로 넘겨주기
- 템플릿 문법을 처리해서 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 요청의 경우, 응답은 바디 없이 헤더만 보내주면됨.(네트워크 대역폭 낭비방지)
- 상속 기능 가능:
- 작성하는 클래스형 뷰의 대부분은 장고가 제공하는 제네릭 뷰를 상속받아 작성함.
- 제네릭 뷰는 뷰 개발 과정에서 단순 반복 작업을 덜어주는 기능함.
- 제네릭 뷰? 뷰 개발 과정에서 공통적으로 사용할 수 있는 기능을 추상화하고, 이를 장고에서 미리 만들어 기본적으로 제공하는 클래스형 뷰를 뜻함.