Django - orm(insert, select) 실습

|

전체 코드 보기


지난 포스팅에 이어서, 오늘은 기능 추가 작업


[1] html form data 받아오기

templates/emaillist/form.html 데이터를 받는 방법

<form action="/emaillist/add" method="">
    First name: <input type="text" name="fn" value="" ><br>
    Last name: <input type="text" name="ln" value=""><br>
    Email address: <input type="text" name="email" value=""><br>
    <input type="submit" value="submit">
</form>

위와 같은 form이 있다면

action의 /emaillist/add을 먼저 urls.py에 매핑을 설정한다.

python_ch3/urls.py

urlpatterns = [
    ...
    path('emaillist/add', emaillist_views.add),
	...
]

urls.py에서 설정한 url을 매핑할 add함수 정의

emaillist/views.py

아래의 코드와 같이 html의 input name값으로 데이터를 받을 수 있다.

def add(request):
    firstname = request.POST['fn']
    lastname = request.POST['ln']
    email = request.POST['email']

    return HttpResponse(f'{firstname}:{lastname}:{email}')

HttpResponse()는 text를 그대로 화면에 출력해주는 기능


CSRF verification failed. Request aborted Error!

403 Forbidden

views
CSRF verification failed

CSRF란?

장고의 기능 중 post데이터를 받을 때 CSRF보안코드가 포함되어 있지 않으면,

Error페이지를 출력


[해결] 장고에서 CSRF 처리하기

해당 form 뒤에

views

코드를 추가해주면 된다.

<form action="/emaillist/add" method="post">
    <!-- 여기에 추가 -->
    First name: <input type="text" name="fn" value="" ><br>
    Last name: <input type="text" name="ln" value=""><br>
    Email address: <input type="text" name="email" value=""><br>
    <input type="submit" value="submit">
</form>

위의 코드로 처리하면 form이 있는 page에 hidden으로 CSRF데이터가 생긴다.

views

이 처리는 상당히 보안에 취약하다.

해당 페이지의 html을 파싱해서 페이지의 csrfmiddlewaretoken값의 value를 가져와 form data와 함께 전송하면, 여전히 공격을 받기 쉬운 처리이다.

이는 장고를 좀 더 공부한 뒤, 좀 더 보안적으로 처리해보도록 하자

일단 토큰 처리를 마쳤으니, 다시 접근

views

성공!



[2] 받은 data, DB에 insert하기

emaillist/views.py

from emaillist.models import Emaillist
from django.http import HttpResponseRedirect

def add(request):
    emaillist = Emaillist()
    emaillist.first_name = request.POST['fn']
	emaillist.last_name = request.POST['ln']
    emaillist.email = request.POST['email']
    emaillist.save()

    # insert 후에는 꼭 redirect 처리!
    return HttpResponseRedirect('/emaillist')

http://localhost:8888/emaillist/form에서 submit을 한 뒤

DBeaver에서 확인해보기

views

성공!



[3] DB data select 가져오기

sample data를 몇 개 넣어보고 확인해보자!

emaillist/views.py

index에서 모든 데이터를 select해와서 list보여주기!

def index(request):
    emaillist = Emaillist.objects.all().order_by('-id')
    # for email in emaillist:
    #     print(email)
    data = {'emaillist':emaillist}
    return render(request, 'emaillist/index.html', data)

emaillist를 출력해보면 튜플 형태로 나오는 것을 확인 할 수 있다.

Emaillist(이, 바보, babo@naver.com)
Emaillist(김, 둘리, dooly@gmail.com)
Emaillist(Lee, JungEun, leeap1004@gmail.com)

이를 dict 타입으로 묶어서 render에 같이 보내주면 html에서 받을 수 있다.

templates/emaillist/index.html 수정

template tag을 이용해 보여주기

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>메일 리스트에 가입되었습니다.</h1>
	<p>입력한 정보 내역입니다.</p>
	<!-- 메일정보 리스트 -->
	
	<br>
	<p>
		<a href="/emaillist/form">추가메일 등록</a>
	</p>
	<br>
</body>
</html>
views