반응형

@ path()

path(route, view, kwargs=None, name=None)

from django.urls import include, path

urlpatterns = [
    path("index/", views.index, name="index"),
    path("book/<name>/", views.book_detail, name="book_detail"),
    path("articles/<slug:title>/", views.article, name="article-detail"),
    path("articles/<slug:title>/<int:section>/", views.section, name="article-section"),
    path("blog/", include("blog.urls")),
    ...,
]

 

 

@ re_path() - route에 regex 패턴을 적용

re_path(route, view, kwargs=None, name=None)

from django.urls import include, path

urlpatterns = [
    re_path(r"^index/$", views.index, name="index"),
    re_path(r"^book/(?P<name>\w+)/$", views.book_detail, name="book_detail"),
    re_path(r"^blog/", include("blog.urls")),
    ...,
]

 

 

@ include()

include(module, namespace=None)

include(pattern_list)

include((pattern_list, app_namespace), namespace=None)

 

 

@ reverse()

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)

 

<app>/urls.py

from django.urls import include, path
from . import views

urlpatterns = [
    path("test/", views.test, name="name-test")
]

 

 

<app>/views.py

from django.urls import reverse
from django.http import HttpResponse

def test(reqeust):
    return HttpResponse("Hello World!")

# using the named URL
# will return "index/"
reverse("name-test")

# passing a callable object
# will return "index/"
reverse(test)

 

 

@ url namespace - case 1

 

<app>/urls.py

from django.urls import include, path
from . import views

app_name = "poll"
urlpatterns = [
    path("test/", views.test, name="name-test")
]

 

 

<app>/views.py

from django.urls import reverse
from django.http import HttpResponse

def test(reqeust):
    return HttpResponse("Hello World!")

# using the named URL with app_name
# will return "index/"
reverse("poll:name-test")

 

 

@ url namespace - case 2

 

<config>/urls.py

from django.urls import include, path

urlpatterns = [
    path("poll/", include(("poll.urls", "url_name_space"))
]

 

include에 module 혹은 module name으로 매핑하는 경우에는 namespace는 <app>/urls.py 에 있는 app_name 이 우선 적용된다. 즉, <app>/urls.py 에 app_name 이 있으면 <app_name>:<path_name> 형식

ex) reverse("poll:name-test")

만약 <app>/urls.py 에 app_name이 없다면 <app_namespace>:<path_name> 이 된다.

ex) reverse("url_name_space:name-test")

 

 

@ url namespace - case 3

 

<config>/urls.py

from django.urls import include, path
from poll.urls import urlpatterns as poll_urlpatterns

urlpatterns = [
    path("poll/", include((poll_urlpatterns, "url_name_space"))
]

 

include에 urlpattern 을 매핑하는 경우에는 <app>/urls.py 전체가 로딩되지 않고, <app>/urls.py/urlpatterns만 읽어서 등록하기 때문에, namespace는 <config>/urls.py 에 있는 app_namespace (여기서는 "url_name_space") 가 적용이 된다. <app_namespace>:<path_name> 형식

ex) reverse("url_name_space:name-test")

 

 

@ url in Django Template

 

Template 에서는 url 키워드를 이용해서 reverse와 같은 결과를 받아올 수 있다. 

<a href="{% url 'poll:name-test' %}">Poll Test</a>

 

 

요약

1. python 코드에서는 url path를 가지고 오기 위해서는 reverse() 를 사용

2. reverse에서 사용하는 namespace는 include를 등록하는 방식에 따라서 약간 차이가 있음.

    - urlpatterns 형식으로 등록했다면, 등록할 때 사용한 app_namespace를 적용

    - module 혹은 module name 으로 등록했다면, 모듈에 있는 app_name이 우선 적용됨

3. Template 에서는 url path를 가지고 오기 위해서 'url' 을 사용

반응형
반응형

 

@ User가 속한 Group 리스트 가져오기

from django.contrib.auth import get_user_model

user = get_user_model().objects.get(username='<username>')
groups = user.groups.all()

 

cf. django.contrib.auth.models.User 를 이용해도 상관 없음

 

 

@ Group에 속한 User 리스트 가져오기

from django.contrib.auth.models import Group

group = Group.objects.get(name='<group_name>')
users = group.user_set.all()

 

 

@ User Group Check

from django.contrib.auth import get_user_model

user = get_user_model().objects.get(username='<username>')

# 유저가 특정 그룹에 속해 있는지 체크
user.groups.filter(name='<groupname>').exists()

# 유저가 그룹 리스트에 속해 있는지 체크
user.groups.filter(name__in=['<groupname1>', '<groupname2>']).exists()

# 유저 instance 없이 체크
get_user_model().objects.filter(username='<username>', groups__name='<groupname>').exists()

 

 

