유누킴

Django urls.py 설정 방법 본문

Tech/Django

Django urls.py 설정 방법

Yunhoo_kim 2017. 12. 5. 19:02
728x90

How to set up URL in Django


Django에서는 각 URL에 해당하는 View 클래스를 할당해서 들어오는 요청을 처리할 수 있다.

클라이언트가 특정 URL로 HTTP 요청이 들어오게 되면, Django에 프로젝트 폴더 urls.py에 등록한 view들로 요청을 처리할 수 있도록 할당한다.

간단히 그림으로 설명하면,  아래 그림과 같이 요청이 들어오고, urls.py에 등록된 url의 view 클래스의 함수로 request를 요청을 처리할 수 있도록 한다.


이제 실제 Django에서 urls.py를 어떻게 설정하고 활용하는지에 대해 설명한다.

기본적으로 Django 프로젝트를 시작하면 프로젝트 이름과 동일한 프로젝트 폴더가 생성된다. 이 폴더 내에는 settings.py와 wsgi.py와 urls.py 파일이 들어있다.

settings.py와 wsgi.py에 대해서는 추후 포스팅 예정!.


project_name/

├── __init__.py

├── settings.py

├── urls.py

├── wsgi.py



이 project_name안에 urls.py는 다음과 같이 구성되어 있다.


from django.conf.urls import url

from django.contrib import admin


urlpatterns = [

    url(r'^admin/', admin.site.urls),

]



여기 urlpatterns 내부 리스트에 django 프로젝트에서 필요한 url 들을 등록하고 views class와 연결하면 된다.


실제 Django를 사용할때에는 프로젝트 폴더안에 urls.py는 각 앱들의 urls.py를 include하여서 앱 폴더 안에서 새로운 url들을 정의한다.



from django.conf.urls import (url, include)                                                    

urlpatterns = [

   url(r'^app1/', include('app1.urls'namespace = 'app1')),

       url(r'^app2/', include('app2.urls', namespace = 'app2'))

]



<project_name/urls.py>



from django.conf.urls import (url, include)

from .views import APP1IndexView

  

urlpatterns = [

    url(r'^index/$'APP1IndexView.as_view(), name='app1_index'),

]

<app1/urls.py>



위의 파일과 같이 프로젝트 폴더 내의 urls.py에는 app1.urls, app2.urls를 url로 등록해놓고, 실제 app 폴더 안에 urls.py에서  URL에 해당하는 View Class를 매핑시켜준다. 이렇게 되면 /app1/index/ 의 요청은 APP1IndexView 클래스로 할당되게 된다.


또한 django url 설정의 매력은 url안에 변수를 넣어서 view class안에서 변수를 접근 가능하다!




from django.conf.urls import (url, include)

from .views import APP1IndexView

  

urlpatterns = [

    url(r'^index/(?P<pk>[0-9]+)/$'APP1IndexView.as_view(), name='app1_index'),

]

<app1/urls.py>


class APP1IndexView(View):

    def __init__(self):

          pass


    def get(self, request, pk):


<app1/views.py>




url 내부에 변수명과 변수의 정규식 표현을 사용하여서 view class로 해당 변수를 인자로 접근 가능하다.

예를 들면 user_id가 1인 사용자의 정보를 보고싶다면, app1/index/1/ user_id가 2인 사용자의 정보는 app1/index/2/ 와 같이 접근하여 하나의 View 클래스로 동적인 처리가 가능하도록 구현할 수 있다.


** 최근 Django 2.0에서는 url 내에 변수 설정을 획기적으로 변경했다! **


from django.conf.urls import (url, include, path)

from .views import APP1IndexView

  

urlpatterns = [

    path('^index/<int:pk>/$', APP1IndexViews.as_view(), name='app1_index'),

]


기존의 정규식으로 사용하던 방식 말고 가독성이 좋은 형태로 탈바꿈 했다.



위의 프로젝트 url안에는 namespace, 앱 폴더 url안에는 name을 사용했는데, namespace는 앱을 구분해주는 기능이라고 생각하면 되고, 앱 url안에 name은 각 url의 이름을 붙이는 기능이라고 생각하면된다.

이 기능을 사용해서 나중에 TDD 개발과 내부에서 라우팅시에 reverse('namespace:name')으로 url로 라우팅 가능하다.



해당 포스팅은 개인적인 경험과, 공부에서 나온 지식을 바탕으로 작성되었습니다. 잘못된 부분 혹은 추가해야할 부분의 대한 피드백을 남겨주시면 감사하겠습니다.






'Tech > Django' 카테고리의 다른 글

Django Restframework ModelSerializer 활용 방법  (1) 2017.12.07
DRF(Django Rest framework) 소개  (0) 2017.12.06
Django란  (0) 2017.12.04