[Django] URL과 VIEW

ITmakesmeSoft·2022년 10월 29일
0

Django

목록 보기
4/10

요청과 응답

  • 장고는 URL → VIEW → TEMPLATE 순으로 요청이 이루어지고 역순으로 데이터가 반환됨
  • 개발 과정 또한 urls.pyviews.py → templates 순으로 진행

urls.py

  • 페이지 요청이 발생하면 가장 먼저 호출되는 파일로, URL과 VIEW 함수 간의 매핑을 정의함. (여기서 VIEW 함수는 views.py 파일에 정의된 함수를 지칭)
    from django.contrib import admin
    from django.urls import path
    ***from myapps import views***
    
    **urlpatterns** = [
        path('admin/', admin.site.urls),
        path('myapps/', views.index),
    ]
  • myapps/ URL이 요청될 경우 views.index를 호출하라는 매핑을 urlpatterns에 추가
  • 여기서 views.index는 views.py 파일의 index함수를 의미

views.py

  • HTTP 요청을 수신하고 HTTP 응답을 반환하는 함수 작성.
  • Template에게 HTTP 응답 서식을 맡김
    from django.http import HttpResponse
    
    def index(request):
        return HttpResponse("안녕하세요 pybo에 오신것을 환영합니다.")
  • render()
    from django.shortcuts import render
    
    def index(request):
        return render(request, template_name, context)
    • httpResponse 객체를 반환하는 함수로, 템플릿을 context와 엮어 httpResponse로 쉽게 반환하도록 하는 함수
    • request : 응답을 생성하는 데 사용되는 요청 객체 (필수)
    • template_name : 템플릿의 전체 이름 또는 템플릿 이름의 경로 (필수)
    • context : 템플릿에서 사용할 데이터(딕셔너리 타입으로 작성) (선택)

URL 분리

App URL mapping

  • 각 앱의 view 함수를 다른 이름으로 import 할 수 있음
  • 하나의 프로젝트에 여러 앱이 존재할 경우, 각각의 앱 안에 urls.py를 만들고 프로젝트 urls.py에서 각 앱의 urls.py로 URL 매핑을 위탁할 수 있음
  • urlpattern은 언제든지 다른 URLconf모듈을 포함(include)할 수 있음
  • include되는 앱의 urls.py에 urlpatterns가 작성되어 있지 않다면 에러 발생

include()

  • 다른 URLconf(app1/urls.py)들을 참조할 수 있도록 돕는 함수
  • 함수 include()를 만나게 되면 URL의 그 시점까지 일치하는 부분을 잘라내고, 남은 문자열 부분을 후속 처리하기 위해 include된 URLconf로 전달

URL patterns

  • 링크에 URL을 직접 작성하는 것이 아닌, path() 함수의 name인자를 정의해서 사용
  • DTL의 Tag 중 하나인 URL 태그를 사용하여 view 함수와 템플릿에서 특정 주소를 쉽게 참조 가능
    {% url ' ' %}
  • 주어진 URL 패턴 이름 및 선택적 매개 변수와 일치하는 절대 경로 주소를 반환
urlpatterns = [
    path('index/', views.index, name='index'),
    path('pages/', views.pages, name='pages'),
]
<form action="{% url 'index' %}" method="GET">
    <label for="message">Order</label>
    <input type="text" name="message" id="message">
    <input type="submit">
</form>

URL namespace

  • 프로젝트의 규모가 커지고 앱이 많아짐에 따라 URL 이름이 중복되어 클릭시 원하는 페이지로 이동하지 않는 경우 발생
  • URL namespace(이름 공간)를 사용하면 서로 다른 앱에서 동일한 URL 이름을 사용하는 경우에도 이름이 지정된 URL을 고유하게 사용할 수 있음 {% url ‘*<app name>*:index’ %}
  • 단 app_name을 지정한 이후에는 url 태그에서 app_name:url_name 형태로만 사용해야 함
    app_name = 'articles'
    urlpatterns = [
        path('index/', views.index, name='index'),
    ]
    	<form action="{% url 'articles:index' %}" method="GET">
       ...

Template namespace

  • Django는 중복된 이름의 템플릿 파일이 존재하는 경우 templates의 기본 경로가 app_name/templates로 고정되어 있어, settings.py의 INSTALLED_APPS에 작성된 app 순서로 template를 검색 후 렌더링 하게 됨
  • templates 폴더 내부에 디렉토리를 생성하여 물리적인 이름공간을 구분하면 문제를 해결할 수 있음
    app_name/templates/app_name
    ```
    articles/
    		templates/
    				articles/
    						index.html
    						...
    pages/
    		templates/
    				pages/
    						index.html  | 파일 이름이 중복되어도 디렉토리를 통해 구분되어 문제발생 X
    						...
    ```

Query String Parameters

  • 사용자가 입력 데이터를 전달하는 방법 중 하나로, URL 주소에 데이터를 파라미터를 통해 넘기는 것
  • 이러한 문자열은 앰퍼샌드(&)로 연결된 key=value 쌍으로 구성되며 기본 URL과 물음표(?)로 구분됨

Trailing Slashes

  • Django는 URL 끝에 ‘/’가 없다면 자동으로 붙여주는 것이 기본 설정
  • 기술적인 측면에서 foo.com/barfoo.com/bar/는 서로 다른 URL임
  • Django는 URL 정규화를 통해 복수의 페이지에서 같은 콘텐츠가 존재하는 것을 방지
  • URL 정규화는 검색엔진 최적화에도 도움됨

Variable routing

  • URL 주소를 변수로 사용하는 것을 의미
  • URL의 일부를 변수로 지정하여 view함수의 인자로 넘길 수 있음
  • 변수는 ‘<>’에 정의
    # urls.py
    urlpatterns = [
    		...
    		path('hello/<name>/'. views.hello)
    ]

예제로 배우는 파이썬 프로그래밍 - URL 매핑

profile
💎 Daniel LEE | SSAFY 8th

0개의 댓글