@ User Permission Check

# 유저가 가진 개별 permission 체크
user.user_permissions.filter(codename='<permission_code>').exists()

# 유저가 속한 그룹의 permission 체크
user.groups.filter(permission__codename='<permission_code>').exists()

 

 

@ 대소문자 구분하지 않고 찾기

get_user_model().objects.filter(username__iexact='<usernmae>').exists()

 

반응형

'프로그래밍 > Python - Django' 카테고리의 다른 글

Django URL patterns  (0) 2024.03.17
Django 프로젝트 배포하기  (0) 2024.02.29
Django - Proxy Models  (0) 2023.02.23
Django Tutorial Part 1 - HelloWorld  (0) 2022.11.01
Django - 프로젝트 시작하기  (0) 2022.10.28
반응형

Django 프로젝트를 배포하는 방법은 서비스 규모나 환경에 따라서 여러가지가 있겠지만..

여기서는 단일 서버에 docker를 이용하여 서비스를 운영한다고 가정을 하고 배포하는 상황을 준비하였습니다.

 

 

서비스 구성

기본적으로 source code는 git을 통해서 관리가 되고 있고, 서버에 docker는 이미 설치되어 있다고 가정하겠습니다. 실제 상황에서는 CI/CD 툴을 이용해서 관리하겠지만, 여기서는 Django 프로젝트를 배포하는 것에만 포커스 하도록 하겠습니다.

 

대략적인 서비스 구성은 아래 그림과 같습니다.

 

실제 서비스라면 database도 준비가 되어야겠지만.. 여기서는 docker에서 nginx와 python만 container를 띄울 예정입니다. 여기서 storage는 static 파일들이 들어갈 위치인데요, Django의 경우 운영환경에서는 django app은 wsgi (혹은 asgi) 형태로 서비스를 제공하며, static 파일들은 웹서버가 직접 처리해 주는 형태로 서비스를 하기 때문에, storage를 별도로 지정해 두었습니다.

외부에서 해당 서버에 요청이 오면, 먼저 nginx가 요청을 받아서 처리를 하게 되는데, static 파일 등은 nginx 가 알아서 처리해주고, 그 외에 django app이 처리해야할 부분만 reverse proxy 형태로 전달해 주게 됩니다.

 

 

Django 서비스 배포 절차

Django 서비스를 배포할 때는 다음과 같은 과정들이 필요합니다.

1. python 가상환경 준비 (처음 한번만 필요)

2. 소스 코드 업데이트

3. 의존 모듈 설치

4. static 파일 collect

5. model migration

6. django app service launch

 

다음에는 각각의 작업을 command로 살펴보겠습니다.

 

 

 

Django 서비스 배포 - 디렉터리 설정

위에서 언급하진 않았지만, 여기서는 아래와 같이 디렉터리를 설정해 보았습니다.

 

기본적으로 /opt/docker 폴더에서 각각의 서비스 컨테이너에 대한 폴더를 생성합니다. (nginx, python)

각 서비스 컨테이너 별로 루트에 docker-compose.yaml 파일들을 위치시키게 됩니다.

nginx 에 대해서는 설정파일들은 conf 폴더에 넣을 예정이고, static 파일들은 static 폴더에 넣어 두면 됩니다.

python 도 역시 설정파일들을 conf 폴더에 넣고, 그 외에 필요한 script들은 scripts 폴더에 보관합니다.

그 외에 python 에는 app 폴더를 생성할 예정인데요, app 폴더는 git clone 후에 rename 해서 생성할 예정입니다. 

 

 

Django 서비스 배포 - 가상환경 준비

가상환경은 application 별로 독립된 python 환경을 구성하기 위해서 준비하는 과정인데, docker image를 빌드하는 경우에는 따로 독립된 환경을 사용하지 않아도 되지만, 여기서는 범용 python 이미지를 사용할 예정이기 때문에, local storage에 가상 환경을 생성해서 사용할 예정입니다. command는 다음과 같은데, 가상환경은 python docker container 안에서 실행할 예정입니다.

 

> python -m venv .venv

 

 

Django 서비스 배포 - 소스 코드 업데이트

소스코드 업데이트는 git pull (혹은 clone) 명령어로 처리가 가능합니다. 물론 먼저 서버에 git이 설치가 되어 있어야 합니다.

 

처음 소스를 받아올 때는 clone 명령어를 사용합니다.

 

> git clone <repository url>

 

 

추후에 업데이트 하는 경우에는 pull 명령어를 이용하면 됩니다.

 

> git pull

 

 

Django 서비스 배포 - 의존 모듈 설치

python에서 필요로 하는 모듈을 설치합니다. 로컬 개발환경에서는 간단히 pip 명령어로 처리가 되지만.. 여기서는 가상환경을 이용하기 때문에 아래와 같이 명령어를 입력합니다. 역시 python docker container 안에서 실행되어야 합니다.

 

