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')

+ Recent posts