[Django] clone instagram #1

์ •๋ณด๊ตฌ๋‹ˆยท2021๋…„ 11์›” 29์ผ
0

Django

๋ชฉ๋ก ๋ณด๊ธฐ
9/15
post-thumbnail

์žฅ๊ณ  ๊ธฐ์ดˆ ํŠœํ† ๋ฆฌ์–ผ์„ ๊ณต๋ถ€ํ•˜๊ณ  ๋‚˜๋‹ˆ๊นŒ, ์žฅ๊ณ ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ์กฐ.....๊ธˆ์€ ์•Œ๊ฒƒ ๊ฐ™์ง€๋งŒ์„œ๋„ ์•„์ง์€ ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋Š” ๋ถ€๋ถ„๋„ ์žˆ๊ณ  ๋งŽ์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ๋Š๊ปด์ง„๋‹ค.

๊ทธ๋ž˜์„œ ์žฅ๊ณ ๋ฅผ ๋”์šฑ ์ตํžˆ๋Š” ์—ฐ์Šต์„ ์œ„ํ•ด ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ธ์Šคํƒ€๊ทธ๋žจ์„ ํด๋ก ์ฝ”๋”ฉํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค!


์‹œ์ž‘ํ•˜๊ธฐ ์•ž์„œ ์žฅ๊ณ ์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž

์žฅ๊ณ ๋Š” MVT ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.
M (Model)
V (View) : ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.
T (Templates) : ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ๋ถ€๋ถ„, html์ด๋‚˜ css ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•œ๋‹ค.



์žฅ๊ณ  ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ธํŒ…


์žฅ๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์•ž์„œ์„œ ๊ฐ€์ƒํ™˜๊ฒฝ(venv)์„ ์„ธํŒ… ํ•ด์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

python -m venv venv

๋งŒ๋“ค์–ด์ค€ ๊ฐ€์ƒํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”์‹œํ‚ค๊ณ , ์žฅ๊ณ ๋ฅผ ์„ค์น˜ํ•ด์ค€๋‹ค.

venv\scripts\activate
(venv) pip install django==1.8



Django ์ƒˆ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ


๊ทธ ๋‹ค์Œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์žฅ๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ๊ณจ๊ฒฉ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

(venv) django-admin startproject mysite .

๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

instagram/
    instagram/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
    venv/
    manage.py

์›นํŽ˜์ด์ง€ ๋„์šฐ๊ธฐ

๋งŒ๋“ค์–ด์ค€ ์žฅ๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
(venv) python manage.py runserver

์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๊ณ  http://127.0.0.1:8000/์— ๋“ค์–ด๊ฐ€๋ฉด ์žฅ๊ณ ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


์ด๋•Œ ํ•ด๋‹น ip์ฃผ์†Œ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์•Œ์•„๋ณด์ž๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • 127.0.0.1 : localhost๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ, ์ž๊ธฐ์ž์‹ ์ธ ๋‚˜์˜ ์ปดํ“จํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • :8000 : port๋ผ๊ณ  ํ•˜๋ฉฐ, 8000์„ ํƒ€๊ณ  ๋“ค์–ด์˜ค๋ฉด ์žฅ๊ณ ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.



๋‚ด๊ฐ€ ๋งŒ๋“  ํŽ˜์ด์ง€ ๋„์šฐ๊ธฐ


main.html ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹Œ ๋‚˜์˜ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ ์œ„ํ•ด
templates/instagram๋””๋ ‰ํ† ๋ฆฌ์— htmlํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

instagram/
    instagram/
    templates/
        instagram/
             main.html
    venv/
    manage.py

- templates/instagram/main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>์—ฌ๊ธฐ์— ํƒ€์ดํ‹€์„ ์ ์Šต๋‹ˆ๋‹ค.</title>
</head>

<body>
    <h1>์ œ๋ชฉ ํ…์ŠคํŠธ๋ฅผ ์ ์Šต๋‹ˆ๋‹ค.</h1>
    <p>์ผ๋ฐ˜ ํ…์ŠคํŠธ๋ฅผ ์ ์Šต๋‹ˆ๋‹ค.</p>

    <div>
        <button>์ด๊ฑด ๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค.</button>
    </div>
</body>
</html>

์ด๋ ‡๊ฒŒ main.html์„ ๋งŒ๋“ค์–ด ์คฌ์ง€๋งŒ, ์ž๋™์œผ๋กœ ์›นํŽ˜์ด์ง€๊ฐ€ ์ˆ˜์ •๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.

ํ•ด๋‹น url์„ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ main.htmlํŽ˜์ด์ง€๋ฅผ ์—ด์–ด์ค„ ์ˆ˜ ์žˆ๋Š” ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์‚ฌ์šฉ์ž์—๊ฒŒ main.html์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” view์—์„œ ์–ด๋– ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
์ด๋•Œ urls.py๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.
urls.pyํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค url๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ ์–ด๋–ค
view์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ฌ๊นŒ, ์–ด๋–ค htmlํŒŒ์ผ์„ ๋ณด์—ฌ์ค„๊นŒ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ view.py์™€ urls.py ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ฃผ๋„๋ก ํ•œ๋‹ค.


views.py ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

views.py๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ ์ด์ „์— ํ•œ๊ฐ€์ง€ ์„ค์น˜๋ฅผ ํ•ด์ฃผ๋ ค๊ณ  ํ•œ๋‹ค.