> ./.venv/bin/python -m pip intstall -r requirements.txt

 

 

Django 서비스 배포 - static 파일 collect

소스 코드 repository 에 넣어둔 static 파일들을 모아주는 과정입니다.여기서는 가상환경을 이용하기 때문에 아래와 같이 명령어를 입력합니다. 역시 python docker container 안에서 실행되어야 합니다.

 

> ./.venv/bin/python manage.py collectstatic --no-input

 

 

Django 서비스 배포 - model migration

모델을 migration 합니다. 실제로는 database 테이블을 생성 또는 변경 하는 과정입니다. 역시 python docker container 안에서 실행되어야 합니다.

 

> ./.venv/bin/python manage.py migrate

 

 

Django 서비스 배포 - django app service launch

django app 서비스를 실행합니다. 앞에서 잠시 언급한데로 wsgi 혹은 asgi 를 이용할 예정이기 때문에, 로컬 개발환경에서와는 조금 다른 명령어를 사용합니다. 역시 python docker container 안에서 실행되어야 합니다. 그리고 host를 지정하지 않으면 127.0.0.1 로 지정이 되는데, 컨테이너 외부에서 접속을 하기 위해서는 0.0.0.0 으로 바인드를 해줘야 합니다. port는 nginx에서 매핑할 예정이기 때문에 크게 중요하지 않아서 default 포트인 8000으로 지정해 주었습니다. 

 

> ./.venv/bin/python -m uvicorn <asgi applcation> --host 0.0.0.0 --port 8000 --workers 4

 

 

참고로 uvicorn을 이용하기 위해서는 python module 을 미리 설치해 주어야 합니다. 만약 requirements.txt에 해당 모듈이 들어있지 않다면 별도로 설치를 해 줍니다. (2024년 2월 현재 0.27.1 버전이 최신이네요..)

 

> ./.venv/bin/python -m pip install uvicorn==0.27.1

 

 

실제 예시

이번에는 위에서 설명한 내용을 실제로 서버에 반영해 보겠습니다. 소스코드는 예전에 제가 생성해 두었던 기본 django tutorial 코드를 이용하도록 하겠습니다. https://github.com/shineum/django_tutorial.git

 

먼저 /opt/docker/python 폴더에서 소스 코드를 clone 합니다.

 

> git clone https://github.com/shineum/django_tutorial

 

 

그리고 django_tutorial 폴더를 app 으로 rename 합니다.

 

> mv django_tutorial app

 

 

django app에서 사용할 script 들을 https://github.com/shineum/django_scripts.git 에서 다운로드 합니다. 그리고 script 들을 scripts 폴더에 위치시킵니다.

 

docker 에서 가상 환경을 생성합니다. python 은 3.12.2-slim-bullseye 버전을 사용하였는데, 버전은 상황에 맞게 설정하면 됩니다.

 

> docker run -v ./app:/opt/app -v ./scripts/init.sh:/entrypoint.sh -it --rm python:3.12.2-slim-bullseye sh ./entrypoint.sh

 

 

소스 코드는 바로 clone 해서 준비가 되어 있으니 여기서는 업데이트가 필요 없지만, 코드가 변경된 경우에는 git pull 명령어를 이용해서 반영해 주면 됩니다. 

 

 

바로 의존 모듈을 설치해 보겠습니다. 가상 환경 생성과 비슷한데, script 만 init 에서 install 로 변경해 주면 됩니다.

 

> docker run -v ./app:/opt/app -v ./scripts/install.sh:/entrypoint.sh -it --rm python:3.12.2-slim-bullseye sh ./entrypoint.sh

 

 

다음 단계인 collect static 을 실행합니다. 이번에는 볼륨매핑 옵션에 nginx의 static 파일 위치를 지정해 주어야 합니다.

> docker run -v ./app:/opt/app -v /opt/docker/nginx/static:/opt/app/static -v ./scripts/collectstatic.sh:/entrypoint.sh -it --rm python:3.12.2-slim-bullseye sh ./entrypoint.sh

 

제대로 실행이 되었다면 /opt/docker/nginx/static 폴더에 static 파일들이 업데이트 되어야 합니다.

 

 

모델 업데이트는 script만 db로 변경해 줍니다. database를 사용하는 경우에는 db에 필요한 테이블이 생성이 되는데, 여기서는 db.sqlite3 파일이 생성됩니다.

 

> docker run -v ./app:/opt/app -v ./scripts/db.sh:/entrypoint.sh -it --rm python:3.12.2-slim-bullseye sh ./entrypoint.sh

 

 

django app이 잘 실행되는지 테스트를 해 봅니다. 아래 커맨드를 실행하고, 해당 서버로 접속을 해 봅니다.

