실질적으로 논리를 담당하는 함수
즉, 어떤 요청이 들어왔을 때
이런 html을 찍어서 보내줘라 라고 하는 동작을 갖고있는 함수를
from django.shortcuts import render
# Create your views here.
def home(request) :
return render(request, 'index.html')
이렇게 만들었다고 가정했을 때,
이제부터 중요한 것은 뭐냐면 이 함수가
즉, index.html을 화면에 보여주세요 라고 하는 이 함수가 언제 실행될지가 더 중요
그것을 urls.py에 정의하면 된다.
urls.py
어떤 url에 요청이 들어왔을 때
views.py는 어떤 함수를 실행시킬지를 ulrs.py 안에 적어주면 된다.
다시 말해서
현재 만든 django 웹 서비스의 url은, 주소는 http://127.0.0.1:8000/ 이다.
아까 이 주소로 들어갔을 때 장고 웹서비스가 실행이 되었다.
그렇기 때문에 현재 장고 프로젝트의 웹서비스 주소는 http://127.0.0.1:8000/ 이다.
그런데 만약에 요청이
http://127.0.0.1:8000/1 에 대해서 요청이 들어올 수 있고
http://127.0.0.1:8000/abc/1 이런 식으로 요청이 들어올 수 있다.
이런 식으로 주소 뒤에 슬래시(/) + ~ 에 해당하는
슬래시 뒤에 해당하는 요소를 앞에다가 써주면 된다.
예를 들어서
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
path('/test', FUNCTION),
]
현재 주소는 http://127.0.0.1:8000/
/test 에 어떤 요청이 들어온다면 FUNCTION이라고 하는 함수를 실행시켜라 라는 뜻이다.
(http://127.0.0.1:8000/test)
from django.contrib import admin
from django.urls import path
import myapp.views
urlpatterns = [
path('admin/', admin.site.urls),
path('/foo', myapp.views.count),
]
웹 서비스 주소는 http://127.0.0.1:8000/
/foo라고 url에 대해서 요청이 들어왔을 때 (http://127.0.0.1:8000/foo)
바로 뒤에 있는 이 함수(myapp.views.count)를 실행시켜라 라는 뜻
myapp 안에 있는 views.py 라고 하는 파이썬 파일 안에 있는 count라는 함수를 실행시켜라
라고 하는 뜻이다.
마찬가지로
from django.contrib import admin
from django.urls import path
import myapp.views
urlpatterns = [
path('admin/', admin.site.urls),
path('', myapp.views.home),
]
아무것도 입력하지 않았을 때
즉, 이 주소에 대해서 요청이 들어온다면 ( http://127.0.0.1:8000/ )
myapp이라고 하는 폴더 안에 있는 views.py 이라고 하는 파이썬 파일 안에있는 home이라는 함수를 실행시켜라
라고 하는 뜻이다.
myapp.view.home을 잘 찾게 하기위해서
import myapp.views 이런 식으로 import를 해온 것이다.
만약에 import를 작성하지 않으면 myapp이 무엇인지 모르게 된다.
(다른 폴더에 위치하고 있으므로)
Q & A
path('/test', FUNCTION),
FUNCTION이라고 하는 함수를 실행
path('/foo', myapp.views.count)
myapp 안에 있는 views.py 라고 하는 파이썬 파일 안에 있는 count라는 함수를 실행
해석하기
path('admin/', admin.site.urls),
admin 안에 있는 site.py라고 하는 urls라는 함수를 실행?
이라고 하기엔 admin안에 아무것도 적혀있지 않는데 어떻게 해석해야하는건가요??
admin 내부에 코드는 이곳에서 확인 가능합니다.
위의 링크를 통해 확인해보면 알겠지만,
admin이라는 것은 폴더 이름에 불과하고 내부에 urls.py와 같이
굉장히 많은 수의 파이썬 파일들을 관리하고 있고,
저희가 그 중에 일부를 가져와 사용하는 것을 알 수 있습니다.
include
path('boards/', include('board.urls')),
여기서는 include를 넣어서 함수가 아닌 파일이라고 알 수 있는 건가요?
include의 사용법을 물어보셨는데요.
해당 단어가 뜻하는 바가 "포함하다"라는 의미인 것처럼
board라는 앱 폴더 내부의 urls.py 파일을 해당 경로에 포함시키는 것을 의미합니다.
저희는 include함수에 문자열로 값을 입력하지만,
include함수가 문자열 매개변수를 받으면
내부에서 해당 매개변수를 해석 후, 경로를 찾아가 urls.py 내용을 읽어오는 것을 알 수 있습니다.
Q3)
from django.contrib import admin
from django.urls import path, include
from myapp import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.first),
path('second/', views.second),
path('products/', include('product.urls')),
path('boards/', include('board.urls')),
]
위처럼 path가 많을 때 여기서 이건 함수다 이건 urls.py다라고 알 수 있는 포인트는 어디일까요?
마지막 Q3에서 물어본 것이 조금 혼동이 되는데,
기본적으로 해당 부분에서 수강생님이 언급한 모든 내용이 urls.py에 포함되어 있는 것이고,
그 중 일부를 path라는 함수를 사용해 도메인 경로로 활용하는 것이라 보면 되겠습니다.
질문에 대한 답만 모아보기
admin 내부에 코드는 이곳에서 확인 가능합니다.
위의 링크를 통해 확인해보면 알겠지만,
admin이라는 것은 폴더 이름에 불과하고 내부에 urls.py와 같이
굉장히 많은 수의 파이썬 파일들을 관리하고 있고,
저희가 그 중에 일부를 가져와 사용하는 것을 알 수 있습니다.
그리고 include의 사용법을 물어보셨는데요.
해당 단어가 뜻하는 바가 "포함하다"라는 의미인 것처럼
board라는 앱 폴더 내부의 urls.py 파일을 해당 경로에 포함시키는 것을 의미합니다.
저희는 include함수에 문자열로 값을 입력하지만,
include함수가 문자열 매개변수를 받으면
내부에서 해당 매개변수를 해석 후, 경로를 찾아가 urls.py 내용을 읽어오는 것을 알 수 있습니다.
마지막 Q3에서 물어본 것이 조금 혼동이 되는데,
기본적으로 해당 부분에서 수강생님이 언급한 모든 내용이 urls.py에 포함되어 있는 것이고,
그 중 일부를 path라는 함수를 사용해 도메인 경로로 활용하는 것이라 보면 되겠습니다.
그리고 이렇게만 하면 어떤 url인지 잘 모르므로
url path에 대한 이름을 임의로 작성해줄 수 있다.
from django.contrib import admin
from django.urls import path
import myapp.views
urlpatterns = [
path('admin/', admin.site.urls),
path('', myapp.views.home, name='hello_world'),
]
hello_world는 url의 이름이라고 보면 된다.
(써도 그만 안써도 그만이긴 하다.)
http://127.0.0.1:8000/ 으로 get 요청을 보내면
주소 뒤에 아무것도 없기 때문에 myapp.views.home 함수가 실행될 것이다.
myapp.views.home 함수는
myapp안에 있는 views.py 파일 안에있는 home이라는 함수
home 함수는 index.html을 띄워주는 함수이다.
어떤 요청이 들어왔을 때 그것을 받고
index.html 이라고 하는 html 파일을 보여주는 함수
→ http://127.0.0.1:8000/ 이 주소 창을 실행 시키면 index.html의 페이지가 나타난다.
❗ 순서가 중요하다 ❗
오류가 뜰 때 (TemplateDoesNotExist)

