(Django) render 와 redirect의 차이

Kepler·2020년 4월 23일
1

현재 인턴중인 회사에서 기존에 쓰인 소스코드의 url, view, template을 모두를 수정해야 하는 일이 생겼다. 이들의 관계성에 대한 이해가 부족해서 알고보면 간단한 작업이었던것을 하루종일 걸려서 수정했다.. 이 때 배운 내용을 정리해 보려고 한다.

flow

url 호출 -> url에 지정된 API를 호출 -> API의 return 값인 html 표시

urls.py

이곳에서 각 API의 url을 지정하여 호출할 수 있다는 점만 알고 있었으나 각각의 parameter가 어떤 역할을 하는지에 대한 이해가 부족했다.

다음의 urlpatterns을 살펴보자.


urlpatterns = [
    path('login/', LogInView.as_view(), name='login'),					[1]
    url('db/(?P<country_id>[a-zA-Z0-9_]+)/add/$', views.city_add, name='city_add'),	[2]
    url('db/([a-zA-Z0-9_]+)/detail/$',views.place_detail, name='place_detail'),  [3]

path() vs url()

path 와 url은 각각의 parameter를 가진다.

path(route, view, kwargs=None, name=None)
url(regex, view, kwargs=None, name=None)

다른 점은 첫번째 parameter인데, 기존의 url이 regex를 지정해야 했다면, path는 route를 지정해 주면 된다.
따라서, 위의 예시 [2]는 path(db/<int:country_id>/add/와 동일하다.

단순한 루트나 view에서 받은 값을 사용하여 지정하는 경우에는 path를 사용하면 된다. 위의 예시 [3]의 경우, 루트의 일부를 html에서 받았기 때문에, url을 사용하여 regex를 지정해 주었다. (사실 더 좋은 방법이 있을것 같다..)

name

두번째 parameter는 API를 지정해준다.
새번째 parameter에는 view에서 사용할 urlpattern의 이름을 지정해 준다. 뒤에 설명한 redirect의 첫번째 인자로 여기서 지정한 이름을 넘겨주면, 해당 url이 호출되어, API가 호출된다.

views.py

장고의 뷰에서 일련의 처리가 끝난후 return값으로 render와 redirect를 지정할 수 있다.

render: API의 리턴값으로 template을 지정 가능

Combines a given template with a given context dictionary and returns an HttpResponse object with that rendered text.

render(request, template_name, context=None, content_type=None, status=None, using=None)

  • request
  • template_name: html 파일 이름 (ex: placedetail.html).
  • context: 위의 인자와 함께 html에 리턴하고 싶은 dictionary를 지정 (ex: context={'cities':all_cities}). html파일에서 {{ key }} 로 access 가능

redirect: 다른 url(API)로 이동하기

render와 달리 template을 지정할 수 없으므로, 단순히 다른 API를 호출 할 때만 사용할 수 있다. 따라서, context와 같이 dictionary를 넘기는 것은 불가능하다.

redirect(to, *args, permanent=False, **kwargs)

  • to: url의 path를 직접 적거나, urlpattern에서 지정한 name을 지정할 수 있다.

참고링크:
https://ssungkang.tistory.com/entry/Django-render-%EC%99%80-redirect-%EC%9D%98-%EC%B0%A8%EC%9D%B4

profile
🔰

0개의 댓글