Day 18 Django for KN

김의석 ·2024년 2월 23일

Django

목록 보기
18/39

Django for KN(Koinonia)

  • 해당 문서는 사귐의 교회 청소년부 출석부 프로젝트를 위한 Django 학습 내용과 개발 과정을 기록함

view 함수와 url 매핑

view 함수

  • 하나의 함수에 여러 URL 연결이 가능
  • URL에 매칭되지 않을 경우에 404 에러 출력.
    • debug = true : 디버그응답
    • debug = false : 관련 404.htmld을 찾는다.
  • 미들웨어는 뷰 반환값이 HttpResponse임을 기대하고 동작
# 잘못된 예시
def index(request):
	return "hello"
    # HttpResponse가 아닌 문자열을 반환하여 오류가 발생
    
# 오류 발생 시점, 미들웨어

from django.conf import settings
from django.utils.deprecation import MiddlewareMixin


class XFrameOptionsMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        if response.get("X-Frame-Options") is not None:
            return response
# response.get은 httpresponse type만 get함

# return값이 none인 경우도 동일

def index(request):
 return none
 
def index(request):
 if request.method == "POST"
 	return HttpResponse("ok") # return이 def가 아니라 if의 값으로 동일하게 반환값 none으로 처리 됨

HTTP 요청/응답 패킷 예시

  • /hottrack/?query=AKMU
    query=AKMU는 querystring이며 이를 개별 key/value로 뽑아 query parameter가 됨.

  • HTTPGER 요청 패킷

    • GER인 경우 요청 바디는 없고 헤더만 있다
  • get_object_or_404 : 데이터베이스 으로 지정된 레코드가 없을 때, 예외를 발생세킨다.

# gpt get_object_or_404 예시

from django.shortcuts import get_object_or_404
# shortcuts에는 redirect render get_object_or_404등이 있다.

from myapp.models import MyModel

def my_view(request, my_model_id):
    # my_model_id에 해당하는 MyModel 객체를 가져오거나, 없으면 404 에러 발생
    my_model = get_object_or_404(MyModel, pk=my_model_id)
    # 나머지 뷰 로직...

다양한 응답의 viw(동적 이미지, csv, 엑셀)

동적 이미지 응답

  • 소스코드 copy.py utils에 저장
# urls.py 설정

urlpatterns = [
    path(route="", view=views.index),
    path(route="<int:pk>/cover.png", view=views.cover_png),
]
# <int:pk>는 경로 변환기로, 정수를 일치시키고 이를 pk라는 변수로 뷰 함수로 전달

동적 csv 응답

def export_csv(requset):
    song_qs = Song.objects.all()
    df = pd.DataFrame(data=song_qs.values())
    # pd.DataFrame에서 쿼리셋을 즉시 pd.DataFrame으로 바꾸지 않음
    # values()를 통해 qs 안 Dict를 pd.DataFrame에 전달 한다.
    
    # 원하는 필드만 데이터프레임으로 넘기는 경우 아래 코드 참조
    # pd.DataFrame(data=song_qs.values("name",,등등))

    export_file = BytesIO()
    # 파일 즉시 응답을 위한 BytesIO
    # 메모리 상에서 바이트(byte) 데이터 다루기 위함, 생성한 export_file에서 데이터를 다루게 됨
    # 디스크에 파일을 저장하지 않고 메모리로에 저장된 바이트 데이터를 다룸

    df.to_csv(export_file, index=False, encoding="utf-8-sig")

    response = HttpResponse(content=export_file.getvalue(), content_type="text/csv")
    # export_file.getvalue() : export_file에 저장되 있던 데이터 가져오기
    
    response["Content-Disposition"] = "attachment; filename=hattrack.csv"
    # 다운로드 옵션, 전송할 파일 csv 이름 설정

    return response
profile
널리 이롭게

0개의 댓글