> docker run -v ./app:/opt/app -v ./scripts/run_test.sh:/entrypoint.sh -p 8000:8000 -it --rm python:3.12.2-slim-bullseye sh ./entrypoint.sh

 

 

아래 화면은 Ubuntu desktop 에서 실행했을 때의 결과인데, django 404 error 페이지가 나오지만 실행은 잘 되는 것을 알 수 있었습니다. 실제로는 localhost 대신 서버 주소를 입력해야합니다.

 

 

그리고, admin 페이지는 아래와 같이 나옵니다.

 

 

이제 정식으로 django app 을 실행하기 위해서 docker-compose.yaml 파일을 아래와 같이 작성합니다.

 

/opt/docker/python/docker-compose.yaml

version: "3.7"
services:
  python:
    image: python:3.12.2-slim-bullseye
    volumes:
      - ./app:/opt/app
      - ./scripts/run.sh:/entrypoint.sh
    command: sh entrypoint.sh
    ports:
      - "8000:8000"

 

 

그리고 아래 명령어를 이용하여 컨테이너를 실행합니다.

> docker compose up -d

 

 

django app 이 asgi 형태로 실행되고 있어서, static 파일들 (css, image 등) 이 화면에 표현되지 않습니다.

 

테스트는 잘 실행이 되었지만, docker compose 실행이 제대로 되지 않는다면, 아마도 asgi 파일의 위치 문제일 가능성이 큽니다. run.sh 파일을 편집에서 해당 프로젝트에서 asgi 파일이 있는 경로를 지정해 주면 됩니다.

 

static 파일 문제를 해결하기 위해서 nginx를 셋업하도록 하겠습니다.

 

 

nginx 셋업

nginx도 docker로 이용할 예정이기 때문에 별다른 설치는 필요하지 않습니다. 

nginx에서는 static 파일에 대한 요청을 처리하고, 나머지 요청은 django app으로 보내 줍니다. 실제로는 ssl 처리 등의  복잡한 기능이 필요하지만, 여기서는 아래와 같이 간단한 설정 파일을 준비합니다. 여기서 proxy_pass에 사용한 172.17.0.1 은 docker의 기본 host 주소 입니다. 원래는 docker network 을 이용해야 하지만, 간단한 예시이기 때문에, docker 기본 host 아이피를 적어주었습니다.

 

/opt/docker/nginx/conf/app.conf

server {
    listen 80;
    listen [::]:80;
    server_name localhost;

    location /static {
        alias /opt/app/static;
    }

    location / {
        proxy_pass http://172.17.0.1:8000/;
    }
}

 

 

그리고 docker-compose.yaml 파일을 아래와 같이 작성합니다.

 

/opt/docker/nginx/docker-compose.yaml

version: "3.7"
services:
  python:
    image: nginx:1.24.0
    volumes:
      - ./static:/opt/app/static
      - ./conf/app.conf:/etc/nginx/conf.d/app.conf
    ports:
      - "80:80"
      - "443:443"

 

 

아래 명령어를 이용하여 컨테이너를 실행합니다.

> docker compose up -d

 

 

그리고 나서 browser에서 확인해 보면.. 아래와 같은 에러가 나옵니다. 

 

 

에러 내용은.. 허용되지 않는 host 라는 건데요.. 해결하기 위해서는 django app의 소스코드를 수정해야 합니다.

 

/opt/docker/python/app/config/settings.py 파일을 열어서 28번째 줄을 다음과 같이 변경합니다. 

 

실제 운영환경에서는 이런 식의 소스 코드 변경을 막기위해서 이러한 설정 값은 모두 환경변수에서 읽어서 처리하게 해야 합니다.

 

 

그리고 python (django app) 의 docker 를 새로 띄우면, 아래와 같이 잘 나오게 됩니다.

 

 

눈치 빠르신 분은 이미 알아채셨겠지만.. 접속 주소가 localhost:8000 에서 localhost 로 변경이 되었습니다. nginx 가 연결을 해주기 때문에 이제는 localhost 로 접속하면 됩니다. 기존의 8000 포트는 iptables 혹은 firewall 등을 이용해서 외부에서 접근하는 것을 막아 두는 것이 좋습니다.

 

반응형

'프로그래밍 > Python - Django' 카테고리의 다른 글

Django URL patterns  (0) 2024.03.17
Django Query Tips - User, Group, Permission  (0) 2024.03.02
Django - Proxy Models  (0) 2023.02.23
Django Tutorial Part 1 - HelloWorld  (0) 2022.11.01
Django - 프로젝트 시작하기  (0) 2022.10.28
반응형

Django의 Proxy 모델은 하나의 데이터 모델을 가지고, 다른 인터페이스를 제공하는 클래스라고 생각하면 됩니다.

