Python 개발환경 및 Django 초기셋팅

ILOV-IT·2023년 12월 10일

1. 파이썬 및 유틸리티 설치

winget install --id=Microsoft.PowerShell --silent
winget install --id=Microsoft.WindowsTerminal --silent
winget install --id=JetBrains.PyCharm.Professional --silent
winget install --id=Microsoft.VisualStudioCode --silent
winget install --id=Python.Python.3.11 --silent
winget install --id=Python.Python.3.12 --silent
winget install --id=OpenJS.NodeJS.LTS --silent
winget install --id=Git.Git --silent

2. 프로젝트 폴더 생성

mkdir myproject
cd myproject
python -m venv venv
venv/Scripts/Activate (if linux, source ./venv/bin/activate)
python -m pip install --upgrade pip
python -m pip install "django==0.0.0"
python -m django startproject mysite .

<requirements.txt>
  django==0.0.0
 
<.gitignore>
  __pycache__
  migrations
  /mediafiles
  /staticfiles
  venv
  db.sqlite3
  secret.json  
  .idea
  .vscode.
  .env

3. 코드 유틸리티 설치

공식웹: www.djlint.com

python -m pip install djlint

python -m djlint --reformat --format-css --format-js --indent 2 --quiet --profile django .

공식웹: black.readthedocs.io

python -m pip install black

<settings.json>
{
    "[python]": {
        "editor.defaultFormatter": "ms-python.black-formatter",
        "editor.formatOnSave": true
    },
    "[html][django-html][handlebars][hbs][mustache][jinja][jinja-html][nj][njk][nunjucks][twig]": {
        "editor.defaultFormatter": "monosans.djlint"
    }
}

4. 앱(accounts) 생성

python manage.py startapp accounts

<mysite/settings.py>
INSTALLED_APPS = [
    "django.contrib.admin",
		.
        .
        .
	"accounts",
]

<accounts/urls.py>
from django.urls import path
from . import views
urlpatterns = []

<mysite/urls.py>
from django.urls import include
urlpatterns = [
	.
    path("accounts/", include("accounts.urls")),
]
<accounts/models.py>
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
	pass
    
<mysite/settings.py>
AUTH_USER_MODEL = "accounts.User"  # accounts.models.User(x)

python manage.py makemigrations accounts
python manage.py migrate
python manage.py createsuperuser

5. django-debug-toolbar

공식웹: django-debug-toolbar.readthedocs.io

python -m pip install django-debug-toolbar

<mysite/settings.py>
INSTALLED_APPS = [
    "django.contrib.admin",
		.
        .
	"accounts",
    "debug_toolbar",
]

MIDDLEWARE = [
		.
        .
    "debug_toolbar.middleware.DebugToolbarMiddleware",
]

INTERNAL_IPS = [
    # ...
    "127.0.0.1",
    # ...
]
<mysite/urls.py>
from django.conf import settings

if settings.DEBUG:
    urlpatterns += [
        path("__debug__/", include("debug_toolbar.urls")),
    ]

python manage.py runserver

6. django-environ

공식웹: django-environ.readthedocs.io

python -m pip install django-environ

<.gitignore>
.env*

<mysite/settings.py - env 코드>
import environ

env = environ.Env()
env_path = BASE_DIR / ".env"

if env_path.exists():
    f = env_path.open("rt", encoding="UTF8")
    env.read_env(f)

<mysite/settings.py - env 상수>
SECRET_KEY = env.str(
	"SECRET_KEY",
    default="your original key",
)
DEBUG = env.bool("DEBUG", default=True)
ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", [])
if DEBUG is False:
    CSRF_TRUSTED_ORIGINS = ["https://your.domain.co.kr"]
DATABASES = {
    "default": env.db("DATABASE_URL", default=f"sqlite:///{BASE_DIR / 'db.sqlite3'}"),
}
INTERNAL_IPS = env.list("INTERNAL_IPS", default=["127.0.0.1"])
LANGUAGE_CODE = env.str("LANGUAGE_CODE", default="ko-kr")
TIME_ZONE = "Asia/Seoul"
USE_TZ = False

# just insert
STATIC_URL = "static/"
STATIC_ROOT = env.str("STATIC_ROOT", default=BASE_DIR / "staticfiles")
MEDIA_URL = "media/"
MEDIA_ROOT = env.str("MEDIA_ROOT", default=BASE_DIR / "mediafiles")

LOGIN_REDIRECT_URL = reverse_lazy("root")

  
  <.env>
  SECRET_KEY=mysecretkey
  DEBUG=True
  ALLOWED_HOSTS=yourip,your.domain.co.kr,localhost,127.0.0.1
  DATABASE_URL=mysql://id:pw@127.0.0.1:3306/db_name
  INTERNAL_IPS=localhost,127.0.0.1
  LANGUAGE_CODE=ko-kr
  -- STATIC_ROOT=
  -- MEDIA_ROOT=
  

7. django-bootstrap5

공식웹: django-bootstrap5.readthedocs.io

python -m pip install django-bootstrap5

<mysite/settings.py>
INSTALLED_APPS = [
		.
        .
    "django_bootstrap5",
]
 
TEMPLATES = [
    "BACKEND": ...
	"DIRS": [
  		BASE_DIR / "templates",
  	],
]
  
<mysite/urls.py>
from django.views.generic import TemplateView
urlpatterns = [
	.
    path("accounts/", include("accounts.urls")),
 	path("", TemplateView.as_view(template_name="root.html"), name="root"),
]

7.1 root.html 단독

<templates/root.html>

{% load django_bootstrap5 %}
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
    <meta name="keywords" content=""/>
    <meta name="description" content=""/>   

    <title>Django Test Page</title>
    {% bootstrap_css %}
    {$ bootstrap_javascript %}

</head>
<body>
  <h1>hello</h1>  
</body>
</html>

7.2 root.html + base.html

<templates/base.html>
  
{% load django_bootstrap5 %}
<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="keywords" content="" />
    <meta name="description" content="" />
    <title>Django Test Page</title>
    {% bootstrap_css %}
    {% bootstrap_javascript %}
  </head>
  <body>
    <h1>hello</h1>

    {% block content %}{% endblock content %}
  </body>
</html>
<templates/root.html>
  
{% extends "base.html" %}

{% block content %} <button class="btn btn-primary">버튼</button>{% endblock content %}

8. 앱(mall) 생성

python manage.py startapp mall

<mysite/settings.py>
INSTALLED_APPS = [
    "django.contrib.admin",
		.
        .
        .
	"mall",
]
  
<mysite/urls.py>
from django.urls import include
urlpatterns = [
	.
    path("mall/", include("mall.urls")),
]
<mall/urls.py>
from django.urls import path
from . import views

urlpatterns = [
    path("payment/", views.payment_new, name="payment_new"),
]

<mall/views.py>
def payment_new(request):
    return render(request, "payment_form.html")
<mall/templates/base.html>
{% extends "base.html" %}
  
<mall/templates/payment_form.html>
{% extends "base.html" %}
{% block content %}
    <h2>결재하기</h2>
{% endblock content %}
profile
because we know you'll love it

0개의 댓글