Django Basic 1-3) Form

Turtle·2023년 12월 20일
0
post-thumbnail

📌GET과 POST

  • GET과 POST는 양식을 처리할 때 사용하는 유일한 HTTP 메소드이다.
  • Django의 로그인 양식은 브라우저가 양식 데이터를 묶고 전송을 위해 인코딩한 후 서버로 보낸 다음 응답을 다시 받는 POST 메소드를 사용하여 반환된다.
  • 이와 대조적으로 GET은 제출된 데이터를 문자열로 묶고 이를 사용하여 URL을 구성한다. URL에는 데이터를 전송해야 하는 주소와 데이터 키 및 값이 포함된다. Django 문서에서는 검색을 수행하면 https://docs.djangoproject.com/search/?q=forms&release=1와 같은 형식의 URL이 생성되는 경우를 볼 수 있다.
  • GET과 POST의 사용 목적은 명확하게 다르다.
  • 시스템 상태를 변경하는데 사용할 수 있는 모든 요청(EX. 데이터베이스를 변경하는 요청)에는 POST를 사용한다.(뿐만 아니라 CRUD에서 CUD의 경우도 포함됨) GET은 시스템 상태에 영향을 주지 않는 요청에만 사용해야 한다.(CRUD에서 R의 경우)
  • 또한 GET은 비밀번호 형식에 적합하지 않다. 왜냐하면 비밀번호는 URL에 표시되므로 브라우저 기록 및 서버 로그에도 모두 일반 텍스트로 표시되기 때문이다. 대량의 데이터나 이미지와 같은 이진 데이터에도 적합하지 않다. 관리 양식에 대해 GET 요청을 사용하는 웹 애플리케이션은 보안 위험이 존재한다. 공격자가 시스템의 민감한 부분에 액세스하기 위해 양식의 요청을 모방하기 쉽다. POST는 Django의 CSRF 보호와 같은 다른 보호와 결합되어 있어 액세스에 대한 더 많은 제어를 제공한다.
  • 반면에 GET요청을 나타내는 URL은 쉽게 북마크에 추가하거나 공유하거나 다시 제출할 수 있으므로 GET은 웹 검색 양식과 같은 작업에 적합하다.

📌Building a form in Django

from django import forms

class NameForm(forms.Form):
    your_name = forms.CharField(label="Your name", max_length=100)
  • Form 인스턴스에는 모든 필드에 대해 유효성 검사 루틴을 실행하는 is_valid() 메소드가 있다. 이 메소드가 호출될 때 만약 모든 필드가 유효한 데이터를 포함한다는 전제가 깔려있다면 아래와 같은 작업이 실행된다.

    • True를 반환
    • 양식의 데이터를 cleaned_data 속성으로 넣는다.

📌Form.cleaned_data?

  • Form 클래스의 각 필드는 데이터 유효성 검사뿐만 아니라 일관된 형식으로 정규화하는 역할도 담당하는 책임이 있다. 이는 특정 필드에 입력되는 데이터를 다양한 방식으로 입력하여 항상 일관성있는 결과를 얻을 수 있다는 점에서 좋은 특징이다.
  • 일련의 데이터가 포함된 Form 인스턴스를 생성하고 유효성 검사 후에 cleaned_data 속성을 통해 정리된 데이터에 액세스할 수 있다.

📌적용

class PollCreateForm(forms.Form):
    topic = forms.CharField(max_length=50, label='투표 주제')
    options = forms.CharField(max_length=300, label='투표 옵션')
def create_poll(request):
    if request.method == "POST":
        form = PollCreateForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data['topic']
            options = form.cleaned_data['options'].split(",")   # split의 형태 > List

            topic = Topic(title=title)
            topic.save()

            for item in options:
                Option.objects.create(name=item, topic=topic)
            return HttpResponseRedirect('/votes/polls/')
    else:
    	# POST 미접근시, 기존처럼 새로운 폼을 아무것도 전달하지 않고 인스턴스를 생성해서 그대로 템플릿의 context dictionary로 넘겨주면 빈 폼이 렌더링됴ㅚㅁ 
        form = PollCreateForm()
    context = {
        'create_form': form
    }
    return render(request, 'votes/create_poll.html', context)

📌CSRF(Cross Site Request Forgery)공격이란?

  • POST 요청을 넣을 때 해킹에 의한 요청을 방어하기 위해서 해커가 유추하기 어려운 무작위의 값을 생성한 뒤 폼 요청을 보낼 때 같이 전송되도록 하고 서버에서 이 값이 정상적으로 들어오는 경우만 유효한 데이터 전송으로 확인하는 방식을 말한다.
  • 여기서 생성되는 무작위 값을 csrf_token이라고 하기 때문에 csrf_token 구문은 이 token을 출력하는 역할을 한다.
  • 만약 POST를 처리할 때 이 값이 폼의 단계에서 오지 않는다면 Django는 자동으로 잘못된 요청으로 인식하기 때문에 방어 로직이 작동된다.
  • 그래서 이 값을 폼에 전송되게 하기 위해서 폼 태그 내에서 코드가 출력되도록 {% csrf_token %}을 템플릿 파일에 넣는 것이다.

📌Output styles

  • form을 사용해서 렌더링할 때 폼의 형태가 원하는대로 나오지 않아서 폼의 출력 결과를 좀 이쁘게 정리하고픈 순간이 있을 것이다. Django에서는 폼의 형태를 정리해주는 것도 제공한다.

    • Form.as_div()
    • Form.as_p()
    • Form.as_ul()
    • Form.as_table()

0개의 댓글