통합검색

Python

Python Django 의 views.py 분리 및 urls.py 처리 방법



Python Django를 설치 후 프로젝트 디렉토리 내의 views.py 와 urls.py로 라우팅하여 웹페이지로 띄우게 되는데,
웹페이지의 수가 증가할 수록 코드가 길어져 식별이 어려워지게 된다.
이번 글에서는 views.py를 원하는 디렉토리에 여러개로 분산시키고 urls.py로 라우팅 하는 방법을 안내한다.



[!]사전 작업 환경[/!]
views.py 와 urls.py 분리 작업에 앞서 현재 구성된 django 프로젝트의 환경을 요약해 본다.

- 외부접속주소 : http://py.chanyeongpark.com
- project경로 : /home/py/public_html/testproject/
- views.py / urls.py경로 : /home/py/public_html/testproject/testproject/
- app 경로 : /home/py/public_html/testproject/testapp/

현재 /home/py/public_html/testproject/testproject/ 내에 위치한 views.py를 통해 template과 결합되고,
urls.py를 통해 py.chanyeongpark.com 으로 외부 접속시 index 화면이 노출되고 있다.

[현재 views.py]


[현재 urls.py]





[!]project 메인 urls.py 설정[/!]
project 의 메인 urls.py 에서 app 디렉토리에 추가로 생성할 urls.py로 라우팅할 수 있도록 설정한다.
프로젝트 설정 폴더로 이동하여 urls.py를 vi로 연다.
 
# cd /home/py/public_html/testproject/testproject
# vi urls.py

vi로 urls.py에 아래와 같이 app urls.py로 라우팅해주는 구문을 추가한다.
  
from django.contrib import admin
from django.urls import path, include
from . import views

urlpatterns = [
    path('views/', include('testapp.urls')),
    path('admin/', admin.site.urls),
    path('', views.index, name='index'),
]

urlpatters 에 
path('views/', include('testapp.urls')),
가 추가 되었으며,  접속하는 url이 http://py.chanyeongpark.com/views/* 와 같은 경우 
testapp 앱의 urls.py로 이관하게 된다.




[!]app 디렉토리에 views.py, urls.py 추가 생성[/!]
프로젝트 urls.py에서 이관 받아 매핑 처리할 views.py와 urls.py를 앱 디렉토리내에 추가 생성하도록 한다.
아래와 같이 앱 디렉토리로 경로 이동 후 views.py 파일들을 몰아 넣을  디렉토리를 하나 만든다.
 
# cd /home/py/public_html/testproject/testapp/
# mkdir views

vscode 등에서 작업할 수 있도록 호스팅 user(py) user에게 적절한 권한을 부여한다.
 
# chown -R py.py views
# chmod -R 705 views

views 디렉토리로 들어가
새로운 views 파일 ( basic_views.py / test_views.py )을 생성한다.
 
# cd views
  
# vi basic_views.py

basic_views.py는 아래 내용으로 작성한다.
basic_views.py는 http://py.chanyeongpark.com/views/ 로 접속시 화면 출력을 담당한다.
 
from django.shortcuts import render

def index(request):
    return render(request, 'index.html')
 
test_views.py를 하나 더 만든다.
test_views.py는 http://py.chanyeongpark.com/views/test 로 접속시 화면 출력을 담당한다.
  
# vi test_views.py
 
from django.shortcuts import render

def test(request):
    return render(request, 'views/test.html')

views 파일을 생성 했다면, 그 다음
urls.py 추가 생성을 위해 앱 디렉토리로 이동한다.
 
# cd ../
(또는)
# cd /home/py/public_html/testproject/testapp
 
vi 로 urls.py 를 작성한다.
 
# vi urls.py
 
urls.py 내용은 아래와 같다.
 
from django.urls import path
from .views import basic_views, test_views

app_name = 'testapp'

urlpatterns = [
    path('', basic_views.index, name='index'),
    path('test', test_views.test, name='test'),
]
 
from .views import basic_views, test_views
'app디렉토리 > views' 디렉토리 내의 basic_views.py 와 test_views.py 파일을 import 시키는 구문이다.

app_name = 'testapp' 통해 app 이름을 명시한 뒤 urlpatters 를 추가한다.
이 때, http://py.chanyeongpark.com/views/test 로 URL을 매핑을 해야 하는데 '/views' 가 urlpatterns 에 명시되지 않은 이유는,
프로젝트 메인경로의 urls.py 에서 매핑하여 app디렉토리의 urls.py 로 라우팅 해줬기 때문이다.

views 파일이 views 디렉토리에 새로 생성 되었으니,
app 디렉토리의 기본 views.py는 필요가 없어졌으니 삭제 한다.
 
# rm -rf /home/py/public_html/testproject/testapp/views.py
  




[!]app 에 template 생성[/!]
앞서 생성한 앱의 views 파일에서 결합된 template 파일 생성을 위해 app의 templates 경로로 이동한다.
 
# cd /home/py/public_html/testproject/testapp/templates
  
templates 경로에 
http://py.chanyeongpark.com/views/ 와 결합될 index.html 템플릿을 생성한다.
(경로는 앞서 작성한 basic_views.py 에서 명시한 경로와 일치해야 한다.)
 
# vi index.html
(내용은 'Hello World 1' 로 했다.)
  
그런 다음,
디렉토리를 하나 더 만들어 http://py.chanyeongpark.com/views/test 와 결합될 템플릿을 하나 더 만든다.
(경로는 앞서 작성한 test_views.py 에서 명시한 경로와 일치해야 한다.)
  
# mkdir views
# vi views/test.html
(내용은 'Hello World 2' 로 했다.)
  
현재까지 작성된 파일들의 구조는 아래 화면과 같다.


  




[!]브라우저에서 테스트 해보기[/!]
urls.py가 제대로 매핑 되는지 웹브라우저에서 접속해 본다.

[http://py.chanyeongpark.com/views/ & http://py.chanyeongpark.com 출력 결과]

http://py.chanyeongpark.com 의 경우 프로젝트의 urls.py에서 앱의 urls.py에서 설정한 index와 같은 템플릿 파일로 설정되어 있기 때문에
http://py.chanyeongpark.com/views/ 와 같은 화면을 호출하고 있다.


[http://py.chanyeongpark.com/views/test 출력 결과]