모델 상속의 경우, 각 subclass 에 대해서 새로운 데이터 테이블이 생성되지만, proxy 모델은 별도로 데이터 테이블을 생성하지 않고, 기존 테이블을 참조해서 사용하게 됩니다. 

 

Proxy 모델의 정의

Proxy 모델은 원본 모델 클래스를 상속받아, Meta 클래스에 proxy 값을 True 로 설정해 주면 됩니다.

 

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

 

 

Proxy 모델 활용 - method 재정의

아래 예시에서는 원본 데이터 클래스인 Person 에서는, 인스턴스 출력시, DB에 저장되어 있는 이름을 그대로 출력되고, Proxy 클래스인 MyPerson 에서는, 인스턴스 출력시, 이름이 대문자로 변경되어서 출력됩니다. 같은 데이터를 참조하면서, method 를 다르게 정의해서 사용할 수 있습니다. 

 

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

    def __str__(self):
        return f"{self.firat_name} {self.last_name}"

class MyPerson(Person):
    class Meta:
        proxy = True
 
    def __str__(self):
       return super().__str__().upper()

 

Proxy 모델 활용 - manager: get_queryset

이번에는 proxy 모델과 manager를 이용해서, 원본 데이터를 필터링해서 관련 데이터만 사용하는 예시입니다.

먼저 SomeClass 라고 하는 데이터 모델을 정의하고, 세 개의 필드 status, title, content 를 정의합니다. 이어서 정의할 manager 클래스에서는 SomeClass의 status 값에 따라 원본 데이터를 필터해서 돌려 줄 수 있게 처리합니다. 그리고 마지막으로 proxy 모델들은 원본 데이터 클래스 (SomeClass) 를 상속하고, objects 에 해당 manager 클래스의 인스턴스를 지정해 줍니다. 

 

from django.db import models

STATUS_TYPES = (
    ('n', 'New'),
    ('i', 'In Process'),
    ('c', 'Completed'),
)

# 원본 데이터 클래스
class SomeClass(models.Model):
    status = models.CharField(max_length=1, choices=STATUS_TYPES)
    title = models.CharField(max_length=100)
    content = models.TextField(blank=True, null=True)

# 매니저 클래스
class NewStatusManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(status='n')

# 원본 데이터 테이블에서 status 가 'n' 인 데이터만 가지고 오는 proxy 클래스 
class NewStatusSomeClass(SomeClass):
    objects = NewStatusManager()
    class Meta:
    	proxy = True

# 매니저 클래스
class InProcessStatusManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(status='i')

# 원본 데이터 테이블에서 status 가 'i' 인 데이터만 가지고 오는 proxy 클래스
class InProcessStatusSomeClass(SomeClass):
    objects = InProcessStatusManager()
    class Meta:
    	proxy = True

# 매니저 클래스
class CompletedStatusManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(status='c')

# 원본 데이터 테이블에서 status 가 'c' 인 데이터만 가지고 오는 proxy 클래스
class CompletedStatusSomeClass(SomeClass):
    objects = CompletedStatusManager()
    class Meta:
    	proxy = True

 

 

 

 

Proxy 모델 활용 - manager: create

이번에는 proxy 클래스로 신규 레코드를 생성하는 케이스에 대해서 정의해 보겠습니다.

Proxy 모델에 연결된 manager 클래스에 create method 를 재정의해서, Proxy 형태를 구분하는 컬럼의 값을 지정해 줄 수 있습니다.

 

class SampleManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(type='sample')
        
    def create(self, **kwargs):
        kwargs.update({'type': 'sample'})
        return super().create(**kwargs)
        
...

params = {}
SampleManager.objects.create(**params)

 

 

반응형
반응형

이번 포스트는 Django Tutoral을 기초로 해서 작성했습니다.

Writing your first Django app, part 1 | Django documentation | Django (djangoproject.com)

 

이전 포스트에서는 Django 프로젝트를 생성했었는데, 이어서 튜토리얼에 있는 설문조사 프로젝트를 진행해 보겠습니다.

 

0. 준비

기존에 생성한 프로젝트 폴더는 대략 다음과 같은 구조로 되어 있을 겁니다. (django-admin 으로 프로젝트를 생성하면 자동으로 생성이 됩니다.)

mysite/
    manage.py
    config/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

 

- 먼저 mysite 폴더는 프로젝트 루트입니다. Django 에서는 이 폴더의 이름은 중요하지 않습니다.

- manage.py:  여러가지 방법으로 Django 프로젝트와 interact 하기 위해 필요한 커맨드라인 유틸리티입니다.

- config 폴더는 프로젝트를 위한 실제 Python 패키지들이 위치합니다.

