10. URL과 View

조재훈·2022년 7월 24일
0

Clone_Airbnb

목록 보기
22/31
post-thumbnail

1) views

우리가 구현하고 싶은건 메인에 들어가자마자 바로 방 리스트가 쭉 펼쳐지는 화면이다.

rooms - views.py

from django.shortcuts import render

def all_rooms(request):
    pass

config - urls.py

from rooms import views as views_room

urlpatterns = [
    path("", views_room.all_rooms),
    path("admin/", admin.site.urls),
]

127.0.0.1:8000

HttpResponse가 없단다.
근데 그 이전에 url을 계속 config의 urls.py에 추가하다보면 너무 양이 방대해진다. 그래서 세부 경로가 앱별로 나누어지는 경우에는 해당 앱에 urls.py를 만들어서 거기에다가 경로를 추가할 것이다.
우선 config에서는 admin이냐 public이냐를 구분한다.
config - urls.py

from django.contrib import admin
from django.urls import path, include
from django.confg import settings
from django.conf.urls.static import static

urlpatterns = [
    path("", include("core.urls")),
    path("admin/", admin.site.urls),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

core에서는 어느 앱으로 갈라지는지를 정해준다.
core - urls.py

from djangol.urls import path
from rooms import views as room_views

urlpatterns = [path("", room_views.all_rooms)]

하지만 아직 그대로

config - urls.py

from django.contrib import admin
from django.urls import path, include
from django.confg import settings
from django.conf.urls.static import static

urlpatterns = [
    path("", include("core.urls", namespace="core")),
    path("admin/", admin.site.urls),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

core에서는 어느 앱으로 갈라지는지를 정해준다.
core - urls.py

from djangol.urls import path
from rooms import views as room_views

urlpatterns = [path("", room_views.all_rooms, name="home")]


app_name을 넣으라고 한다.
core - urls.py

from djangol.urls import path
from rooms import views as room_views

app_name="core"

urlpatterns = [path("", room_views.all_rooms, name="home")]

core의 app_name은 config의 namespace와 같아야한다.

하지만 또....

views는 해당 URL로 그 view로 들어갈 때 마다 HTTP Request를 생성한다. 그리고 그에 응답해줘야 한다. 이걸 반환해주지 못하면 저런 에러가 뜨게 된다.
그럼 어떤 request가 가는지 함 보자.
rooms - views.py

def all_rooms(request):
    print(request)
    pass

콘솔에 아래와 같이 출력된다.

그럼 그 안에 뭐가 들었는지 확인해보자.

def all_rooms(request):
    print(vars(request))
    pass

어마무시하게 길다. 스샷 찍기가 어려울 정도로. 찍어봤자 구분이 안된다....

System check identified no issues (0 silenced).
July 23, 2022 - 22:59:14
Django version 4.1rc1, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
{
'environ': {
    'ACLOCAL_PATH': 'C:\\Program Files\\Git\\mingw64\\share\\aclocal;C:\\Program Files\\Git\\usr\\share\\aclocal', 
    'ALLUSERSPROFILE': 'C:\\ProgramData', 
    'APPDATA': 'C:\\Users\\pc\\AppData\\Roaming', 
    'CHOCOLATEYINSTALL': 'C:\\ProgramData\\chocolatey', 
    'CHOCOLATEYLASTPATHUPDATE': '132680766478545252', 
    'CHROME_CRASHPAD_PIPE_NAME': '\\\\.\\pipe\\crashpad_17300_LVSZEGZEXWROFEFU', 
    'COLORTERM': 'truecolor', 
    'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 
    'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 
    'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 
    'COMPUTERNAME': 'DESKTOP-EVT8KF1', 
    'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe', 
    'CONFIG_SITE': 'C:/Program Files/Git/mingw64/etc/config.site', 
    'DISPLAY': 'needs-to-be-defined', 
    'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 
    'EXEPATH': 'C:\\Program Files\\Git\\bin', 
    'GETTEXTCLDRDIR': 'C:\\Program Files\\gettext-iconv\\lib\\gettext', 
    'GIT_ASKPASS': 'c:\\Users\\pc\\AppData\\Local\\Programs\\Microsoft VS Code\\resources\\app\\extensions\\git\\dist\\askpass.sh', 
    'HOME': 'C:\\Users\\pc', 
    'HOMEDRIVE': 'C:', 
    'HOMEPATH': '\\Users\\pc', 
    'HOSTNAME': 'DESKTOP-EVT8KF1', 
    'INFOPATH': 'C:\\Program Files\\Git\\usr\\local\\info;C:\\Program Files\\Git\\usr\\share\\info;C:\\Program Files\\Git\\usr\\info;C:\\Program Files\\Git\\share\\info', 
    'KEYSHOT10': 'C:\\Users\\Public\\Documents\\KeyShot 10', 
    'KEYSHOT_EXTERNAL_LICENSE_FOLDER': 'C:\\Program Files\\Siemens\\Solid Edge 2022\\Program', 
    'LANG': 'ko_KR.UTF-8', 
    'LOCALAPPDATA': 'C:\\Users\\pc\\AppData\\Local', 
    'LOGONSERVER': '\\\\DESKTOP-EVT8KF1', 
    'MANPATH': 'C:\\Program Files\\Git\\mingw64\\local\\man;C:\\Program Files\\Git\\mingw64\\share\\man;C:\\Program Files\\Git\\usr\\local\\man;C:\\Program Files\\Git\\usr\\share\\man;C:\\Program Files\\Git\\usr\\man;C:\\Program Files\\Git\\share\\man', 
    'MINGW_CHOST': 'x86_64-w64-mingw32', 
    'MINGW_PACKAGE_PREFIX': 'mingw-w64-x86_64', 
    'MINGW_PREFIX': 'C:/Program Files/Git/mingw64', 
    'MSYSTEM': 'MINGW64', 
    'MSYSTEM_CARCH': 'x86_64', 
    'MSYSTEM_CHOST': 'x86_64-w64-mingw32', 
    'MSYSTEM_PREFIX': 'C:/Program Files/Git/mingw64', 
    'NUMBER_OF_PROCESSORS': '8', 
    'NVM_HOME': 'C:\\Users\\pc\\AppData\\Roaming\\nvm', 
    'NVM_SYMLINK': 'C:\\Program Files\\nodejs', 
    'ONEDRIVE': 'C:\\Users\\pc\\OneDrive', 
    'ONEDRIVECONSUMER': 'C:\\Users\\pc\\OneDrive', 
    'ORIGINAL_PATH': 'C:\\Program Files\\Git\\mingw64\\bin;C:\\Program Files\\Git\\usr\\bin;C:\\Users\\pc\\bin;C:\\Program Files (x86)\\VMware\\VMware Player\\bin;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0;C:\\WINDOWS\\System32\\OpenSSH;C:\\Program Files\\Git\\cmd;C:\\Program Files\\mingw64\\bin;C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin;C:\\Program Files (x86)\\GnuWin32\\bin;C:\\ProgramData\\chocolatey\\bin;C:\\Users\\pc\\AppData\\Local\\Android\\Sdk\\tools;C:\\Users\\pc\\AppData\\Local\\Android\\Sdk\\platform-tools;C:\\Program Files\\PuTTY;C:\\Users\\pc\\AppData\\Local\\Programs\\Python\\Python39;C:\\Users\\pc\\AppData\\Local\\Programs\\Python\\Python39\\Scripts;C:\\Program Files\\Docker\\Docker\\resources\\bin;C:\\ProgramData\\DockerDesktop\\version-bin;%NVM_HOME%;%NVM_SYMLINK%;C:\\Program Files\\nodejs;C:\\Program Files\\gettext-iconv\\bin;C:\\Users\\pc\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\pc\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\pc\\AppData\\Local\\atom\\bin;C:\\Users\\pc\\AppData\\Local\\GitHubDesktop\\bin;C:\\Program Files\\Bandizip;C:\\Users\\pc\\AppData\\Roaming\\nvm;C:\\Program File\\nodejs;C:\\Users\\pc\\AppData\\Roaming\\npm', 
    'ORIGINAL_TEMP': 'C:/Users/pc/AppData/Local/Temp', 
    'ORIGINAL_TMP': 'C:/Users/pc/AppData/Local/Temp', 
    'ORIGINAL_XDG_CURRENT_DESKTOP': 'undefined', 
    'OS': 'Windows_NT', 
    'PATH': 'C:\\Users\\pc\\.virtualenvs\\hairbnb-y5k8nTIf\\Scripts;C:\\Users\\pc\\.virtualenvs\\hairbnb-y5k8nTIf\\Scripts;C:\\Users\\pc\\bin;C:\\Program Files\\Git\\mingw64\\bin;C:\\Program Files\\Git\\usr\\local\\bin;C:\\Program Files\\Git\\usr\\bin;C:\\Program Files\\Git\\usr\\bin;C:\\Program Files\\Git\\mingw64\\bin;C:\\Program Files\\Git\\usr\\bin;C:\\Users\\pc\\bin;C:\\ProgramFiles (x86)\\VMware\\VMware Player\\bin;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0;C:\\WINDOWS\\System32\\OpenSSH;C:\\Program Files\\Git\\cmd;C:\\Program Files\\mingw64\\bin;C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin;C:\\Program Files (x86)\\GnuWin32\\bin;C:\\ProgramData\\chocolatey\\bin;C:\\Users\\pc\\AppData\\Local\\Android\\Sdk\\tools;C:\\Users\\pc\\AppData\\Local\\Android\\Sdk\\platform-tools;C:\\Program Files\\PuTTY;C:\\Users\\pc\\AppData\\Local\\Programs\\Python\\Python39;C:\\Users\\pc\\AppData\\Local\\Programs\\Python\\Python39\\Scripts;C:\\ProgramFiles\\Docker\\Docker\\resources\\bin;C:\\ProgramData\\DockerDesktop\\version-bin;%NVM_HOME%;%NVM_SYMLINK%;C:\\Program Files\\nodejs;C:\\Program Files\\gettext-iconv\\bin;C:\\Users\\pc\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\pc\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\pc\\AppData\\Local\\atom\\bin;C:\\Users\\pc\\AppData\\Local\\GitHubDesktop\\bin;C:\\Program Files\\Bandizip;C:\\Users\\pc\\AppData\\Roaming\\nvm;C:\\Program Files\\nodejs;C:\\Users\\pc\\AppData\\Roaming\\npm;C:\\Program Files\\Git\\usr\\bin\\vendor_perl;C:\\Program Files\\Git\\usr\\bin\\core_perl;[\\c\\Users\\pc\\Anaconda3];[\\c\\Users\\pc\\Anaconda3]\\Scripts;C:\\Users\\pc\\anaconda3;C:\\Users\\pc\\anaconda3\\Scripts;[\\c\\Users\\pc\\Anaconda3];[\\c\\Users\\pc\\Anaconda3]\\Scripts;C:\\Users\\pc\\anaconda3;C:\\Users\\pc\\anaconda3\\Scripts', 
    'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 
    'PIPENV_ACTIVE': '1', 
    'PIP_DISABLE_PIP_VERSION_CHECK': '1', 
    'PIP_PYTHON_PATH': 'C:\\Users\\pc\\AppData\\Local\\Programs\\Python\\Python39\\python.exe', 
    'PKG_CONFIG_PATH': 'C:\\Program Files\\Git\\mingw64\\lib\\pkgconfig;C:\\Program Files\\Git\\mingw64\\share\\pkgconfig', 
    'PLINK_PROTOCOL': 'ssh', 
    'PROCESSOR_ARCHITECTURE': 'AMD64', 
    'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 142 Stepping 12, GenuineIntel', 
    'PROCESSOR_LEVEL': '6', 
    'PROCESSOR_REVISION': '8e0c', 
    'PROGRAMDATA': 'C:\\ProgramData', 
    'PROGRAMFILES': 'C:\\Program Files', 
    'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 
    'PROGRAMW6432': 'C:\\Program Files', 
    'PROMPT': '$P$G', 
    'PS1': '\\[\\033]0;$TITLEPREFIX:$PWD\\007\\]\\n\\[\\033[32m\\]\\u@\\h \\[\\033[35m\\]$MSYSTEM \\[\\033[33m\\]\\w\\[\\033[36m\\]`__git_ps1`\\[\\033[0m\\]\\n$ ', 
    'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules', 
    'PUBLIC': 'C:\\Users\\Public', 
    'PWD': '/e/github/hairbnb', 
    'PYTHONDONTWRITEBYTECODE': '1', 
    'P_SCHEMA': 'C:\\Program Files\\Siemens\\Solid Edge 2022\\Schema', 
    'SESSIONNAME': 'Console', 
    'SE_LICENSE_SERVER': 'C:\\Program Files\\Siemens\\Solid Edge 2022\\Preferences\\SELicense.lic', 
    'SHELL': 'C:\\Program Files\\Git\\usr\\bin\\bash.exe', 
    'SHLVL': '2', 
    'SSH_ASKPASS': 'C:/Program Files/Git/mingw64/libexec/git-core/git-gui--askpass', 
    'SYSTEMDRIVE': 'C:', 
    'SYSTEMROOT': 'C:\\WINDOWS', 
    'TEMP': 'C:\\Users\\pc\\AppData\\Local\\Temp', 
    'TERM_PROGRAM': 'vscode', 
    'TERM_PROGRAM_VERSION': '1.69.2', 
    'TMP': 'C:\\Users\\pc\\AppData\\Local\\Temp', 
    'TMPDIR': 'C:\\Users\\pc\\AppData\\Local\\Temp', 
    'USERDOMAIN': 'DESKTOP-EVT8KF1', 
    'USERDOMAIN_ROAMINGPROFILE': 'DESKTOP-EVT8KF1', 
    'USERNAME': 'pc', 
    'USERPROFILE': 'C:\\Users\\pc', 
    'VIRTUAL_ENV': 'C:/Users/pc/.virtualenvs/hairbnb-y5k8nTIf', 
    'VSCODE_GIT_ASKPASS_EXTRA_ARGS': '--ms-enable-electron-run-as-node', 
    'VSCODE_GIT_ASKPASS_MAIN': 'c:\\Users\\pc\\AppData\\Local\\Programs\\Microsoft VS Code\\resources\\app\\extensions\\git\\dist\\askpass-main.js', 
    'VSCODE_GIT_ASKPASS_NODE': 'C:\\Users\\pc\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe', 
    'VSCODE_GIT_IPC_HANDLE': '\\\\.\\pipe\\vscode-git-e71a75dc81-sock', 
    'WINDIR': 'C:\\WINDOWS', '_': '/usr/bin/winpty', 
    'DJANGO_SETTINGS_MODULE': 'config.settings', 
    'RUN_MAIN': 'true', 
    'SERVER_NAME': 'kubernetes.docker.internal', 
    'GATEWAY_INTERFACE': 'CGI/1.1', 
    'SERVER_PORT': '8000', 
    'REMOTE_HOST': '', 
    'CONTENT_LENGTH': '', 
    'SCRIPT_NAME': '', 
    'SERVER_PROTOCOL': 'HTTP/1.1', 
    'SERVER_SOFTWARE': 'WSGIServer/0.2', 
    'REQUEST_METHOD': 'GET', 
    'PATH_INFO': '/', 
    'QUERY_STRING': '', 
    'REMOTE_ADDR': '127.0.0.1', 
    'CONTENT_TYPE': 'text/plain', 
    'HTTP_HOST': '127.0.0.1:8000', 
    'HTTP_CONNECTION': 'keep-alive', 
    'HTTP_CACHE_CONTROL': 'max-age=0', 
    'HTTP_SEC_CH_UA': '" Not;A Brand";v="99", "Microsoft Edge";v="103", "Chromium";v="103"', 
    'HTTP_SEC_CH_UA_MOBILE': '?0', 
    'HTTP_SEC_CH_UA_PLATFORM': '"Windows"', 
    'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 
    'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.62', 
    'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 
    'HTTP_SEC_FETCH_SITE': 'none', 
    'HTTP_SEC_FETCH_MODE': 'navigate', 
    'HTTP_SEC_FETCH_USER': '?1', 
    'HTTP_SEC_FETCH_DEST': 'document', 
    'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 
    'HTTP_ACCEPT_LANGUAGE': 'ko,en;q=0.9,en-US;q=0.8', 
    'HTTP_COOKIE': '__T_=1; coachmark%3A0=true; csrftoken=y9Wt5O2UO4gOs12MAkET6nv7QUPbEjvH; sessionid=947wicoqj364jw63a4i950n191vispww', 
    'wsgi.input': <django.core.handlers.wsgi.LimitedStream object at 0x000001B7EF81DD90>, 
    'wsgi.errors': <colorama.ansitowin32.StreamWrapper object at 0x000001B7ECCE46A0>, 
    'wsgi.versin': (1, 0), 
    'wsgi.run_once': False, 
    'wsgi.url_scheme': 'http', 
    'wsgi.multithread': True, 
    'wsgi.multiprocess': False, 
    'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>, 
    'CSRF_COOKIE': 'y9Wt5O2UO4gOs12MAkET6nv7QUPbEjvH'
    }, 
'path_info': '/', 
'path': '/', 
'META': {
    'ACLOCAL_PATH': 'C:\\Program Files\\Git\\mingw64\\share\\aclocal;C:\\Program Files\\Git\\usr\\share\\aclocal', 
    'ALLUSERSPROFILE': 'C:\\ProgramData', 
    'APPDATA': 'C:\\Users\\pc\\AppData\\Roaming', 
    'CHOCOLATEYINSTALL': 'C:\\ProgramData\\chocolatey', 
    'CHOCOLATEYLASTPATHUPDATE': '132680766478545252', 
    'CHROME_CRASHPAD_PIPE_NAME': '\\\\.\\pipe\\crashpad_17300_LVSZEGZEXWROFEFU', 
    'COLORTERM': 'truecolor', 
    'COMMONPROGRAMFILES': 'C:\\Program Files\\CommonFiles', 
    'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 
    'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 
    'COMPUTERNAME': 'DESKTOP-EVT8KF1', 
    'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe', 
    'CONFIG_SITE': 'C:/Program Files/Git/mingw64/etc/config.site', 
    'DISPLAY': 'needs-to-be-defined', 
    'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 
    'EXEPATH': 'C:\\Program Files\\Git\\bin', 
    'GETTEXTCLDRDIR': 'C:\\Program Files\\gettext-iconv\\lib\\gettext', 
    'GIT_ASKPASS': 'c:\\Users\\pc\\AppData\\Local\\Programs\\Microsoft VS Code\\resources\\app\\extensions\\git\\dist\\askpass.sh', 
    'HOME': 'C:\\Users\\pc', 
    'HOMEDRIVE': 'C:', 
    'HOMEPATH': '\\Users\\pc', 
    'HOSTNAME': 'DESKTOP-EVT8KF1', 
    'INFOPATH': 'C:\\Program Files\\Git\\usr\\local\\info;C:\\Program Files\\Git\\usr\\share\\info;C:\\Program Files\\Git\\usr\\info;C:\\Program Files\\Git\\share\\info', 
    'KEYSHOT10': 'C:\\Users\\Public\\Documents\\KeyShot 10', 
    'KEYSHOT_EXTERNAL_LICENSE_FOLDER': 'C:\\Program Files\\Siemens\\Solid Edge 2022\\Program', 
    'LANG': 'ko_KR.UTF-8', 
    'LOCALAPPDATA': 'C:\\Users\\pc\\AppData\\Local', 
    'LOGONSERVER': '\\\\DESKTOP-EVT8KF1', 
    'MANPATH': 'C:\\Program Files\\Git\\mingw64\\local\\man;C:\\Program Files\\Git\\mingw64\\share\\man;C:\\Program Files\\Git\\usr\\local\\man;C:\\Program Files\\Git\\usr\\share\\man;C:\\Program Files\\Git\\usr\\man;C:\\Program Files\\Git\\share\\man', 
    'MINGW_CHOST': 'x86_64-w64-mingw32', 
    'MINGW_PACKAGE_PREFIX': 'mingw-w64-x86_64', 
    'MINGW_PREFIX': 'C:/Program Files/Git/mingw64', 
    'MSYSTEM': 'MINGW64', 
    'MSYSTEM_CARCH': 'x86_64', 
    'MSYSTEM_CHOST': 'x86_64-w64-mingw32', 
    'MSYSTEM_PREFIX': 'C:/Program Files/Git/mingw64', 
    'NUMBER_OF_PROCESSORS': '8', 
    'NVM_HOME': 'C:\\Users\\pc\\AppData\\Roaming\\nvm', 
    'NVM_SYMLINK': 'C:\\Program Files\\nodejs', 
    'ONEDRIVE': 'C:\\Users\\pc\\OneDrive', 
    'ONEDRIVECONSUMER': 'C:\\Users\\pc\\OneDrive', 
    'ORIGINAL_PATH': 'C:\\Program Files\\Git\\mingw64\\bin;C:\\Program Files\\Git\\usr\\bin;C:\\Users\\pc\\bin;C:\\Program Files (x86)\\VMware\\VMware Player\\bin;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0;C:\\WINDOWS\\System32\\OpenSSH;C:\\Program Files\\Git\\cmd;C:\\Program Files\\mingw64\\bin;C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin;C:\\Program Files (x86)\\GnuWin32\\bin;C:\\ProgramData\\chocolatey\\bin;C:\\Users\\pc\\AppData\\Local\\Android\\Sdk\\tools;C:\\Users\\pc\\AppData\\Local\\Android\\Sdk\\platform-tools;C:\\Program Files\\PuTTY;C:\\Users\\pc\\AppData\\Local\\Programs\\Python\\Python39;C:\\Users\\pc\\AppData\\Local\\Programs\\Python\\Python39\\Scripts;C:\\Program Files\\Docker\\Docker\\resources\\bin;C:\\ProgramData\\DockerDesktop\\version-bin;%NVM_HOME%;%NVM_SYMLINK%;C:\\Program Files\\nodejs;C:\\Program Files\\gettext-iconv\\bin;C:\\Users\\pc\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\pc\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\pc\\AppData\\Local\\atom\\bin;C:\\Users\\pc\\AppData\\Local\\GitHubDesktop\\bin;C:\\Program Files\\Bandizip;C:\\Users\\pc\\AppData\\Roaming\\nvm;C:\\Program Files\\nodejs;C:\\Users\\pc\\AppData\\Roaming\\npm', 
    'ORIGINAL_TEMP': 'C:/Users/pc/AppData/Local/Temp', 
    'ORIGINAL_TMP': 'C:/Users/pc/AppData/Local/Temp', 
    'ORIGINAL_XDG_CURRENT_DESKTOP': 'undefined', 
    'OS': 'Windows_NT', 
    'PATH': 'C:\\Users\\pc\\.virtualenvs\\hairbnb-y5k8nTIf\\Scripts;C:\\Users\\pc\\.virtualenvs\\hairbnb-y5k8nTIf\\Scripts;C:\\Users\\pc\\bin;C:\\Program Files\\Git\\mingw64\\bin;C:\\Program Files\\Git\\usr\\local\\bin;C:\\Program Files\\Git\\usr\\bin;C:\\Program Files\\Git\\usr\\bin;C:\\Program Files\\Git\\mingw64\\bin;C:\\Program Files\\Git\\usr\\bin;C:\\Users\\pc\\bin;C:\\Program Files (x86)\\VMware\\VMware Player\\bin;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0;C:\\WINDOWS\\System32\\OpenSSH;C:\\Program Files\\Git\\cmd;C:\\Program Files\\mingw64\\bin;C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin;C:\\Program Files (x86)\\GnuWin32\\bin;C:\\ProgramData\\chocolatey\\bin;C:\\Users\\pc\\AppData\\Local\\Android\\Sdk\\tools;C:\\Users\\pc\\AppData\\Local\\Android\\Sdk\\platform-tools;C:\\Program Files\\PuTTY;C:\\Users\\pc\\AppData\\Local\\Programs\\Python\\Python39;C:\\Users\\pc\\AppData\\Local\\Programs\\Python\\Python39\\Scripts;C:\\Program Files\\Docker\\Docker\\resources\\bin;C:\\ProgramData\\DockerDesktop\\version-bin;%NVM_HOME%;%NVM_SYMLINK%;C:\\Program Files\\nodejs;C:\\Program Files\\gettext-iconv\\bin;C:\\Users\\pc\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\pc\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\pc\\AppData\\Local\\atom\\bin;C:\\Users\\pc\\AppData\\Local\\GitHubDesktop\\bin;C:\\Program Files\\Bandizip;C:\\Users\\pc\\AppData\\Roaming\\nvm;C:\\Program Files\\nodejs;C:\\Users\\pc\\AppData\\Roaming\\npm;C:\\Program Files\\Git\\usr\\bin\\vendor_perl;C:\\Program Files\\Git\\usr\\bin\\core_perl;[\\c\\Users\\pc\\Anaconda3];[\\c\\Users\\pc\\Anaconda3]\\Scripts;C:\\Users\\pc\\anaconda3;C:\\Users\\pc\\anaconda3\\Scripts;[\\c\\Users\\pc\\Anaconda3][\\c\\Users\\pc\\Anaconda3]\\Scripts;C:\\Users\\pc\\anaconda3;C:\\Users\\pc\\anaconda3\\Scripts', 
    'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 
    'PIPENV_ACTIVE': '1', 
    'PIP_DISABLE_PIP_VERSION_CHECK': '1', 
    'PIP_PYTHON_PATH': 'C:\\Users\\pc\\AppData\\Local\\Programs\\Python\\Python39\\python.exe', 
    'PKG_CONFIG_PATH': 'C:\\Program Files\\Git\\mingw64\\lib\\pkgconfig;C:\\Program Files\\Git\\mingw64\\share\\pkgconfig', 
    'PLINK_PROTOCOL': 'ssh', 
    'PROCESSOR_ARCHITECTURE': 'AMD64', 
    'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 142 Stepping 12, GenuineIntel', 
    'PROCESSOR_LEVEL': '6', 
    'PROCESSOR_REVISION': '8e0c', 
    'PROGRAMDATA': 'C:\\ProgramData', 
    'PROGRAMFILES': 'C:\\Program Files', 
    'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 
    'PROGRAMW6432': 'C:\\Program Files', 
    'PROMPT': '$P$G', 
    'PS1': '\\[\\033]0;$TITLEPREFIX:$PWD\\007\\]\\n\\[\\033[32m\\]\\u@\\h \\[\\033[35m\\]$MSYSTEM \\[\\033[33m\\]\\w\\[\\033[36m\\]`__git_ps1`\\[\\033[0m\\]\\n$ ', 
    'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules', 
    'PUBLIC': 'C:\\Users\\Public', 
    'PWD': '/e/github/hairbnb', 
    'PYTHONDONTWRITEBYTECODE': '1', 
    'P_SCHEMA': 'C:\\Program Files\\Siemens\\Solid Edge 2022\\Schema', 
    'SESSIONNAME': 'Console', 
    'SE_LICENSE_SERVER': 'C:\\Program Files\\Siemens\\Solid Edge 2022\\Preferences\\SELicense.lic', 
    'SHELL': 'C:\\Program Files\\Git\\usr\\bin\\bash.exe', 
    'SHLVL': '2', 
    'SSH_ASKPASS': 'C:/Program Files/Git/mingw64/libexec/git-core/git-gui--askpass', 
    'SYSTEMDRIVE': 'C:', 
    'SYSTEMROOT': 'C:\\WINDOWS', 
    'TEMP': 'C:\\Users\\pc\\AppData\\Local\\Temp', 
    'TERM_PROGRAM': 'vscode', 
    'TERM_PROGRAM_VERSION': '1.69.2', 
    'TMP': 'C:\\Users\\pc\\AppData\\Local\\Temp', 
    'TMPDIR': 'C:\\Users\\pc\\AppData\\Local\\Temp', 
    'USERDOMAIN': 'DESKTOP-EVT8KF1', 
    'USERDOMAIN_ROAMINGPROFILE': 'DESKTOP-EVT8KF1', 
    'USERNAME': 'pc', 
    'USERPROFILE': 'C:\\Users\\pc', 
    'VIRTUAL_ENV': 'C:/Users/pc/.virtualenvs/hairbnb-y5k8nTIf', 
    'VSCODE_GIT_ASKPASS_EXTRA_ARGS': '--ms-enable-electron-run-as-node', 
    'VSCODE_GIT_ASKPASS_MAIN': 'c:\\Users\\pc\\AppData\\Local\\Programs\\Microsoft VS Code\\resources\\app\\extensions\\git\\dist\\askpass-main.js', 
    'VSCODE_GIT_ASKPASS_NODE': 'C:\\Users\\pc\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe', 
    'VSCODE_GIT_IPC_HANDLE': '\\\\.\\pipe\\vscode-git-e71a75dc81-sock', 
    'WINDIR': 'C:\\WINDOWS', '_': '/usr/bin/winpty', 
    'DJANGO_SETTINGS_MODULE': 'config.settings', 
    'RUN_MAIN': 'true', 
    'SERVER_NAME': 'kubernetes.docker.internal', 
    'GATEWAY_INTERFACE': 'CGI/1.1', 
    'SERVER_PORT': '8000', 
    'REMOTE_HOST': '', 
    'CONTENT_LENGTH': '', 
    'SCRIPT_NAME': '', 
    'SERVER_PROTOCOL': 'HTTP/1.1', 
    'SERVER_SOFTWARE': 'WSGIServer/0.2', 
    'REQUEST_METHOD': 'GET', 
    'PATH_INFO': '/', 
    'QUERY_STRING': '', 
    'REMOTE_ADDR': '127.0.0.1', 
    'CONTENT_TYPE': 'text/plain', 
    'HTTP_HOST': '127.0.0.1:8000', 
    'HTTP_CONNECTION': 'keep-alive', 
    'HTTP_CACHE_CONTROL': 'max-age=0', 
    'HTTP_SEC_CH_UA': '" Not;A Brand";v="99", "Microsoft Edge";v="103", "Chromium";v="103"', 
    'HTTP_SEC_CH_UA_MOBILE': '?0', 
    'HTTP_SEC_CH_UA_PLATFORM': '"Windows"', 
    'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 
    'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.62', 
    'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 
    'HTTP_SEC_FETCH_SITE': 'none', 
    'HTTP_SEC_FETCH_MODE': 'navigate', 
    'HTTP_SEC_FETCH_USER': '?1', 
    'HTTP_SEC_FETCH_DEST': 'document', 
    'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 
    'HTTP_ACCEPT_LANGUAGE': 'ko,en;q=0.9,en-US;q=0.8', 
    'HTTP_COOKIE': '__T_=1; coachmark%3A0=true; csrftoken=y9Wt5O2UO4gOs12MAkET6nv7QUPbEjvH; sessionid=947wicoqj364jw63a4i950n191vispww', 
    'wsgi.input': <django.core.handlers.wsgi.LimitedStream object at 0x000001B7EF81DD90>, 
    'wsgi.errors': <colorama.ansitowin32.StreamWrapper object at 0x000001B7ECCE46A0>, 
    'wsgi.version': (1, 0), 
    'wsgi.run_once': False, 
    'wsgi.url_scheme': 'http', 
    'wsgi.multithread': True, 
    'wsgi.multiprocess': False, 
    'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>, 
    'CSRF_COOKIE': 'y9Wt5O2UO4gOs12MAkET6nv7QUPbEjvH'
    }, 
'method': 'GET', 
'content_type': 'text/plain', 
'content_params': {}, 
'_stream': <django.core.handlers.wsgi.LimitedSteam object at 0x000001B7EF81DE50>, 
'_read_started': False, 
'resolver_match': ResolverMatch(func=rooms.views.all_rooms, args=(), kwargs={}, url_name='home', app_names=['core'], namespaces=['core'], route=''), 
'COOKIES': {
    '__T_': '1', 
    'coachmark%3A0': 'true', 
    'csrftoken': 'y9Wt5O2UO4gOs12MAkET6nv7QUPbEjvH', 
    'sessionid': '947wicoqj364jw63a4i950n191vispww'
    }, 
'session': <django.contrib.sessions.backends.db.SessionStore object at 0x000001B7EF81DC10>, 
'user': <SimpleLazyObject: <function AuthenticationMiddleware.process_request.<locals>.<lambda> at 0x000001B7EF862160>>, 
'_messages': <FallbackStorage: request=<WSGIRequest: GET '/'>>, 
'csrf_processing_done': True
}

dir로 검색해보자.

def all_rooms(request):
    print(dir(request))
    pass

코드를 건드려보자

from django.http import HttpResponse

def all_rooms(request):
    return HttpResponse(content="hello")

2) Template

근데 우리는 매번 모든 HTML을 HttpResponse하는 식으로 구동하지 않을 것이다.

from django.shortcuts import render

def all_rooms(request):
    return render(request, "all_rooms")

템플릿이 없다는 오류가 뜬다.

오류 하단부에 Template-loader postmortem을 보면 장고 엔진이 템플릿을 찾기 위해 뒤져본 경로가 나온다.

  • django.template.loaders.app_directories.Loader: C:\Users\pc.virtualenvs\hairbnb-y5k8nTIf\lib\site-packages\django\contrib\admin\templates\all_rooms.html (Source does not exist)
  • django.template.loaders.app_directories.Loader: C:\Users\pc.virtualenvs\hairbnb-y5k8nTIf\lib\site-packages\django\contrib\auth\templates\all_rooms.html (Source does not exist)

우리는 매번 모든 html코드를 view에 입력하지 않고 템플릿이란걸 만들 것이다. 완성된 html을 불러오면 파이썬이 알아서 컴파일해주는 것이다. 이를 위해 특별한 html 코드를 작성할 것이다.
프로젝트에 templates 폴더를 만들어주자. 그리고 그 안에 all_rooms.html 파일도 만들자.


'ㅅ' ......

왜냐면 우리가 임의로 적어놓긴 했지만 장고에게 알려주지는 않았다. 정확히는, 템플릿 경로를 알려주어야 한다.
config - settings.py

...

TEMPLATES = [
    {
        "DIRS": [os.path.join(BASE_DIR, "templates"],
        ...
    }
]

...



context 라는 기능이 있다. 파일에서 작성한 변수를 템플릿으로 보낼 수 있는 것이다.
rooms - views.py

from datetime import datetime
from django.shortcuts import render

def all_rooms(request):
    now = datetime.now()
    hungry = True
    return render(
        request,
        "all_rooms.html",
        context={"now":now, "hungry":hungry},
    )

템플릿에서는 앞서 지정한 변수를 불러오는데 대괄호 2개를 겹쳐씌우고 그 안에 변수명을 입력하면 된다. 그럼 장고는 해당 변수명을 우리가 지정한 context의 변수명과 일치하는거로 교체해줄 것이다.
templates - all_rooms.html

<h1>hello</h1>

<h4>The time right now is: {{now}}</h4>

<h4>Am I hungry? {{hungry}}</h4>


또한 조건문도 집어넣을 수 있다. 물론 장고 방식으로. 이거는 대괄호 안에 퍼센트 기호를 넣고 그 안에 로직을 넣는 식으로 한다.
templates - all_rooms.html

<h4>
    Am I huungry?
    {% if hungry %}
        I'm hungry
    {% else %}
        I'm okay
    {% endif %}
</h4>


자 그러면 생성된 모든 Room 객체를 html로 끌고 와보자.
rooms - views.py

from django.shortcuts import render
from . import models

def all_rooms(request):
    all_rooms = models.Room.objects.all()
    return render(request, "all_rooms.html", context={"rooms": all_rooms})

templates - all_rooms

{% for room in rooms %}
    <h1>{{room.name}} / {{room.price}}</h1>
{% endfor %}


변수 관계도

이제 제대로 꾸며볼 차례인데 유사한 구조/내용의 html을 이 파일 저 파일에 다 갖다 붙이는건 너무나 비효율적이다. 그러니 가장 기본이 되는 템플릿을 만들어주자. base를 만들고나서 이를 직접 렌더링하지 않고 상속시켜서 구현한다.
template 폴더에 base.html 파일을 만들고 또 rooms 폴더를 만들어서 기존에 만들어둔 all_rooms.html은 거기에 넣는다.

templates - base.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    &copy; hairbnb
  </body>
</html>

상속받을 템플릿에는 상단에 {% extends "상속파일명" %} 을 적는다. templates 폴더 내에만 있으면 파일 이름만 적어도 상관없다.

{% extends "base.html" %}

{% for room in rooms %}
    <h1>{{room.name}} / ${{room.price}}</h1>
{% endfor %}

그리고 render할 파일의 경로가 바뀌었으므로 이를 고쳐주자.
rooms - views.py

from django.shortcuts import render
from . import models


def all_rooms(request):
    all_rooms = models.Room.objects.all()
    return render(
        request,
        "rooms/all_rooms.html",
        context={"rooms": all_rooms},
    )

짠. 문제는 방(room)들이 안뜬다.

3) Block

base 템플릿에 내용을 추가해주어야 한다. block은 자식 템플릿이 부모 템플릿에 내용을 투영할 수 있는 수단이다.
우선 base 템플릿은 어떤 이름의 블럭이 배치되는지 알려주어야 한다.

{% block 이름 %}{% endblock 이름 %}

또한 파생? 템플릿은 동일한 블럭에다가 그 안에 어떤 내용이 들어갈지 입력해준다.

{% block 이름 %}
내용
{% endblock 이름 %}

templates - rooms - home.html

{% extends "base.html" %}


{% block page_name %}
    Home
{% endblock page_name %}


{% block content %}
    {% for room in rooms %}
        <h1>{{room.name}} / ${{room.price}}</h1>
    {% endfor %}
{% endblock content %}

templates - base.html - body

    <title>
      {% block page_name %}
      {% endblock page_name %} | Hairbnb
    </title>
    <body>
      {% block content %}
      {% endblock content %}
    </body>

이런 방식을 활용해 html 파일을 쪼개서 관리할 수 있다.
몇개 더 만들어보자.
templates 폴더 내에 partials 폴더를 만들고 그 안에 header.html과 footer.html을 만든다.
templates - partials - header.html

<header>
  <a href="/">Hairbnb</a>
  <ul>
    <li><a href="#">Login</a></li>
  </ul>
</header>

templates - partials - footer.html

<footer>
  &copy; Hairbnb
</footer>

templates - base.html - body

<body>
  {% include "partials/header.html" %}
  
  {% block content %}{% endblock content %}
  
  {% include "partials/footer.html" %}
</body>

짠. header와 footer 모두 잘 나왔다.

profile
맨땅에 헤딩. 인생은 실전.

0개의 댓글