Django #3 CRUD, 전송방식

최민석·2021년 1월 2일
1

Django

목록 보기
3/6

CRUD 란?

  • 기본적인 데이터 처리 기능을 묶어서 하는 말입니다.
  • CRUD는 Create, Read, Update, Delete를 뜻합니다.
  • 단어 그대로 생성, 읽기, 갱신, 삭제의 기능을 가지고 있습니다.
  • 일단은 먼저 Client가 Server로 Request 하는 방법을 먼저 알아보겠습니다.

GET

  • GET은 클라이언트에서 서버로 요청을 보내는 방법 중 하나입니다.
  • Data를 URL에 포함시켜서 전송하는 방법. 가장 큰 특징!!
  • 전송하는 길이에 제약이 있고, Caching 을 사용 할 수 있습니다.
  • REST에서 Data Search에 활용합니다.
  • READ에서 활용합니다.

POST

  • POST는 Data를 에 넣어 전송합니다. 즉, URL에서의 노출이 없습니다.
  • 전송하는 길이에 제약이 없고, Caching 을 사용 할 수는 없습니다.
  • REST에서 Data Create에 활용합니다.
  • CREATE / UPDATE에서 활용합니다.
  • POST 자체가 보안이 좋은 건 아니고, CSRTOKEN 암호화를 이용하여 보안에 좋습니다.

CREATE

  • 새로운 객체를 생성 후, Data를 저장
  • 새로운 객체를 생성 후, redirect() 함수를 통해 urls.py의 name에 맞게 pk값을 포함 하여 전달합니다.
  • 객체 생성 -> 입력 Data 저장 -> post.save()을 거친 후 -> redirect() 반환
# 객체를 생성하여(POST) Data를 저장해서 해당 urls - name을 통해 전달
def create(request):
    if request.method == 'POST':
        post = Designer() #객체생성
        if 'image' in request.FILES: 
            post.image = request.FILES['image'] # new.html의 name="image"
        post.name = request.POST['name'] # new.html의 name="name"
        post.address = request.POST['address'] # new.html의 name="address"
        post.description = request.POST['description'] # new.html의 name="description"
        post.save()
        # redirect 함수는 import 해주어야 사용 가능함.
        # redirect('urls의 path name = 'profile/'+str(post.id), pk)
        # save 한 후 , detail의 주소로 보내는 것. ( pk(post-id)을 통해 감)
        # redirect 는 이동만 하는 거고, render 는 새로 만드는 것.
        return redirect('detail', post.id)

READ

  • READ는 home.html -> detail.html 처럼 넘어가는 방식이 Read입니다.
  • 즉, views.py에서 함수 작성 후, urls.py에 넘어가 Path() 하는 방식을 말합니다.
  • views.py
def detail(request, designer_id): #views.pk 변수명과 urls.pk 변수명이 같아야함.
    designer = get_object_or_404(Designer, pk = designer_id) # urls에서 명시한 designer를 가져옴
    return render(request, 'detail.html',{'designer':designer})

UPDATE

  • 정보 수정이 필요한 객체를 찾아서 Data를 새롭게 저장하는 기능
  • 객체 탐색 -> 입력 data 저장 -> post.save()
  • CREATE 기능과 굉장히 유사하다. 이미 만들어져 있는 객체를 불러와 사용한다는 점만 다르다.
  • 즉, 객체 생성은 하지 않는다.
  • views.py
# new는 새로운 값을 만들기 때문에.
def update(request, designer_id):
    post = get_object_or_404(Designer, pk=designer_id) # 객체 존재 여부 확인
    if request.method == 'POST': # POST인 메소드
        if 'image' in request.FILES: # 이미지가 존재 할 시, 받아옴. 없으면 넘어감
            post.image = request.FILES['image']
        post.name = request.POST['name'] 
        post.address = request.POST["address"]
        post.description = request.POST["description"] 

        post.save()
        return redirect('detail', post.id)
    else: # POST가 아닌 메소드, 새로 만들어줌
        return render(request, 'update.html', {'designer' : post}) 

DELETE

  • 제거가 필요한 객체를 찾아서 삭제합니다.
  • 지금까지 기능들을 보면, "찾는다" 라는 개념은 PK값을 필수로 함을 알 수 있습니다.
  • 객체 탐색 -> 객체 삭제 -> 삭제 후 이동 할 URL 설정(HOME)
# 객체를 가져와서(POST) 삭제 
def delete(request, designer_id):
    post = get_object_or_404(Designer, pk=designer_id) # 객체를 따라가서 post에 저장함
    post.delete()
    return redirect('home') # 삭제 후 urls의 name=home과 연결하여 이동.

CSRF

  • 위조 요청을 통해 피싱 사이트 및 사이트 해킹을 당하게 되는 것을 CSRF 공격 이라고합니다.
  • 이는 HTML과 같이 웹 어플리케이션의 취약점을 이용해, 희생자가 자신의 의지와 관계 없이 공격자가 명령하는 행위를 말합니다.
  • 이를 막을 방법으로는 Security Token을 사용하면 됩니다.

CSRF TOKEN

  • 사용자의 세션에 임의 난수를 저장하고, 사용자의 요청마다 해당 난수 값을 포함시켜 전송합니다.
  • Back-end에서 요청을 받을 때마다, 세션에 저장된 토큰과 요청 파라미터에 전달되는 토큰 값이 일치하는지 검증하는 방법입니다.
  • 이를 Django HTML 사용하기 위해서는 {% csrf_token %} 을 이용하면 됩니다.
  • new.html
  <form action="{% url 'create' %}" method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <div class="mb-3">
                <label for="inputFile">등록하시는 분을 대표할 수 있는 이미지를 등록해 주세요</label>
                <input type="file" class="form-control-file" id="inputFile" name="image" value="" required>
            </div>

            <div class="mb-3">
                <label for="inputName">등록하시는 분의 이름을 적어 주세요</label>
                <input type="text" class="form-control" id="inputName" name="name" required>
                <small id="Name" class="form-text text-muted">50자 이내로 작성 바랍니다.</small>
            </div>

            <div class="mb-3">
                <label for="inputAddress">등록하시는 분의 활동 지역을 적어 주세요</label>
                <input type="text" class="form-control" id="inputAddress" name="address" required>
                <small id="Name" class="form-text text-muted">예시) 서울특별시 강남구, 경기도 성남시 등</small>
            </div>

패키지 종속성 관리

  • 내 환경에서 어떤 패키지를 어떤 버젼으로 사용하고 있는지 알려주는 것
  • 패키지의 버전에 따라서 실행되는 화면, 실행되는 패키지가 다 다르기 때문에, 협업 시 필수
  • 패키지들을 정의 하는 명령어입니다.
pip freeze > requirements.txt
profile
되돌아보며 성장합니다🔨

0개의 댓글