Django는 MVT(Model View Template) 아키텍처를 기반으로 하며 CRUD(Create, Retrieve, Update, Delete) 작업을 중심으로 합니다.
CRUD 기능을 구현하기 앞서 반복적인 코드들은 함수로 정리해 놓았습니다.
# global variable
nextId = 4
topics = [
{'id': 0, 'title': "routing", 'body': 'Routing is ...'},
{'id': 1, 'title': "view", 'body': 'View is ...'},
{'id': 2, 'title': "Model", 'body': 'Model is ...'},
]
def HTMLTemplate(articleTag):
global topics
ol = ''
for topic in topics:
ol += f'<li><a href="/read/{topic["id"]}/">{topic["title"]}</a></li>'
return HttpResponse(f'''
<html>
<body>
<h1><a href="/">Django</a></h1>
<ol>
{ol}
</ol>
{articleTag}
<ul>
<li><a href="/create">create</a></li>
</ul>
</body>
</html>
'''
def create(request):
title = request.GET['title']
from django.shortcuts import redirect
def create(request):
title = request.POST["title"]
body = request.POST["body"]
newTopic = {"id": nextId, "title": title, "body": body}
topics.append(newTopic)
url = "read/" + str(nextId)
nextId += 1
return redirect(url)
💡 redirect 사용 방법
from django.shortcuts import redirect
def my_view(request):
...
obj = MyModel.objects.get(...)
return redirect(obj)
<!--- new.html--->
<form action="/create" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p><textarea name="body" placeholder="body"></textarea></p>
<input type="submit">
</form>
📖 request와 response에 대한 정보를 알고싶다면 아래의 document를 참고해보자 !
Django documentation - Request and response objects
📖 redirect에 대한 정보는 아래를 참고해보자 !
Django shortcut functions - Redirect
Django에서 지원하는 보안 기능 중 하나라고 생각하면 되고, 주로 POST, PUT 및 DELETE
와 같은 안전하지 못한 방법을 통해 요청할 때 일어날 수 있는 에러입니다. 단, GET방식은 안전합니다!
CSRF verification failed. Request aborted. 해결 방법
POST를 전송하는 폼에서는 주로 이렇게 처리하면 예외처리가 가능합니다.
# 1. 다음과 같이 import 시켜주고
from django.views.decorators.csrf import csrf_exempt
# 2. 함수 전에 @csrf_exempt 적어주면 예외처리가 가능하다.
@csrf_exempt
def create(request):
📖 CSRF에 대한 정보는 아래의 사이트를 참고해보자 !
Django documentation - Cross Site Request Forgery protection
📃 views.py
def read(request, id):
global topics
article = ''
for topic in topics:
if topic["id"] == int(id):
article = f'<h2>{topic["title"]}</h2>{topic["body"]}'
return HttpResponse(HTMLTemplate(article))
참고 자료 📩
Django documentation - Request and response objects
Django shortcut functions - Redirect
Django documentation - Cross Site Request Forgery protection