본문 바로가기
코딩기록/Python

Django - 2. 기능 작성방법

by CiON 2023. 3. 5.

기능 작성방법

백엔드로 처리할 기능을 만들기 위해서는 각 기능별로 app을 생성해서 관리한다.

명령 프롬포트에서 기능을 추가할 프로젝트의 manage.py에 app을 추가해 여러 기능을 추가하고 관리할 수 있다.

py manage.py startapp example_appname

이렇게 하면 새로운 app의 이름을 가진 폴더가 새로 생성되고 이러한 기능이 있다는 것을

가장 상위폴더의 settings.py안에 선언함으로 써 그 기능을 구현할 수 있다.

기존에 사용 중이던 기능을 잠깐 꺼두고 싶다면 여기서 해당 코드를 주석처리 하면 간단히 끌 수 있다.

...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'example_appname', # 이 곳에 새로운 app의 이름을 계속해서 추가해준다.
]
...

 

이렇게 생성된 기능 폴더안의 models.py, views.py 등을 이용하여 기능을 작성하면 된다.


Urls.py와 Views.py의 작성방법

기본적인 기능 작성방법은 다음과 같다. 일단 요청을 받는 views.py부터 살펴보자.

from django.http import HttpResponse

def hello_world(request):
    return HttpResponse("Hello, World")

위와 같이 views.py안에 def로 사용자함수를 생성한 다음 request를 받을 경우 응답할 return 코드를 작성해준다.

이렇게 하면 특정 주소에 접속하여 hello_world라는 기능이 호출되면 "Hello, World"가 반환될 것이다.

이제 이 특정주소에 hello_world 함수를 매핑해준다. 이 작업은 메인폴더안의 urls.py에서 설정이 가능하다.

 

여기서 짚고 넘어가야 하는게, 장고프로젝트가 커지고 기능이 많아질 수록 메인 urls.py에서 모든 매핑주소를

관리하게 되면 작성자도 헷갈리고 유지보수 하기에도 복잡해진다. 그래서 보통 각 기능(app)안에 urls.py를

수동으로 생성하여 기능별 매핑은 로컬에서 관리하고 메인 urls.py에 값을 넘겨주는 방식으로 코딩하는게 일반적이다.

# 메인폴더 안의 종합관리 urls.py 

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('example/', include('example_appname.urls')),
   #path('주소창에 표시되는 주소/', include('app이름.urls')),
]
# 기능(app) 폴더안의 로컬관리 urls.py

from django.urls import path
from example_appname.views import hello_world # views.py에 작성된 함수를 호출

app_name = "example_appname"

urlpatterns = [
    path('hello_world/', hello_world, name="hello_world"),
]

urlpatterns 안에 path를 작성하고 첫 번째는 입력할 주소의 경로, 두번째는 어떤 값을 불러올지 코딩한다.

로컬 urls.py는 메인 urls.py와 다르게 app_name이 무엇인지를 선언해야 한다. 


Views.py와 Template 작성방법

Template는 표시할 웹 페이지 파일(html)들을 저장해두는 공간이다.

그림과 같이 veiws.py는 명령에 따라 매핑되어 있는 Template 파일을 사용자에게 반환하게 된다.

기본적으로 Templates폴더는 생성되어 있지 않으므로 사용자가 수동으로 최상위 디렉토리에 직접 폴더를 만든다.

 

그리고 그 폴더(templates)안에 사용할 .html 파일들을 저장/작성한다. ( EX : base.html )

 

그 후, 장고가 호출할 html 파일이 어디있는지를 알 수 있게

app폴더 안의 settings.py에 있는 TEMPLATES 디렉토리안에 위치를 적어주면 된다.

# app 폴더안의 settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], # 폴더이름 명기 (최상위 경로)

이렇게 경로까지 설정해두면 기능(app)안에서 views.py에 매핑할 수 있도록 템플릿을 불러올 수 있다.

from django.http import HttpResponse
from django.shortcuts import render

def hello_world(request):
   #return HttpResponse("Hello, World") # 기존코드
    return render(request, 'base.html') # html을 호출

Views.py와 Models.py의 작성방법

models.py는 views.py에서 요청을 받아 필요에 따라 DB에 접근할 수 있는 기능을 담당하고 있다.

