๐Ÿ“•Week5 day1(Django)

๋ฐ•์ค€ํฌยท2023๋…„ 9์›” 19์ผ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

๋ชฉ๋ก ๋ณด๊ธฐ
20/28

Django

Django๋Š” ํŒŒ์ด์ฌ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฌด๋ฃŒ ์˜คํ”ˆ์†Œ์Šค ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ(web application framework)์ด๋‹ค.

django์„ค์น˜


์ด๋ฒˆ์—๋„ CLIํ™˜๊ฒฝ์—์„œ ๋งŒ๋“  ๊ฐ€์ƒํ™˜๊ฒฝ์— ์ง„ํ–‰ํ•œ๋‹ค.
๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ ์ด์ „ ํฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•˜์ž!

pip install django

๋จผ์ € pip install์„ ํ†ตํ•ด django๋ฅผ ์„ค์น˜ํ•ด ์ค€๋‹ค.

django-admin startproject <ํ”„๋กœ์ ํŠธ์ด๋ฆ„>

๊ทธ ๋‹ค์Œ ์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด project๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

python manage.py runserver

๊ทธ ํ›„ ์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด

์ด๋ ‡๊ฒŒ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

App์ƒ์„ฑ

Django์—์„œ App์€ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” Python ํŒจํ‚ค์ง€์ด๋‹ค.

๐Ÿ“’ํ•˜๋‚˜์˜ ์•ฑ์€ ๊ทธ ์•ˆ์—์„œ ๋…์ž์ ์ธ ๋ชจ๋ธ(Model), ํ…œํ”Œ๋ฆฟ(Template), ๋ทฐ(View) ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ Django ํ”„๋กœ์ ํŠธ๋Š” ๋ชจ๋“ˆํ™”๋œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์•ฑ๋“ค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ํด๋” ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์—์„œ ์ง„ํ–‰ํ•œ๋‹ค.

django-admin startapp <app_name>
์ด๋Ÿฐ ์‹์œผ๋กœ homepage์•ฑ์„ ๋งŒ๋“ค๊ณ  ๋‚˜๋ฉด homepageํด๋”๊ฐ€ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ์ง€๋Š”๋ฐ ๊ทธ ์•ˆ์— model.py๋Š” ํ™ˆํŽ˜์ด์ง€ ๋ชจ๋“ˆ์•ˆ์—์„œ ์“ฐ์ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์Šคํ‚ค๋งˆ ๋“ฑ๋“ฑ์„ ํด๋ž˜์Šคํ˜•ํƒœ๋กœ ์ €์žฅํ•ด๋†“๋Š”๋‹ค.

๐Ÿ’กDjango ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ
์žฅ๊ณ ๋Š” ๊ด€๋ฆฌ์ž ๊ณ„์ •์ด ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•œ๋ฐ ๊ณ„์ • ์ƒ์„ฑ ์ „์— ๋จผ์ €
๋ฐ‘์— ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด ์ค˜์•ผํ•œ๋‹ค.

python manage.py migrate

์ด ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด default๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋“ค์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์ •๋ณด๊ฐ€ ๋ฐ˜์˜๋˜๊ฒŒ ๋œ๋‹ค.

winpty python manage.py createsuperuser

๊ทธ ํ›„ ์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋ฉด http://127.0.0.1:8000/admin/์—์„œ ๊ด€๋ฆฌ์ž ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์ถ”๊ฐ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด์„œ๋„ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

django ์˜ MVT Pattern


์žฅ๊ณ ๋Š” MTV(Model - Template - View) ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. MTVํŒจํ„ด์ด๋ž€ Model(๋ฐ์ดํ„ฐ), Template(์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค), View(๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง)์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•œ ์š”์†Œ๊ฐ€ ๋‹ค๋ฅธ ์š”์†Œ๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•œ ๋ฐฉ์‹์ด๋‹ค.

View๋กœ Request Handling ํ•˜๊ธฐ

views.py๋ผ๋Š” ํŒŒ์ผ ์•ˆ์— renderํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ handlingํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ์ด๋‹ค.
๋จผ์ € htmlํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

<!DOCTYPE html>#์ด htmlํŒŒ์ผ์ด html5๋กœ ์ €์žฅ๋จ์„ ์•Œ ์ˆ˜ ์žˆ์Œ
<html>
    <head>
        <title>Python django example</title>

    </head>

    <body>
        <h1>Title</h1>
        <p>blah blah blah</p>
    </body>
</html>

๊ทธ ํ›„ views.pyํŒŒ์ผ์—

def index(request):
    #return HttpResponse("<h1>Hello World</h1>")
    render(request, 'inedex.html',{})

์„ ์ž‘์„ฑํ•ด์ค€ ๋’ค, settings.py์˜ TEMPLATES์˜ DIRS๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์•ผ ํ•œ๋‹ค.
BASE_DIR์— ์ด ์›นํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ๋กœ๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ๋Š”๋ฐ ์ด๋ฅผ ์ด์šฉํ•œ๋‹ค.

'DIRS': [  os.path.join(BASE_DIR,'homepage','template')],
#์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€

์ถ”๊ฐ€๋กœ ํ…œํ”Œ๋ฆฟ๋ณ€์ˆ˜์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ ํ•„ํ„ฐ๊ฐ€ ์žˆ๋Š”๋ฐ ๋ฐ‘์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

<p>{{my_name | length}}</p> myname์— length๋ผ๋Š” ํ•„ํ„ฐ ์ ์šฉ
myname์˜ ๊ธธ์ด๊ฐ€ ๋ฐ˜ํ™˜๋จ
<p>{{my_name | upper}}</p>

ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ
for ํƒœ๊ทธ
{% for element in my_list %}
            <p>{{element}}</p>
        {% endfor %}

if ํƒœ๊ทธ ์ง์ˆ˜๋งŒ ์ถœ๋ ฅ
{% for element in my_list %}
            {% if element|divisibleby:"2" %}
                <p>{{element}}</p>
            {% endif %}
        {% endfor %}
if not ์€ if ๋’ค์— not๋งŒ ๋ถ™์ด๋ฉด ๋จ

์ด ํ›„ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋ฉด html์ž‘์„ฑํ•œ ํ˜•์‹๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค.
๋~!


profile
๊ฒŒ์„๋ €๋˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณต๋ถ€

0๊ฐœ์˜ ๋Œ“๊ธ€