[Django] Django ์ปค์คํ ์ปค๋งจ๋ ๋ง๋ค๊ธฐ
- -
๐ Django๋ก ์ปค์คํ ์ปค๋งจ๋ ๋ง๋ค๊ธฐ
์ฅ๊ณ manage.py์ ์ฌ์ฉ์ ์ง์ ์ปค๋งจ๋๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค.์ปค์คํ ์ปค๋งจ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ผ๋ก manage.py๋ถํฐ ์ฌ์ฉํ ์ ์๋ ์ปค๋งจ๋๋ฅผ ๋๋ฆด ์๊ฐ ์๋ค.
์ง๊ธ๋ถํฐ ์ํ๋ ๊ธฐ๋ฅ์ ์ปค๋งจ๋๋ก ๋ง๋ค์ด์ ์ฌ์ฉํ์ฌ ๋ณด์.
- ์ฌ์ฉ์ ์ง์ ์ปค๋งจ๋ ๊ฐ์
- ๋ชจ๋ธ ๋ง๋ค๊ธฐ
- ์ปค๋งจ๋ ์์ฑ
- ์ปค๋งจ๋ ์คํ
- ์ปค๋งจ๋ ์์ธํ ์์๋ณด๊ธฐ
๐ ์ฌ์ฉ์ ์ง์ ์ปค๋งจ๋ ๊ฐ์
Django ์ปค์คํ ์ปค๋งจ๋๋ Django์์ ์์ฑํ๋ ์ฑ๋ง๋ค ๋ง๋ค ์ ์์ผ๋ฉฐ, ์ปค์คํ ํ์ฌ ๋ง๋ค์ด์ง ์ปค๋งจ๋๋ manage.py์์ ์คํํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๋ด๊ฐ showuser
๋ผ๋ ์ปค๋งจ๋๋ฅผ ๋ง๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๊ฒ๋๋ค.
python3 manage.py showuser
Django์์ ๊ด๋ฆฌ์ฉ์ผ๋ก ๋ชจ๋ธ์ ์กฐ์ํ๊ฑฐ๋ ์ฐธ์กฐํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ๋ทฐ๋ฅผ ์ผ๋ถ๋ฌ ์ ์ํ์ฌ ๋ธ๋ผ์ฐ์ ๋ก ๋ถํฐ ์คํํ๋ ๊ฒ์ ๋งค์ฐ ๋ฒ๊ฑฐ๋กญ๊ณ , ๊ท์ฐฎ์ ์ผ์ด๋ค.
๊ทธ๋ฌ๋ ์ปค์คํ ์ปค๋งจ๋๋ฅผ ๋ง๋ค๋ฉด ์ปค๋งจ๋ ๋ผ์ธ์์ ๋ชจ๋ธ, ๋์๊ฐ์๋ ์ ์ฒด ํ๋ก์ ํธ๋ฅผ ์ฐธ์กฐ ํ ์ ์์ด ๋งค์ฐ ํธ๋ฆฌํด์ง๋ค.
๐ก ์ปค์คํ ์ปค๋งจ๋๋ฅผ ๋ง๋๋ cron๋ฑ์ ์ค์ผ์ค๋ฌ์ ์กฐํฉํ๋ฉด ์ ๊ธฐ์ ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๋ณ๊ฒฝํ๋ ์์คํ ๋ ๊ตฌ์ถํ ์ ์๋ค.
Django ์ปค์คํ ์ปค๋งจ๋๋ ์ค์นํ ์ฑ ํ์์ management๋ผ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์๋ commands๋ผ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ ์ปค๋งจ๋๋ช ์ ํด๋นํ๋ ๋ชจ๋์ ๋ฐฐ์นํ๊ณ , ๋ชจ๋ ์์์ ์ปค๋งจ๋์ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ผ๋ก Django๊ฐ ๊ทธ ์ปค๋งจ๋๋ฅผ ์ธ์ํ๋ค.
โค ๋ช ๋ น์ด ์์ฑ
% python3 manage.py
Type 'manage.py help <subcommand>' for help on a specific subcommand.
Available subcommands:
[auth]
changepassword
createsuperuser
[contenttypes]
remove_stale_contenttypes
[debug_toolbar]
debugsqlshell
[django]
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
์์ manage.py๋ก ์ปค๋งจ๋๋ฅผ ์ ๋ ฅํ๋ฉด ํ์ฌ ์ฌ์ฉํ ์ ์๋ ๋ช ๋ น์ด๋ฅผ ํ์ธํ ์ ์๋ค.
์๋์ ๊ฐ์ด management>commands>showuser.py ํ์ผ์ ์ถ๊ฐ ํ ๋์ผํ ํด๋์ __init__.py
ํ์ผ์ ์์ฑ ํ ๋ค์ ํ ๋ฒ manage.py ๋ช
๋ น์ด๋ฅผ ํ์ธํ์ฌ ๋ณด์.
๋ด๊ฐ ์์ฑํ showuser๋ผ๋ ๋ช ๋ น์ด๋ฅผ ํ์ธ ํ ์ ์์ ๊ฒ์ด๋ค.
% python3 manage.py
Type 'manage.py help <subcommand>' for help on a specific subcommand.
Available subcommands:
...
[shortener]
showuser
...
๐ ๋ชจ๋ธ ๋ง๋ค๊ธฐ
์ปค์คํ ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์์์ ๋ชจ๋ธ์ ์์ฑํด ๋ณด์.
models.py
class User(models.Model):
''' ์ปค์คํ
์ปค๋งจ๋๋ฅผ ์ํ ๋ชจ๋ธ ์์ฑ '''
name = models.CharField(max_length=128, help_text="์ฌ์ฉ์ ์ด๋ฆ")
content = models.TextField(max_length=1024, help_text="์ฌ์ฉ์ ์ค๋ช
")
๋ชจ๋ธ์ ์ ์ํ ํ ๋ง์ด๊ทธ๋ ์ด์ ์ ์งํํ๋ค.
% python3 manage.py makemigrations
% python3 manage.py migrate
๐ ์ปค๋งจ๋ ์์ฑ
์ปค๋งจ๋๋ก ์คํํ๋ showuser.pyํ์ผ ์์ ๋ช ๋ น์ด๋ฅผ ์์ฑํ์ฌ๋ณด์.
management>commands>showuser.py
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = 'Show user list'
def handle(self, *args, **options):
self.stdout.write('show user')
๋ค์๊ณผ ๊ฐ์ด Command ๋ผ๊ณ ํ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ค๋ค.
์ด ํด๋์ค๋ BaseCommand ๋ฅผ ์์ํจ์ผ๋ก์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์คํํ ์ ์๊ฒ ๋๋ค.
help ์์ฑ์ ์ปค๋งจ๋์ ์ค๋ช ์ ์์ฑํ๋ฉด -h ์ต์ ์ฌ์ฉ ์ ๊ทธ์ ๋ํ ์ค๋ช ์ ํ์ธ ํ ์ ์๋ค.
handle() ๋ฉ์๋ ๋ฅผ ์ค๋ฒ๋ผ์ด๋(override)ํด, ์ปค๋งจ๋๊ฐ ์คํ๋์์ ๋์ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ์ ํ๊ฒ ํ๋ค.
๐ ์ปค๋งจ๋ ์คํ
% python3 manage.py showuser
show user
% python3 manage.py showuser -h
usage: manage.py showuser [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS]
[--pythonpath PYTHONPATH] [--traceback] [--no-color]
[--force-color] [--skip-checks]
Show user list
options:
-h, --help show this help message and exit
--version Show program's version number and exit.
-v {0,1,2,3}, --verbosity {0,1,2,3}
Verbosity level; 0=minimal output, 1=normal output,
2=verbose output, 3=very verbose output
--settings SETTINGS The Python path to a settings module, e.g.
"myproject.settings.main". If this isn't provided, the
DJANGO_SETTINGS_MODULE environment variable will be used.
--pythonpath PYTHONPATH
A directory to add to the Python path, e.g.
"/home/djangoprojects/myproject".
--traceback Raise on CommandError exceptions.
--no-color Don't colorize the command output.
--force-color Force colorization of the command output.
--skip-checks Skip system checks.
์ปค๋งจ๋๋ฅผ ์คํํ๊ฒ ๋๋ฉด ๋ณธ์ธ์ด ์์ฑํ ์ฝ๋๊ฐ ์คํ๋๋ฉฐ -h ์ต์ ์ ๋ถ์ฌ ์ปค๋งจ๋๋ฅผ ์คํํ๊ฒ ๋๋ฉด help ๋ณ์์ ์์ฑํด ๋์๋ ์ปค๋งจ๋์ ์ค๋ช ์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
๐ ์ปค๋งจ๋ ์์ธํ ์์๋ณด๊ธฐ
โค ํ์ค ์ถ๋ ฅ ๋ฐ ํ์ค ์ค๋ฅ ์ ๋ณด
์ปค๋งจ๋์์ ํ์ค ์ถ๋ ฅ๊ณผ ํ์ค ์๋ฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด self.stdout๊ณผ self.stderr๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ถ์ฒ๋๊ณ ์๋ค.
์ด๋ฌํ ํ์ผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ์ปค๋งจ๋๋ฅผ ํ ์คํธํ๊ณ ๋๋ฒ๊น ํ ์ ์๋ค.
def handle(self, *args, **options):
self.stdout.write('success')
self.stderr.write('error')
๋, ์ด๋ฌํ ์ค๋ธ์ ํธ์ wirte()๋ฉ์๋๋ ๊ฐํ์ ์๋์ผ๋ก ๋ถ๊ฐํ๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๊ฐ ์ค ๋์ ์ค ๋ฐ๊ฟ์ ์ถ๊ฐ ํ ํ์๊ฐ ์๋ค.
๊ฐํ์ ์ ๊ฑฐํ๊ณ ์ถ์ ๊ฒฝ์ฐ print()๋ฉ์๋์์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ending์ธ์์ ๊ณต๋ฌธ์์ด์ ์ง์ ํ๋ฉด๋๋ค.
def handle(self, *args, **options):
self.stdout.write('success', ending='')
self.stderr.write('error', ending='')
โค ์ธ์ ์ถ๊ฐ
์ปค๋งจ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. ํ์ง๋ง ์ปค๋งจ๋๊ฐ ์ธ์๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ถ๊ฐํ์ฌ ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
from django.core.management.base import BaseCommand
from shortener.models import User
class Command(BaseCommand):
help = 'Create user data'
def add_arguments(self, parser):
parser.add_argument('attrs', nargs='+', type=str)
def handle(self, *args, **options):
attrs = options['attrs']
user = User.objects.create(name=attrs[0], content=attrs[1])
self.stdout.write('Complete created user')
์์ ๋ค๋ฅด๊ฒ add_arguments() ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์๋ค. ์ด ๋ฉ์๋์ parser๋งค๊ฐ๋ณ์๋ฅผ ์ด์ฉํ์ฌ
parser.add_argument๋ฅผ ์ฌ์ฉํ๋ฉด ์ปค๋งจ๋๋ก ์ ๋ฌํ ์ธ์๋ฅผ ๋ฐ์ handle()๋ฉ์๋๋ก ์ ๋ฌ์์ผ ์ค๋ค.
handle() ๋ฉ์๋์์๋ ์์์ ์ ๋ฌํ ์ธ์๋ฅผ options ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ฐ์ ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค.
% python3 manage.py createuser username usercontent
['username', 'usercontent']
username usercontent
Complete created user
์ถ๊ฐ๋ก ์์ฑํ ๋ฐ์ดํฐ๋ฅผ ์ง์์ฃผ๊ธฐ ์ํด ์ญ์ ์ปค๋งจ๋๋ฅผ ์์ฑํด ๋ณด์๋ค.
from django.core.management.base import BaseCommand
from shortener.models import User
class Command(BaseCommand):
help = 'Delete user data'
def add_arguments(self, parser):
parser.add_argument('user_id', nargs='+', type=str)
def handle(self, *args, **options):
users = options['user_id']
print(users)
for user_id in users:
user = User.objects.filter(id=str(user_id)).last()
user.delete()
% python3 manage.py deleteuser 3
['3']
delete user 3
โค ์ต์ ์ถ๊ฐ
์ธ์๊ฐ ์๋ ์ต์ ์ ํตํด ์ธ์๋ฅผ ์ ๋ฌํ์ฌ ๋ช ๋ น์ด๋ฅผ ์คํํด๋ณด์.
from django.core.management.base import BaseCommand
from shortener.models import User
class Command(BaseCommand):
help = 'Create user data'
def add_arguments(self, parser):
# parser.add_argument('attrs', nargs='+', type=str)
parser.add_argument('-n', '--name', required=True, type=str)
parser.add_argument('-c', '--content', required=True, type=str)
def handle(self, *args, **options):
# attrs = options['attrs']
attrs = [options['name'], options['content']]
user = User.objects.create(name=attrs[0], content=attrs[1])
self.stdout.write('Complete created user')
% python3 manage.py createuser -n username -c usercontent
% python3 manage.py createuser --name username2 --content usercontent2
['username', 'usercontent']
Complete created user
['username2', 'usercontent2']
Complete created user
๐ ์ฐธ๊ณ
'LANGUAGES > Django' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Django] django-crontab ์ค์ผ์ค๋ฌ ์์ฑ (0) | 2023.05.22 |
---|---|
[Docker] docker-compose๋ฅผ ์ด์ฉํ ํ๋ก์ ํธ ๋ฐฐํฌ (0) | 2023.05.08 |
[Django] ๋ค์ํ ํ ํ๋ฆฟ ํ๊ทธ (0) | 2023.05.04 |
[Django] django-seed๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ๋ง๋ค๊ธฐ (0) | 2023.05.03 |
[Django] debug_toolbar ์ฌ์ฉํ๊ธฐ (0) | 2023.04.06 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค