HttpResponseRedirect와 reverse()

Super-rpm·2021년 5월 6일
0
post-thumbnail

4시간 정도 해맸던 문제를 해결하고 신나서 블로그에 남기려고했다.
그런데 우연히 2시간전에 내 코드를 캡쳐했던걸 다시봤다.
현재 코드랑 다른게 1도 없다.

그렇다

나는 그냥 같은 코드를 썼다 지웠다 하고있었을 뿐이고
문제는 왜 해결됐는지 모르는 상태로 해결됐다.
정확히는 뭐가 문제였었는지도 모르겠다.
뻘글이 돼버렸다.

억울해서 쓰던거 남겨놓는다. 그래도 조금이나마 공부가 되었으니....

문제는 간단했다

사실 문제랄 것도 없었다

return HttpResponseRedirect(reverse('index'))

이것만 해주면 되는 거니까

그런데 실례지만 누구신지요?

따라하며 간단한 웹 프로젝트를 만들어보는 책이 있었을 뿐이다.
책을보고 따라하면 30분 1시간이면 게시판 하나 뚝딱 나올줄 알았다.
이래서 하룻강아지 범무서운줄 모른다고 하나보다.

'index'는 유효한 view function도 패턴 이름도 아니시란다.

나는 똑같이 따라했는데 왜안돼?! 를 잠시뒤로하고

reverse()부터 찾아보자

from django.urls import reverse

이렇게 모셔온다.

reverse()¶
If you need to use something similar to the url template tag in your code, Django provides the following function:

당신의 코드안에서 url template tag와 비슷하게 쓸일 있을 때 사용하시란다.

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)¶
viewname can be a URL pattern name or the callable view object. For example, given the following url:

인자는 저런 다양한 것들있지만 일단 나는 viewname을 제외하고는 필요가 없다.
viewname 즉 전달받을 인자는 URL pattern name이거나 view object여야 한단다.

그런데 'index'라고만 써놓으면 그게 url인지 누가 알아주나?
from django.urls import path
from . import views

urlpatterns = [
        path('',views.index, name='index'),
]

이 분이 알아주신다.

이 분은 my_app/urls.py에 계신분으로서 상위디렉토리 동명이인 urls.py선생님께 url요청이 들어오면 이 분을 방문하게 된다.
그러면 이 분은 'index'라는 name을 가진 분들을 다시 views.index로 전화를 돌린다.

자그러면 reverse()선생님은 해결되시었다. HttpResponseRedirect를 만날 차례다

보자보자 어디보자 넌 담에보자

Redirect는 담에보고 HttpResponse부터 만나자
왠지 이쪽이 오리지날같으시다. 찬물도 위아래가 있는법 뿌리부터 들어가자.
HttpResponse는 html을 반환하시는 분 되시겠다.
그러면 HttpResponseRedirect는 무엇을 반환하실까

그런거 없다. 반환안하신다. 말그대로 Re다시 direct할뿐이다. 어디로? reverse('index')로

그러면 내가 가지고있는 그 'index'라는건 대체 무엇일까?
당연히 index.html 그냥 첫화면이다.
reverse('index')로 첫화면 url을 가져오고 거기로 Redirect해줄 뿐이다.

앞서 작동한 코드들이 모두 실행되고나면 다시 첫화면으로 돌아가는것이다.
일종의 새로고침이라 생각이 든다.

아니 근데 첫화면으로 돌아가는 방법이 이것만 있는것도 아니잖아요?

views에서는 reverse('index')로 urls의 name='index'를 통해 index함수를 실행해줘서 그간에 사용자로부터 입력받은것을 db로 저장해서 첫화면에 다시 띄워줄 뿐이다.
다만 그냥 '첫화면'으로 돌아가는것과는 분명한 차이가 있다.
Re다시 연결을 해줘야 하는이유는 이 과정에서 db에 저장된 사용자의 입력이 화면에 표출되기 때문이다.

어째서 2시간 동안 고치고 고친 코드가 2시간 전의 코드와 1도 다른게 없는데
왜 이건 작동하고 2시간전에는 작동하지 않았을까
이렇게 된이상 기도메타로 간다.

일주일뒤에 문제의 원인을 찾아서 기도메타로 가지말라고 여기 남긴다

문제의 원인은 저장을 안했다는거다
뭔 소리냐?
Ctrl + S 혹은 command + S를 안눌렀다는거다.

git add혹은 커밋을 하는것과 파일 자체를 저장해서 python manage.py runserver로 돌리는것은 차이가 있다.

너무 당연한데 나는 몰랐다...
저장을 안해서 발생하는 문제다.
사실 진짜 저장을 안한건 아니었고...저장 단축키가 작동을 안하고 있다는걸 몰랐다...확인하고 노트북부터 바꿨다.

그렇다 이 포스트의 문제해결방법은 바로 노트북 교체였던 것이다.

profile
No reason No code

0개의 댓글