- config/__init_.py: 비어 있는 파일이지만 Python 패키지임을 선언하기 위해 필요합니다.

- config/settings.py: Django 프로젝트를 위한 설정 파일입니다.

- config/urls.py: Django 프로젝트의 URL 정보입니다.

- config/asgi.py: ASGI를 지원하는 웹서버를 위한 entry-point 입니다.

- config/wsgi.py: WSGI를 지원하는 웹서버를 위한 entry-point 입니다.

 

 

 

1. 설문조사 앱 추가

Django 에서의 앱은 특정 작업을 수행하는 웹 애플리케이션을 의미합니다. 프로젝트는 특정 웹 사이트에 대한 구성 및 앱의 모음입니다. 따라서 하나의 프로젝트에는 여러 개의 앱이 포함될 수 있습니다. 

 

다음 명령어를 이용해서 Project에 "polls" 앱을 추가합니다.

 

(.venv) > python manage.py startapp polls

 

polls 앱이 추가되면, 아래와 같은 폴더가 생성됩니다. 

 

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

 

2. HelloWorld

설문조사를 더 진행하기 전에, 화면에 HelloWorld 를 출력해 보도록 하겠습니다.

 

먼저 polls 폴더내에 있는 views.py 파일을 열어서 아래와 같이 코드를 작성합니다.

 

polls/views.py

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

# Create your views here.

def index(request):
    return HttpResponse("HelloWorld")

 

그리고 polls 폴더에 urls.py 파일을 생성해서 아래와 같이 코드를 작성합니다.

 

polls/urls.py

from django.urls import path
from . import views

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

 

마지막으로 config 폴더에 있는 urls.py 파일을 열어서 아래와 같이 코드를 입력합니다.

from django.contrib import admin
# django.urls의 include 모듈을 추가
from django.urls import include
from django.urls import path