처음 실행했을 때 위와 같은 오류가 떴다.
코드를 잘 못 입력했나 싶었는데 알고보니
settings.py의 installed_app 부분에
myapp 애플리케이션 파일 이름을 작성해 넣지 않아서 생긴 오류였다.

TemplateDoesNotExist 에러의 경우,
installed_app에서 애플리케이션 폴더 이름을 작성하지 않았을 때 발생하는 에러이다.

다른 예시를 들어본다.
urls.py
from django.contrib import admin
from django.urls import path
import myapp.views
urlpatterns = [
path('admin/', admin.site.urls),
path('', myapp.views.home, name='hello_world'),
path('test/', myapp.views.test),
]
views.py
from django.shortcuts import render
# Create your views here.
def home(request) :
return render(request, 'index.html')
def test(request) :
return render(request, 'test.html')
html 만들기
* templates 폴더 아래에 생성
서버를 켜본다.
/test라고 요청을 보내면 어떤 순서로 장고가 동작할까?
/test 에 매칭되는 url이 있는지 먼저 찾아보고
있으면 myapp.views.test 함수를 실행 urls.py
myapp.views.test 함수는 뭐지? → test.html을 찍어서 보내주는 함수 veiws.py
test.html은 뭐지? → 얘구나! test.html
라는 식으로 동작한다.
동작의 순서가 중요하다
'Django' 카테고리의 다른 글
Django 뜯어보기(3) (0) | 2021.07.25 |
---|