์žฅ๊ณ ์—์„œ REST๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•œ ๋Œ€ํ‘œ์ ์ธ ํˆด์ด ์žฅ๊ณ  rest ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ค์น˜ํ•ด์ค€๋‹ค.

(venv) pip install djangorestframework


์„ค์น˜๋ฅผ ๋งˆ์ณค์œผ๋ฉด, view.py๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ๋„๋ก ํ•œ๋‹ค.

- instagram/view.py

from django.shortcuts import render
from rest_framework.views import APIView


class Main(APIView):
    def get(self, request):
        return render(request, "instagram/main.html")

์—ฌ๊ธฐ์„œ APIView๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์•„๊นŒ django rest framework๋ฅผ ์„ค์น˜ํ•ด์ค€ ๊ฒƒ์ด๋‹ค.
rest framework๋ผ๋Š” ํŒจํ‚ค์ง€ ์•ˆ์— APIView๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์„ ํ†ตํ•ด rest ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ์ค€๋‹ค.


urls.pyํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

์›นํŽ˜์ด์ง€๊ฐ€ ๋ณด์—ฌ์ง€๋Š” ์‚ฌ์ดํด์€ urls์—์„œ views๋กœ ๊ฐ€์„œ templates์— ์žˆ๋Š” main.html์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์ˆœ์„œ์ด๋‹ค.

๋”ฐ๋ผ์„œ urls.py๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

- instagram/urls.py

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

from instagram.views import Main

urlpatterns = [
    path('admin/', admin.site.urls),
    path('main/', Main.as_view())  # url ๋’ค์— main์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ, Main ํด๋ž˜์Šค์˜ ๋ทฐ๋ฅผ ์‚ฌ์šฉ
]

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์ค€ ๋’ค ์„œ๋ฒ„๋ฅผ ํ™•์ธํ•ด๋ณด์•˜๋”๋‹ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

๐Ÿ“Œ error ํ•ด๊ฒฐ (no such table: django_session)

no such table: django_session๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

ํ•ด๋‹น ์—๋Ÿฌ์— ๋Œ€ํ•ด ๊ตฌ๊ธ€๋ง ํ•ด๋ณด๋‹ˆ,
py manage.py runserver ๋ช…๋ น์–ด๋กœ ์„œ๋ฒ„ ์‹คํ–‰ ํ›„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋œ ํ…Œ์ด๋ธ” ์ค‘ django_session์ด ์—†์–ด์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ผ๊ณ  ํ•œ๋‹ค.

์—๋Ÿฌ ํ•ด๊ฒฐ์„ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ migrateํ•ด์ค€ ๋’ค ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค!

python manage.py migrate


์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ http://127.0.0.1:8000/main/ url์„ ํ†ตํ•ด ๋‚ด๊ฐ€ ๋งŒ๋“ค์–ด์ค€ main.html์ด ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.



app ์ถ”๊ฐ€ํ•˜๊ธฐ


์žฅ๊ณ ์—์„œ๋Š” ์•ฑ ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
์•ฑ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ด์œ ๋Š” ์ธ์Šคํƒ€๊ทธ๋žจ์„ ์ƒ๊ฐํ•ด๋ณด์ž๋ฉด, ํ”ผ๋“œ์— ๊ด€ํ•œ ์†Œ์Šค๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ฉฐ, ์ข‹์•„์š”์— ๊ด€ํ•œ ์†Œ์Šค, ๋Œ“๊ธ€์— ๊ด€ํ•œ ์†Œ์Šค ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ด๊ฒƒ๋“ค์„ ํ•˜๋‚˜์˜ ์†Œ์ŠคํŒŒ์ผ์—์„œ ๊ด€๋ฆฌํ•˜๋‹ค ๋ณด๋ฉด ์†Œ์ŠคํŒŒ์ผ์ด ์—„์ฒญ ์ปค์ง€๊ธฐ ๋•Œ๋ฌธ์—
์žฅ๊ณ ์—์„œ๋Š” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์•ฑ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•œ๋‹ค.

์ด๋•Œ ์•ฑ์€ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋‚˜๋ˆ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


์ง€๊ธˆ์€ content์™€ user๋ผ๋Š” ์•ฑ์„ ๋งŒ๋“ค์–ด ์ฃผ๋ ค๊ณ  ํ•œ๋‹ค.

(venv) python manage.py startapp content
(venv) python manage.py startapp user

๊ทธ๋Ÿฌ๋ฉด ๋งŒ๋“ค์–ด์ค€ ์•ฑ์— ๋Œ€ํ•œ ํด๋”๊ฐ€ ์ถ”๊ฐ€๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

instagram/
    content/
    instagram/
    user/
    templates/
    venv/
    manage.py

๋งŒ๋“ค์–ด์ค€ ์•ฑ์— ๋Œ€ํ•ด ์žฅ๊ณ ์—์„œ ์•ฑ์ด๋ผ๊ณ  ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋“ฑ๋ก์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.

settin.pyํŒŒ์ผ์„ ์—ด๊ณ  INSTALLED_APPS์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

- instagram/setting.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'content',
    'user',
    'instagram'
]



๐Ÿ”Ž ์ฐธ๊ณ 
๊ฐ•์˜
๊ฐ•์˜์ž๋ฃŒ
error : no such table: django_session

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