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() 반환
def create(request):
if request.method == 'POST':
post = Designer()
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)
READ
- READ는 home.html -> detail.html 처럼 넘어가는 방식이 Read입니다.
- 즉,
views.py
에서 함수 작성 후, urls.py
에 넘어가 Path()
하는 방식을 말합니다.
- views.py
def detail(request, designer_id):
designer = get_object_or_404(Designer, pk = designer_id)
return render(request, 'detail.html',{'designer':designer})
UPDATE
- 정보 수정이 필요한 객체를 찾아서 Data를 새롭게 저장하는 기능
- 객체 탐색 -> 입력 data 저장 -> post.save()
- CREATE 기능과 굉장히 유사하다. 이미 만들어져 있는 객체를 불러와 사용한다는 점만 다르다.
- 즉, 객체 생성은 하지 않는다.
- views.py
def update(request, designer_id):
post = get_object_or_404(Designer, pk=designer_id)
if request.method == '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:
return render(request, 'update.html', {'designer' : post})
DELETE
- 제거가 필요한 객체를 찾아서 삭제합니다.
- 지금까지 기능들을 보면, "찾는다" 라는 개념은 PK값을 필수로 함을 알 수 있습니다.
- 객체 탐색 -> 객체 삭제 -> 삭제 후 이동 할 URL 설정(HOME)
def delete(request, designer_id):
post = get_object_or_404(Designer, pk=designer_id)
post.delete()
return redirect('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