DB(Database) 설정은 프로젝트 폴더 안의 settings.py에서 확인할 수 있고 변경도 가능하다.

...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', 
        	# ‘django.db.backend.mysql’ / ‘django.db.backend.oracle’ ...
        'NAME': BASE_DIR / 'db.sqlite3', # DB종류는 sqlite3
    }
}
...

 

이렇게 설정된 데이터베이스에 호출된 html 페이지에서 사용자로 부터 동적으로 정보를 입력받아 저장하기 위해선 models.py에 어떤식으로 데이터를 입력받고 (Domain) 처리할 것인지를 프로그래밍 해 두어야 한다.

 

models.py의 기능을 DB와 연동하기 위해선 먼저 해당 app의 manage.py파일의 migration이 요구된다.

장고는 ORM을 사용하기 때문에 models.py와 class를 통해 DB스키마를 생성하고 관리하게 되는데

이 때 DB스키마를 Git처럼 버전을 나누어 관리할 수 있게 해주는 시스템을 migration이라 생각하면 된다.

py manage.py migarte # 경로주의!!

 

기록할 정보에 대한 클래스를 models.py에 작성해준다. 예를 들어 단순한 설문조사

기능(app)을 만든다고 가정하면 다음과 같이 models.py에 2개의 모델을 정의할 수 있다.

from django.db import models

class Question(models.Model): # 설문항목 저장
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
	# 필드이름 = models.필드의 데이터 형식 지정

class Choice(models.Model):  # 항목에 대한 응답저장
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
	# 외래키(ForeignKey를 통해 Question의 질문을 받아와 연결시킴)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

클래스가 정의 되었으면 admin.py에 등록한다. 서버를 동작시켰을 때 관리자 화면에서 해당 DB를 관리할 수 있다.

# 프로젝트의 admin.py

from django.contrib import admin 
from example_appname.models import Question # admin에 클래스를 등록해야 정상사용가능
from example_appname.models import Choice

admin.site.register(Question) # 등록해놔야 관리자모드에서 테이블 관리 가능
admin.site.register(Choice)

터미널에서 makemigration 명령을 통해 데이터베이스내에 해당 기능을 저장한다.

py manage.py makemigrations

성공적으로 끝나면 기능/migrations/ 경로안에 0001_initial.py가 생성된 것을 확인할 수 있다.

이 파일은 DataBase안에 테이블을 생성하기 위한 설계도 파일이다.

 

migrate 명령을 통해 버전을 업데이트 하고 설정을 마무리 한다.

py manage.py migrate

서버구동

migrate 명령어를 이용해 기본적인 사용자와 그룹을 생성한다.

py manage.py migrate

createsuperuser 명령을 이용해 관리자를 생성한다.

이때 비밀번호는 입력해도 안보이니 당황하지 않고 간단한 비밀번호를 입력해주면 된다.

py manage.py createsuperuser

Username : 
Email address : 
Password : 
Password (again) : 
Bypass password validation and create user anyway? [y/N] : y

다 끝났으면 터미널에서 runserver 명령어를 이용해 서버를 실행시킨다.

포트번호는 자유롭게 변경 가능하지만 따로 선언하지 않으면 기본적으로 8000을 사용한다.

py manage.py runserver

오류가 뜨지 않고 정상적으로 서버가 구동된다면 웹에서 127.0.0.1:8000 주소를 입력해 구동상태를 확인할 수 있다.

주소 뒤에 admin을 입력 (127.0.01:8000/admin)하면 관리자 모드로 접속이 가능한데, 이때 위에서 설정한 ID와 PW를 사용하여 접속하면 된다.

 

 

[python] 잘못된 http_host 헤더 - 리뷰나라

Django 프레임 워크를 사용하여 웹 사이트를 개발하고 DigitalOcean.com을 사용하여 시작하고 필요한 파일을 django-project에 배포했습니다. Django-project에 정적 파일을 포함시켜야했고 정적 파일을 수집

daplus.net

 

'코딩기록 > Python' 카테고리의 다른 글

Basic Python  (0) 2024.01.11
Django - 1. 개요와 설치  (0) 2023.01.17

댓글