Django URL dispather

서재환·2022년 4월 15일
0

Django

목록 보기
16/40

URLconf Basic

path 함수

path(route, view, kwargs=None, name=None, Pattern=None)

route
URL 패턴을 가진 문자열

view
Django 에서 일치하는 패턴을 찾으면, HttpRequest 객체를 첫번째 인수로 하고, 경로로 
부터 '캡처된' 값을 키워드 인수로하여 특정한 view 함수를 호출.

kwargs
임의의 키워드 인수들은 목표한 view 에 사전형으로 전달

name
URL에 이름을 지으면, 템플릿을 포함한 Django 어디에서나 명확하게 참조가 가능하다

name에 대한 보충 설명

----------------------------------------------------------------------------
# Definition in coffeehouse/urls.py
path('',TemplateView.as_view(template_name='homepage.html'),name="homepage")

----------------------------------------------------------------------------
# Definition in view method
from django.http import HttpResponsePermanentRedirect
from django.urls import reverse

def method(request):
    ....
    return HttpResponsePermanentRedirect(reverse('homepage'))

----------------------------------------------------------------------------
# Definition in template
<a href="{% url 'homepage' %}">Back to home page</a>
urls.py, views.py, *.html 파일이 있다고 했을 때 urls.py 에서 path 함수의 name에 해당하는 
homepage는 views.py와 template에서 그 기능을 한다. 위의 경우 views.py에서 reverse함수에
homepage.html을 return 하게 되고 templates 안에선 homepage라는 변수가 연결되어 있는 url인
루트 도메인으로 연결하는 역할을 수행하는 것이다. 

참고자료

참고1

참고2

urlpatterns의 다양한 형태

ex1)

from django.urls import path

from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
url.py 부문에 위와 같이 작성 할 경우 특정 페이지로 request가 들어오면 위에서부터 차례대로 매칭되는 
url을 찾는다. 

첫번째 같은 경우 하드코딩으로 'articles/2003'에 매칭이 딱 될 때,

두번째는 'articles/숫자/' 형태의 url이 매칭될 때, 

세번째는 'articles/숫자/숫자/'형태 

네번째는 'articles/숫자/숫자/slug/'형태이다. 

자료형에 대한 안내사항은 Path Converter 부문이 관여한다.

ex2)

from django.contrib import admin
from django.urls import path
from posts.views import url_view, url_parameter_view

urlpatterns = [
    path('url/', url_view, name='url_view'),
    path('url/<str:username>/', url_parameter_view)
]
liongram에서 쓰인 url.py, 첫번째는 하드코딩 된 형태, '도메인주소/url/'로 들어오는 경로의 경우 

url_view 함수를 호출하고 해당 URL 명칭을 'url_view'로 한다. 

두번째의 경우 '도메인주소/문자열' 형태로 들어올 경우 views.py에 있는 url_parameter_view 함수를 호출한다. 

ex3)

from django.views.generic import TemplateView

urlpatterns = [
    path(
        "about/", TemplateView.as_view(template_name="pages/about.html"), name="about"
    ),
    # Django Admin, use {% url 'admin:index' %}
    path(settings.ADMIN_URL, admin.site.urls),
    # User management
    # path("users/", include("wanted_pre_onboarding.users.urls", namespace="users")),
    path("accounts/", include("allauth.urls")),
    
    # Your stuff: custom urls includes go here
    path("", include("wanted_pre_onboarding.users.urls", namespace='users')),

    # /posts/
    path("posts/", include("wanted_pre_onboarding.posts.urls", namespace="posts")),
    
]
첫번째 path
'도메인/about/' url로 클라이언트의 요청이 들어왔을 때 Template.View.as_view 함수를 호출, 
'pages/about.html' 템플릿을 반환한다. templates 에서 'about'이라는 약칭을 통해 template을 
'pages/about.html'을 불러올 수 있다.

두번째 path
(생략)

세번째 path
'도메인/accounts/' 경로로 요청이 들어왔을 때 allauth라는 앱 내부에 있는 urls.py를 참조하라

네번째 path
'도메인' 루트로 요청이 들어왔을 때 'wanted_pre_onboarding' 앱 내의 users.urls.py를 참조하라

다섯번째 path
'도메인/posts/'로 요청이 들어왔을 때 'wanted_pre_onboarding' 앱 내의 posts.urls.py를 참조하라.

Path Converter

Path converters¶
The following path converters are available by default:

str - Matches any non-empty string, excluding the path separator, '/'. 
This is the default if a converter isn’t included in the expression.

int - Matches zero or any positive integer. Returns an int.

slug - Matches any slug string consisting of ASCII letters or numbers, 
plus the hyphen and underscore characters. For example, building-your-1st-django-site.

uuid - Matches a formatted UUID. To prevent multiple URLs from mapping to the same page, 
dashes must be included and letters must be lowercase. For example, 
075194d3-6885-417e-a8a8-6c931e272f00. Returns a UUID instance.

path - Matches any non-empty string, including the path separator, '/'. 
This allows you to match against a complete URL path rather than a segment 
of a URL path as with str.

What the URLconf searches against

The URLconf searches against the requested URL, as a normal Python string. 
This does not include GET or POST parameters, or the domain name.

For example, in a request to https://www.example.com/myapp/, the URLconf will look for myapp/.

In a request to https://www.example.com/myapp/?page=3, the URLconf will look for myapp/.

The URLconf doesn’t look at the request method. In other words, all request methods – POST, 
GET, HEAD, etc. – will be routed to the same function for the same URL.
URLconf가 하는 일은 '도메인 주소 뒤부터 ?전까지'의 string을 가지고 오는 역할이다.

Include()

**include(module, namespace=None)**

**include(pattern_list)**

**include((pattern_list, app_namespace), namespace=None)**

url.py 부문에서 path() 함수를 작성할 때 

 application namespace and instance namespace where the entries will be included into can also be specified.

Usually, the application namespace should be specified by the included module. If an application namespace is set, the namespace argument can be used to set a different instance namespace.
include() also accepts as an argument either an iterable that returns URL patterns or a 2-tuple containing such iterable plus the names of the application namespaces.Parameters:
module – URLconf module (or module name)
namespace (str) – Instance namespace for the URL entries being included
pattern_list – Iterable of [path()](https://docs.djangoproject.com/en/3.1/ref/urls/#django.urls.path) and/or [re_path()](https://docs.djangoproject.com/en/3.1/ref/urls/#django.urls.re_path) instances.
app_namespace (str) – Application namespace for the URL entries being included

Includinig other URLconfs

from django.urls import include, path

urlpatterns = [
    # ... snip ...
    path('community/', include('aggregator.urls')),
    path('contact/', include('contact.urls')),
    # ... snip ...
]
url.py에 조금 더 발전된 형태이다. 

URL dispatcher | Django documentation | Django

0개의 댓글