Django-URL 매핑

이제 이전 장에서 설명한 작업 뷰가 생겼습니다. URL을 통해 해당 뷰에 액세스하려고합니다. Django는 URL 매핑을위한 자체 방법이 있으며 프로젝트 url.py 파일을 편집하여 수행됩니다.(myproject/url.py). url.py 파일은 다음과 같습니다.

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

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

사용자가 웹 앱에서 페이지를 요청하면 Django 컨트롤러가 url.py 파일을 통해 해당 뷰를 찾은 다음 HTML 응답 또는 찾을 수없는 경우 404 찾을 수 없음 오류를 반환합니다. url.py에서 가장 중요한 것은"urlpatterns"튜플. URL과 뷰 간의 매핑을 정의하는 곳입니다. 매핑은 다음과 같은 URL 패턴의 튜플입니다.

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
)

표시된 줄은 URL "/ home"을 myapp / view.py 파일에 생성 된 hello보기에 매핑합니다. 위에서 볼 수 있듯이 매핑은 세 가지 요소로 구성됩니다.

  • The pattern− 확인하고 매핑하려는 URL과 일치하는 정규 표현식. python 're'모듈과 함께 작동 할 수있는 모든 것이 패턴에 적합합니다 (URL을 통해 매개 변수를 전달하려는 경우 유용함).

  • The python path to the view − 모듈을 가져올 때와 동일합니다.

  • The name− URL 반전을 수행하려면 위의 예 에서처럼 명명 된 URL 패턴을 사용해야합니다. 완료되면 서버를 시작하여 다음을 통해보기에 액세스합니다. http://127.0.0.1/hello

URL 구성

지금까지 "myprojects / url.py"파일에 URL을 만들었지 만 Django 및 앱 생성에 대해 앞서 언급했듯이 가장 좋은 점은 다른 프로젝트에서 애플리케이션을 재사용 할 수 있다는 것입니다. "projecturl.py"파일에 모든 URL을 저장하면 문제가 무엇인지 쉽게 알 수 있습니다. 따라서 가장 좋은 방법은 응용 프로그램별로 "url.py"를 만들고이를 기본 프로젝트 url.py 파일에 포함하는 것입니다 (이전에 관리자 인터페이스에 대한 관리 URL을 포함했습니다).

어떻게 되나요?

다음 코드를 사용하여 myapp에 url.py 파일을 만들어야합니다.

from django.conf.urls import patterns, include, url

urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)

그런 다음 myproject / url.py는 다음과 같이 변경됩니다.

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

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

myapp 애플리케이션의 모든 URL을 포함했습니다. "/ hello"를 통해 액세스 한 home.html은 이제 "/ myapp / hello"가되었으며 이는 웹 앱에 대해 더 좋고 이해하기 쉬운 구조입니다.

이제 myapp "morning"에 또 다른 뷰가 있고 myapp / url.py에 매핑하고 싶다고 가정하고 myapp / url.py를 다음과 같이 변경합니다.

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
   url(r'^morning/', 'myapp.views.morning', name = 'morning'),
)

이것은 다음과 같이 리팩토링 될 수 있습니다.

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),)

보시다시피, 이제 첫 번째 요소를 사용합니다. urlpatterns튜플. 이는 앱 이름을 변경하려는 경우 유용 할 수 있습니다.

보기에 매개 변수 보내기

이제 URL을 매핑하고 구성하는 방법을 알았으므로 이제 매개 변수를 뷰에 보내는 방법을 살펴 보겠습니다. 고전적인 샘플은 기사 예제입니다 ( "/ articles / article_id"를 통해 기사에 액세스하려는 경우).

매개 변수 전달은 regexpURL 패턴에서. “myapp / view.py”에 다음과 같은 뷰가있는 경우

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

myapp / url.py에 매핑하여 "/ myapp / article / articleId"를 통해 액세스 할 수 있도록하고 싶습니다. "myapp / url.py"에 다음이 필요합니다.

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)

Django가 URL "/ myapp / article / 42"를 볼 때 매개 변수 '42'를 viewArticle보기에 전달하고 브라우저에서 다음 결과를 얻습니다.

여기서 매개 변수의 순서가 중요합니다. 한 달의 기사 목록을 원한다고 가정하고 viewArticles 뷰를 추가해 보겠습니다. 우리의 view.py는-

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

def viewArticle(request, month, year):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

해당 url.py 파일은 다음과 같습니다.

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)

이제 "/ myapp / articles / 12 / 2006 /"로 이동하면 'Displaying article of : 2006/12'가 표시되지만 매개 변수를 반전하면 동일한 결과를 얻지 못합니다.

이를 방지하기 위해 URL 매개 변수를보기 매개 변수에 링크 할 수 있습니다. 이를 위해url.py 될 것입니다-

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)