22.03.13 Django 페이지(?) 생성하기

김설영·2022년 3월 13일
post-thumbnail

CSRF verification failed. Request aborted.
해당 오류는 Django의 보안 때문에 발생하는 오류이다.

해결 방법

해결은 위 링크에서 할 수 있었다.

이렇게 데코레이터를 달아주면 된다.

장고를 공부하면서 느낀 것이 하나 있는데, 디스코드 봇 API랑 뭔가 비슷하다는 생각이 든다.

디스코드 봇도 클라이언트의 요청이 들어오면, context 객체가 생성되고, 그 객체를 함수내에서 이용할 수 있으며, 모든 함수마다 파라미터로 지정을 해줘야 구동된다.

장고 또한 모든 함수마다 request 파라미터를 첫 파라미터로 넘겨줘야 하는 점이 비슷한 것 같다. 그리고 request 객체를 이용할 수 있다는 점 까지 비슷했다.

오늘의 마지막 수업인 create 수업.. 너무 어려웠다.
그러니까, 한번 더 짚고 넘어가보자.. 내것으로 만들기 위해서!

Web page의 요청 방식은 Get 방식과 Post 방식이 있다.
복습은 여기서!

일단, 장고는 url로 이동함에 따라, 해당 url 패턴을 분석하고, 그 url에 대해서 어떤 함수를 구동할지 결정한다.

그렇기 때문에, 해당 페이지의 create 버튼을 누르면,

../create/ 라는 url로 넘어가게 해두었고,

url로 넘어가면,

view.create 함수가 구동되도록 해두었다.

create 함수는 아래와 같이 작성했다.

@csrf_exempt
def create(request):
    # request 객체가 생성되는 것이, 디스코드 봇의 ctx 객체가 생성되는 것과 비슷한 것 같다.
    global topics
    # 해당 페이지를 가져온 방식이, Get 방식일 때 > create 창과 버튼을 생성함.
    if request.method == 'GET':
        article = '''
        <form action="/create/" method="post">
            <p><input type="text" name="title" placeholder="title"></p>
            <p><textarea name="body" placeholder="body"></textarea></p>
            <p><input type="submit"></p>
        </form>    
        '''
        return HttpResponse(html_template(article))

    # 해당 페이지를 가져온 방식이, POST 방식일 때. 즉, 제출 버튼을 눌렀을 때
    elif request.method == 'POST':
        title = request.POST['title']  # title 값을 가져옴
        body = request.POST['body']  # body 값을 가져옴
        new_topic = {'id': len(topics) + 1, 'title': title, 'body': body}  # 해당 페이지의 딕셔너리 생성.
        topics.append(new_topic)  # 기존 딕셔너리에 해당 딕셔너리를 추가
        url = '/read/' + str(new_topic['id'])  # 새로운 url 생성

        # 어떤 URL로 이동할래? 새로운 url로 이동하면, url 패턴을 찾아서 view.read가 수행됨.
        # 결국, create를 한 후, 새로운 url로 이동하면 read가 해당 url의 정보를 읽어오므로, redirect를 사용해도 됨.
        return redirect(url)

처음 create 버튼을 눌렀을 때, 그러니까 해당 url로 이동이 되었을 때 나타나는 창의 요청 방식은 'GET'이다.

그래서, create() 함수에 들어온 요청이 GET 방식일 때는 제출 양식과 제출 버튼을 나타내도록 코드를 작성하였다.


제출 버튼을 눌렀을 때는, 요청 방식이 POST로 전송되게 해놨고, create() 함수에 들어온 POST이기 때문에, 해당 건에 대해서는 다르게 처리하도록 함수를 작성하였다.

request에는 여러 메소드가 있는데,
request.method 는 GET or POST를 반환하고,
request.POST에는 POST 방식으로 들어온 요청에 대한 값이 딕셔너리 형태로 저장되어 있다.

이 request.POST를 잘 이용해서,

title 값은 새로운 목록에, body 값은 그 목록의 설명란에 적을 수 있다.

그리고, new_topic 딕셔너리에 id 값을 추가해서 저장했는데, id는 현재 딕셔너리의 길이 + 1 이 되도록 저장하였고, url은 '/read/' + id값 이 되도록 새로운 url을 설정하였다.

그리고 나서, POST 요청은 리턴 값을 'redirect(url)'을 줬는데, 이는 위 과정이 끝나면, 해당 url로 이동하겠다는 의미이다.

그렇게 새로운 url로 이동을 하면, 또 장고가 urlpattern을 분석할것이고, 새로운 url은 read관련 url이므로, view.read가 수행되며 read()함수가 호출 될 것이다.

read 함수가 호출되면, 새로운 페이지에 대한 정보가 아래 함수를 통해 입력이 될 것이고, HttpResponse를 통해 웹 페이지에 게시가 될 것이다.

웹 프레임워크를 공부하면서 가장 크게 느낀 점은,

내가 여태까지 해왔던 파이썬 공부는 정말 '도구' 수준이었다는 것이다.

파이썬 구문을 공부하면서,
웹크롤링, 디스코드 봇 등을 수행해 보면서 와 정말 공부할게 많다고 생각했었는데, 오산이었다.

생각보다 더더더더더더욱 많다.

그리고, 내가 쉽게쉽게 사용해오던 웹 페이지들이 정말 쉽게 만들어진게 아니구나 라는 생각이 들었다.

파이썬 장고를 열심히 공부해서, 웹프레임워크가 대략 어떻게 돌아가는지 흐름을 파악해두어야 할 것 같다.

그래야 파이썬이 아닌, 다른 언어로 서버를 구동해보는 등의 도전을 해볼 수 있을 것이다.

profile
블로그 이동하였습니당! -> https://kimsy8979.tistory.com/

0개의 댓글