1. 장고의 모든 요청은 URL을 통해서 이루어 짐
- config - settings.py
- path(요청url, 함수) → 127.0.0.1:8000/ + 요청URL로 요청이 들어오면 함수에서 처리
예) path('hello/', b) → 127.0.0.1:8000/hello/ 로 요청이 오면 b함수에서 처리 - 결국 urls에서 view로 이어져야하기 때문에 함수는 대부분 각 app의 views 에 있음
2. path(요청URL, 특정app의 view함수)
- 각 App에는 urls.py와 views.py 모듈이 존재. views에서 만들어진 함수를 호출하기 위해, urls에서는 views모듈을 import해줘야함.
※ 동일 패키지안에 있는 모듈을 불러올때는 from . 으로 사용한다는 것은 기본!
3. URL 연결 (Config 패키지와, 각 App 패키지)
- URL연결이 웹서버 작업의 첫 시작
- Config 패키지의 urls.py 모듈에서는 웹 전체의 URL Pattern을 어떻게 가져갈지 구조를 잡아줌
- 각 App 패키지의 urls.py 모듈에서는 하위레벨 App의 URL Pattern을 잡아주고 각 함수로 연결시켜주는 역할을 함
- 위 과정을 "URL분리" 라고 하며 용이한 관리를 위해 각 App과 관련된 URL은 해당 App에서 관리하겠다는 것이 핵심
- Config의 urls.py에서는 다른 App에 추가경로 정보있으니 거기로 가라고 전달해주는 중간다리 역할
· 구방식: request → config.urls → Apps.views
· 신방식: request → config.urls → Apps.urls → Apps.views - URL 패턴은 언제든 바뀔 수 있으므로, 수정이 용이하도록 변수처럼 URL도 별칭을 지어주어 관리하면 편함
· app_name = "해당app이름'
· path(요청URL, views.index, name=별칭)
[config package→ urls.py]
from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from . import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('acc/',include('acc.urls')),
path('board/',include('board.urls')),
path('trans/',include('trans.urls')),
path('pdf/',include('pdf.urls')),
path('book/',include('book.urls')),
path('vote/',include('vote.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
[app package → urls.py]
from django.urls import path, include
from . import views
app_name = "acc"
urlpatterns = [
path('index/', views.index, name="index"),
path('profile/', views.profile, name="profile"),
path('login/', views.login_user, name="login"),
path('logout/', views.logout_user, name="logout"),
path('signup/', views.signup, name="signup"),
path('update/', views.update, name="update"),
path('delete/', views.delete, name="delete"),
]
4. View (Template과의 연결통로로 데이터처리 및 프로그래밍 역할 수행)
- 앞의 urls에서 지정된 path로 요청이 들어올 때 지정된 처리를 담당하는 함수를 생성
- 앞에서 구성한 URL경로 중 127.0.0.1:8000/acc/index/ 가 호출될때는 views.index함수에서 처리하는데, 아래 코드를 보면 해당 함수에서는 acc/index.html 템플릿을 가지고와서 열라고 지정되어있는 것을 알 수 있음
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.hashers import check_password
from .models import User
from django.contrib import messages
# Create your views here.
def index(request) :
return render(request, "acc/index.html")
def signup(request) :
if request.method == "POST":
un = request.POST.get("uname")
pw = request.POST.get("upass")
ag = request.POST.get("uage")
co = request.POST.get("comm")
pi = request.FILES.get("upic")
User.objects.create_user(username=un, password=pw, age=ag, comment=co, pic=pi)
return redirect("acc:index")
return render(request, "acc/signup.html")
def update(request) :
if request.method == "POST" :
u=request.user
pw = request.POST.get("upass")
co = request.POST.get("comment")
pi = request.FILES.get("pic")
if pw:
u.set_password(pw)
if pi:
u.pic.delete()
u.pic = pi
u.comment = co
u.save()
login(request, u)
#messages.info(request, "정보가 변경되었습니다.")
return redirect("acc:profile")
return render(request, "acc/update.html")
def delete(request) :
if check_password(request.POST.get("passcheck"), request.user.password):
request.user.pic.delete()
request.user.delete()
else:
messages.error(request, "PASSWORD가 일치하지 않습니다.")
return redirect("acc:index")
def profile(request) :
return render(request, "acc/profile.html")
def login_user(request) :
if request.method == "POST" :
un = request.POST.get('uname')
pw = request.POST.get('upass')
user = authenticate(username=un, password=pw)
if user :
login(request, user)
messages.success(request, f"{user}님 환영합니다.")
return redirect("acc:index")
else:
messages.error(request, "아이디나 패스워드가 잘못되었습니다. :(")
return render(request, "acc/login.html")
def logout_user(request) :
logout(request)
return redirect('acc:index')
'웹개발 > 장고 (Django)' 카테고리의 다른 글
#6_Admin 사이트 테이블 등록, 관리자 계정 생성, HTML데이터 전달 (0) | 2022.06.25 |
---|---|
#5_Model(DB) (0) | 2022.06.25 |
#4_HTML 기초 (0) | 2022.06.25 |
#3_Client에 응답 보내기 (feat. MTV분리) (0) | 2022.06.25 |
#1_가상환경 설치 및 서버 구동 (0) | 2022.06.20 |