본문 바로가기
장고

App생성

by 자동매매 2023. 4. 12.

출처 : https://wikidocs.net/70649

 

2-01 URL과 뷰

* `[완성 소스]` : [github.com/pahkey/jump2django/tree/2-01](https://github.com/pahkey/jump2django/tree/…

wikidocs.net

 

작업 순서

1.  startapp명령을 사용하여 폴더 및 관련 파일 생성

2. settings.py파일에 app 등록

3. views.py 정의

4. urls.py 정의 (project urls.py 및 app urls.py)

 

작업 내역

http://localhost:8000/pybo 페이지를 요청했을 때 "안녕하세요 pybo에 오신것을 환영합니다."라는 문자열을 출력하도록 만들어 보자.

 

게시판 App 생성 (pybo)

(mysite) C:\projects\mysite> django-admin startapp pybo

 

생성파일 설명

1.    admin.py is a configuration file for the built-in Django Admin app

2.    apps.py is a configuration file for the app itself

3.    migrations/ keeps track of any changes to our models.py file so our database and models.py stay in sync

4.    models.py is where we define our database models which Django automatically translates into database tables

5.    tests.py is for our app-specific tests

6.    views.py is where we handle the request/response logic for our web app

 

app등록

대상파일 : config / setting.py

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    # Local App
    "pybo.apps.PyboConfig",
    
]

 

 

runserver 후 http://127.0.0.1:8000/pybo접속시 에러 발생

[ 원인 ] url 매핑 안됨[해결책]

config/urls.py 파일에 pybo/ URL에 대한 매핑을 추가하는 것이다. 장고의 urls.py 파일은 페이지 요청이 발생하면 가장 먼저 호출되는 파일로 URL과 뷰 함수 간의 매핑을 정의한다. 뷰 함수는 views.py 파일에 정의된 함수를 말한다.

 

urls.py

URL 매핑을 추가하기 위해 config/urls.py 파일 수정

[파일이름: projects/mysite/config/urls.py]

from django.contrib import admin
from django.urls import path

from pybo import views

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

pybo/ URL이 요청되면 views.index를 호출하라는 매핑을 urlpatterns에 추가하였다. views.index는 views.py 파일의 index 함수를 의미한다.( URL 매핑시 항상 끝에 슬래시를 붙여 주도록 하자.)

1. views 모듈 import

2. pybo/ 를 views.index함수와 매핑 - path('pybo/', views.index)

 

views.py

위에서 지정한 index함수 정의 필요

[파일이름: projects/mysite/pybo/views.py]

from django.http import HttpResponse


def index(request):
    return HttpResponse("안녕하세요 pybo에 오신것을 환영합니다.")

views.py
0.00MB

 

index 함수의 매개변수 requestHTTP 요청 객체이다. 

이렇게 뷰 함수를 작성하고 다시 http://localhost:8000/pybo 페이지를 요청해 보자.

다음과 같은 결과를 볼 수 있을 것이다.

 

장고 개발 흐름 정리하기

지금 여러분이 경험한 개발 과정은 앞으로의 실습 과정에서 여러 번 반복될 것이다. 그만큼 이 과정은 중요하다!

장고의 기본적인 흐름을 다시 정리해 보자.

  • [1] 브라우저에서 로컬 서버로 http://localhost:8000/pybo 페이지를 요청하면
  • [2] urls.py 파일에서 /pybo URL 매핑을 확인하여 views.py 파일의 index 함수를 호출하고
  • [3] 호출한 결과를 브라우저에 반영한다.

 

URL 분리

App내 urls.py를 통한 경로지정

[파일이름: projects/mysite/config/urls.py]

from django.contrib import admin
from django.urls import path, include
from pybo import views  # 더 이상 필요하지 않으므로 삭제

urlpatterns = [
    path('admin/', admin.site.urls),
    path('pybo/', include('pybo.urls')), 
]

urls.py
0.00MB

 

pybo/ URL에 대한 매핑을 path('pybo/', views.index) 에서 path('pybo/', include('pybo.urls'))로 수정했다.

path('pybo/', include('pybo.urls'))의 의미는 pybo/로 시작하는 페이지를 요청하면 이제 pybo/urls.py 파일의 매핑 정보를 읽어서 처리하라는 의미이다.

따라서 이제 pybo/question/create, pybo/answer/create 등의 pybo/로 시작하는 URL을 추가해야 할 때 config/urls.py 파일을 수정할 필요없이 pybo/urls.py 파일만 수정하면 된다.

 

그렇다면 이제 pybo/urls.py 파일을 생성해야 한다.

[파일이름: projects/mysite/pybo/urls.py]

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index),
]

urls.py
0.00MB

 

기존 config/urls.py 파일에 설정했던 내용과 별반 차이가 없다.

다만 path('', views.index) 처럼 pybo/ 가 생략된 '' 이 사용되었다.

'pybo/' + '' = 'pybo/'
'pybo/' + 'question/create/' = 'pybo/question/create/'

 

이제 다시 http://localhost:8000/pybo 페이지를 요청해 보자. URL 분리 후에도 동일한 결과가 나타나는 것을 확인할 수 있을 것이다.

 

[ 참조 ] Django request/response cycle :

 

URL -> View -> Model -> Template

 

The main takeaway here is that in Django views determine what content is displayed on a given page while URLConfs determine where that content is going. The model contains the content from the database and the template provides styling for it.

 

 

 

# Django에서는 하나의 단일 페이지 생성에 필요한 최소 파일 - urls.py , views.py , models.py  및  index.html와 같은 HTML 템플릿

 

 

위의 예에서 views.py를 수정하여 hellow.html파일 열기

 

1. render함수를 이용한 함수view

from django.shortcuts import render

def index(request):
    return render(request, 'pybo/hello.html')
 
 

2. class view

 

1) pybo/urls.py -  as_view()함수를 이용
 
from .views import HomePageView

urlpatterns = [
    path('', HomePageView.as_view(), name='home'),
]

 

2) pybo/view.py - template_name을 이용하여 나타낼 html파일 지정

 

from django.views.generic import TemplateView

class HomePageView(TemplateView):
    template_name = 'pybo/hello.html'

 

'장고' 카테고리의 다른 글

[ Django ] 기타 설정  (0) 2023.05.03
[ Django ] 내장 인증  (0) 2023.05.03
[ Django ] django Views  (0) 2023.05.02
[ Django ] Index  (0) 2023.05.02

댓글