urlpatterns = [
    # polls 를 경로에 추가
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

 

프로젝트를 다시 실행합니다.

 

이번에는 localhost:8000 으로 접속하면 아래와 같은 에러가 나오게 됩니다.

 

나중에 처리하기로 하고, localhost:8000/polls 로 접속합니다.

아래처럼 HelloWorld 가 화면에 나오면 정상입니다.

 

페이지가 호출되는 흐름을 설명하자면,

 

먼저 웹 요청이 오면, project 에 있는 config/urls.py 에서 urlpatterns 에 있는 리스트를 매치해 봅니다.

매칭 결과 "polls/"가 매치되므로, url은 polls.urls 에 있는 urlpatterns 를 찾아보게 됩니다.

 

다음으로 polls/urls.py 에 있는 urlpatterns에서 매치되는 path를 살펴보고,

매치되는 함수를 실행합니다. (여기서는 views.index)

 

polls/views.py 에 있는 index 함수에서 요청을 처리하고, HttpResponse 로 "HelloWorld" 를 리턴하게 됩니다.

 

 

반응형

'프로그래밍 > Python - Django' 카테고리의 다른 글

Django Query Tips - User, Group, Permission  (0) 2024.03.02
Django 프로젝트 배포하기  (0) 2024.02.29
Django - Proxy Models  (0) 2023.02.23
Django - 프로젝트 시작하기  (0) 2022.10.28
Django - 기본 설정  (0) 2022.10.14
반응형

이 포스트는 Django 에 대한 포스트로, 박응용님의 점프 투 장고를 많이 참조했습니다.

기초부터 차근차근 공부하시고 싶으신 분은 점프 투 장고를 읽어 보시기를 권장합니다.

 

https://wikidocs.net/book/4223

 

점프 투 장고

**점프 투 장고 오프라인 책 출간 !! (2020.12)** * [책 구입 안내](https://wikidocs.net/105844) 점프 투 장고는 파이 ...

wikidocs.net

 

 

Django 프로젝트 시작하기

Django 프로젝트를 시작하기 위해서는 다음의 순서대로 진행하면 됩니다.

1. 프로젝트 폴더 생성

2. 가상환경 생성 및 실행

3. 가상환경 내에서 Django 모듈 설치

4. Django admin 명령어로 프로젝트 생성

5. Django 서버 실행

 

1. 프로젝트 폴더 생성

프로젝트 폴더는 탐색기를 이용해도 되지만, 여기서는 커맨드 프롬프트를 이용해서 생성해 보겠습니다. 프로젝트는 C:\Projects\Django 아래 위치하며, 프로젝트 이름은 mysite 라고 가정하겠습니다.

> cd C:\Projects\Django
> mkdir mysite
> cd mysite

 

커맨드는 윈도우 기준으로 작성되었습니다. 첫째 줄은 C:\Projects\Django 디렉터리로 이동하라는 명령어 인데, 이전에 C:\Projects\Django 폴더가 생성되어 있어야 합니다. 그리고 두번째 줄은 프로젝트 폴더인 mysite 를 생성하는 명령어이고, 세번째 줄은 폴더 생성 후에 mysite 디렉터리로 이동하라는 의미 입니다. 이후 작업은 모두 C:\Projects\Django\mysite 에서 이루어지기 때문에 미리 이동해 두었습니다.

 

2. 가상환경 생성 및 실행

이전 포스트에서 가상환경에 대해서 설명을 했었는데, 가상환경은 프로젝트별로 Python 실행환경을 만들어서 가상환경 별로 모듈을 관리하기 위해서 사용합니다. C:\Projects\Django\mysite 에서 아래 명령을 실행합니다.

> python -m venv .venv
> cd .venv\Scripts
> activate
(.venv) > cd ..\..

 

역시 윈도우 기준으로 커맨드를 작성했습니다. 첫번째 줄에서는 .venv 라는 가상환경을 생성했고요, 두번째 줄에서는 가상환경을 실행하기 위해서 경로를 변경해 주었고, 세번째 줄에서는 가상환경을 실행하였습니다. 네번째 줄은 원래 프로젝트 루트로 돌아가기 위한 명령어 입니다.

 

맥이나 리눅스에서는 아래와 같이 입력하시면 됩니다. 

> python -m venv .venv
> source ./.venv/bin/activate

 

3. 가상환경 내에서 Django 모듈 설치

pip 명령어를 이용해서 Django 모듈을 설치합니다.

(.venv) > pip install django==4.1.2

 

pip 버전을 업그레이드 하라는 경고 메시지가 나온다면 아래 명령어로 업그레이드를 진행합니다.

(.venv) > python -m pip install --upgrade pip

 

4. Django admin 명령어로 프로젝트 생성

django-admin 명령어로 Django 프로젝트에 필요한 기본 설정들을 생성합니다.

(.venv) > django-admin startproject config .

 

django-admin 명령어의 첫번째 파라미터인 startproject 는 말 그대로 프로젝트를 시작하기 위한 기본 파일들을 생성하기 위해 사용합니다. 두번째 파라미터인 config 는 django 프로젝트의 설정파일들을 config 폴더에 생성하겠다는 의미이고, 마지막 파라미터인 "." 은 현재 경로에 생성을 하겠다는 의미 입니다. 

명령어를 실행하고 나면, 프로젝트 루트 경로에는 manage.py 파일과 config 폴더가 생성됩니다. config 폴더에는 기본 설정 및 운영 환경에서의 실행을 위한 기본 파일들이 생성됩니다.

 

5. Django 서버 실행

프로젝트가 생성되었다면, 아래 명령어를 입력해서 Django 서버를 실행합니다.

(.venv) > python manage.py runserver

 

명령어를 실행하고 나면, 마지막에 Starting development server at http://127.0.0.1:8000/ 같은 메시지가 출력되는데, 이것이 서버 접속 정보입니다. 브라우저를 열고 http://127.0.0.1:8000 을 입력하면 Django 에서 제공해주는 기본 화면이 아래와 같이 나오게 됩니다.

Django 는 포트 충돌이 없다면 기본적으로 8000 포트로 서비스를 시작합니다. 만약 8080 포트로 서비스를 하고자 한다면 다음과 같이 입력하면됩니다.

(.venv) > python manage.py runserver 8080

 

혹은 서버에서 여러 개의 네트워크 인터페이스를 사용하고 있어서 특정 아이피에 서비스를 바인드 하고 싶다면 아이피도 적어줍니다.

(.venv) > python manage.py runserver 0.0.0.0:8080

 

0.0.0.0 은 모든 네트워크 인터페이스에서의 요청을 바인드 할 때 사용합니다. 필요에 따라 바인드할 아이피를 세팅해 주면됩니다.

 

 

원래 이번 포스트에서 HelloWorld 를 구현하려고 했는데.. 다음 포스트에 작성해 보겠습니다.

반응형

'프로그래밍 > Python - Django' 카테고리의 다른 글

Django Query Tips - User, Group, Permission  (0) 2024.03.02
Django 프로젝트 배포하기  (0) 2024.02.29
Django - Proxy Models  (0) 2023.02.23
Django Tutorial Part 1 - HelloWorld  (0) 2022.11.01
Django - 기본 설정  (0) 2022.10.14
반응형

이 포스트는 Django 에 대한 포스트로, 박응용님의 점프 투 장고를 많이 참조했습니다.

기초부터 차근차근 공부하시고 싶으신 분은 점프 투 장고를 읽어 보시기를 권장합니다.

 

https://wikidocs.net/book/4223

 

점프 투 장고

**점프 투 장고 오프라인 책 출간 !! (2020.12)** * [책 구입 안내](https://wikidocs.net/105844) 점프 투 장고는 파이 ...

wikidocs.net

 

 

Django의 정의

Django는 웹 프로그램을 쉽고 빠르게 만들어 주는 웹 프레임워크입니다.

 

웹 프레임워크란

웹 프레임워크는 웹 프로그램을 만들기 위한 스타터 키트 같은 것으로, 웹 프로그램에 필요한 많은 기능들(쿠키나 세션 처리, 로그인/로그아웃 처리, 권한 관리, 데이터 베이스 연결 등)을 포함시켜서 바로 사용할 수 있게 만들어진 프레임워크 입니다.

 

Django 설치하기 1 - Python 설치

Django 를 이용해서 웹 개발을 위해서는 Python 이 필요합니다. Python 홈페이지에서 사용하는 컴퓨터의 OS에 맞게 설치를 합니다. 버전은 3.8 이후를 사용하는 것을 권장하는데, 2022년 10월 기준으로 3.10.4 버전을 설치하면 됩니다. 이미 Python 3.8 이후 버전이 설치되어 있다면 이 과정은 건너 뛰어도 됩니다.

 

https://www.python.org 

 

Welcome to Python.org

The official home of the Python Programming Language

www.python.org

 

설치가 끝나면, 명령 프롬프트 (커맨드 창) 등에서 아래 명령어를 이용해서 설치된 버전을 확인할 수 있습니다. (V는 대문자 입니다.)

> python -V

 

Django 설치하기 2 - Python 가상환경 설정

Python의 가상환경은 Python 프로젝트를 진행할 때, 각각의 프로젝트에 독립된 환경을 만들어 주기 위해서 사용합니다. 예를 들어서 Python 프로젝트를 여러개 관리 중인데, 각 프로젝트가 필요로 하는 모듈 및 모듈의 버전이 다르다면, 가상환경을 이용해서 각 프로젝트에 필요한 모듈을 각각 설치해서 사용할 수 있습니다. 

 

가상환경은 아래 명령어로 생성할 수 있습니다.

> python -m venv <name>

 

원하는 위치에 가상환경을 세팅할 수 있지만, 각 프로젝트 폴더에 .venv 라는 이름으로 생성하도록 하겠습니다. 가상환경에 설치되는 모듈은 pip 명령어를 이용해서 다시 설치가 가능하기 때문에 소스 관리 툴(git 등)에서 해당 폴더를 ignore list에 추가하도록 합니다.

 

다음은 가상환경을 시작하는 방법입니다. 시작은 가상환경을 설치한 프로젝트 루트에서 아래 처럼 명령어를 입력해 주면 됩니다.

> cd .venv\Scripts
> activate
(.venv) > cd ..\..

 

위의 명령어는 윈도우 기준으로 작성되었습니다. 첫번째 라인은 script 경로로 변경해 주는 것이고, 두번째 라인은 activate.bat 파일을 실행하여 가상환경을 시작하는 것이고, 마지막 라인은 다시 프로젝트 루트 폴더로 돌아오게 하는 것입니다. 세번째 라인은 명령 프롬프트 앞에 (.venv) 가 보이는데, 이것은 .venv 라는 가상환경이 실행 중임을 표시해 주는 것입니다.

참고로 맥이나 리눅스에서는 아래 명령어를 이용하면 됩니다. 

> source ./.venv/bin/activate

 

가상환경을 종료하기 위해서는 아래 명령어를 입력합니다.

(.venv) > deactivate

 

Django 설치하기 3 - Django 모듈 설치하기

지금까지는 Python 과 Python 가상환경 설치에 대해서 살펴 봤는데요, 이제는 Django를 구동하기 위한 Django 모듈을 설치합니다.

설치는 pip 명령어를 이용하게 됩니다.

 

가상환경이 실행된 상태인지 확인합니다. 명령 프롬프트 앞에 (.venv) 이 표시되고 있는지 확인하시고, 없다면 바로 앞에서 설명드린 명령어로 가상환경을 시작합니다.

 

그리고 아래 명령을 이용해서 Django 모듈을 설치합니다. 이 글을 작성하는 시점에서는 4.1.2 버전이 최신입니다.

(.venv) > pip install django==4.1.2

 

새로 생성된 가상환경에서 pip 를 처음 실행하거나 새로운 pip 버전이 출시 되었을 때 실행하면, pip 버전을 업그레이드하라는 경고 메시지가 나옵니다. 아래 명령어를 입력하면 pip 버전을 업그레이드 할 수 있습니다.

(.venv) > python -m pip install --upgrade pip

 

자 이제 Django 를 시작할 준비작업은 모두 마친 것 같습니다.

다음 포스트에서는 HelloWorld 프로젝트를 시작해 보겠습니다.

반응형

+ Recent posts