Python Django Web Framework

skh951225·2022년 8월 24일
0
post-thumbnail

강의주소

Django 시작하기

  • project, app 생성
django-admin startproject [projectname]
django-admin startapp app [appname]
  • runserver
python manage.py runserver

PORT 개념

  • Server 에는 여러개의 Server Software가 존재
  • Server에 접속하기 위해선 어떤 Server Software로 접속할지 정해야함. 이러한 역할을 PORT가 하게됨
  • 프로그램은 특정 PORT로 통신하게 되는데 이러한 것을 Listening 이라고 함

APP

  • 보통 application을 project 안에서 구현하는 것이 아니라 app이라는 더 작은 단위를 만들어서 구현
  • views.py 는 application의 구체적인 구현을 담당함
    (1)사용자가 접속하게 되면 project는 적당한 app에게 해당 작업을 위임함
    (2) app은 적당한 view에 위임함
    (3) view는 DB에 직접 접속하지 않고 model을 통해서 접속함(매우 편리함)
    (4) 최종적으로 data(html,xml,json 등)를 응답

Routing

  • route 는 경로라는 뜻
  • 사용자가 접속한 각각의 경로를 누가 처리할 것인지를 정하는 것
  • 가장 큰 틀의 routing은 project의 urls.py가 수행하게 됨
  • project는 적당한 app으로 위임하고 app의 views.py의 특정 함수에게 위임

include('주소') 를 통해 app으로 위임할 수 있다

# project/urls.py
from django.urls import path, include
urlpatterns = [
	path('',include('myapp.urls'))
]

views로 위임하는 것은 include 없이 가능하다.

# myapp/urls.py
from django.urls import path
from myapp import views
urlpatterns = [
	path('<id>',views.index),
]

view 안의 함수는 기본적으로 request를 인자로 가진다. 추가적인 입력을 가지기 위해선 urls.py의 주소에 <id> 와 같은 형태로 표현 해주어야 함

#views.py
from django.shortcuts import render, HttpResponse
def index(request,id):
	return HttpResponse('Hello!'+id+'!')

Web Application Server

  • 미리 정보를 만들어놓고 그 중 선택하여 선택해 응답하는 Web Server와 달리 Web Application Server는 입력을 받고 그 입력을 가지고 정보를 생성하여 응답
  • 따라서 웹 서버는 Static 하고 응답 속도가 빠르며, 웹 어플리케이션 서버는 Dynamic하고 상대적으로 느림
  • 웹 어플리케이션 서버는 view를 통해 수정이 용이하여 확장성이 좋음

Django CRUD 구현

# app/view.py
from types import NoneType
from django.shortcuts import render, redirect, HttpResponse
import random
from django.views.decorators.csrf import csrf_exempt

nextId = 4
topics = [
    {'id': 1, 'title': 'Routing', 'body': 'Routing is ...'},
    {'id': 2, 'title': 'View', 'body': 'View is ...'},
    {'id': 3, 'title': 'Model', 'body': "Model is ..."}
]

def HTMLTemplate(articleTag, id=None):
    global topics
    ol = ''
    delete = ''
    update = ''
    if id:
        delete = f'''
                <li>
                    <form action="/delete/" method="post">
                        <input type="hidden" name="id" value={id}>
                        <input type="submit" value="delete">
                    </form>
                </li>
                '''
        update = f'<li><a href="/update/{id}/">update</a></li>'

    for topic in topics:
        ol += f'<li><a href="/read/{topic["id"]}/">{topic["title"]}</a></li>'
    return f'''
    <html>
        <body>
            <h1><a href="/">Django</a></h1>
            <ol>
                {ol}
            </ol>
            <p>
                {articleTag}
            </p>
            <ul>
                <li><a href="/create/">create</a></li>
                {delete}
                {update}
            </ul>
        </body>
    </html>
    '''


def index(request):
    article = '''
        <h2>Welcome</h2>
        Hello, Django
    '''
    return HttpResponse(HTMLTemplate(article))


@csrf_exempt
def create(request):
    global topics
    global nextId
    if request.method == 'GET':
        article = '''
            <form action="/create/" method="post">
                <p><input type="text" name="title" placeholder="title"></p>
                <p><textarea name="body" placeholder="body"></textarea></p>
                <p><input type="submit"></p>
            </form>
        '''
        return HttpResponse(HTMLTemplate(article))
    elif request.method == 'POST':
        title = request.POST['title']
        body = request.POST['body']
        newtopic = {'id': nextId, 'title': title, 'body': body}
        topics.append(newtopic)
        url = f'/read/{nextId}'
        nextId += 1
        return redirect(url)


@csrf_exempt
def update(request, id):
    global topics
    if request.method == 'GET':
        for topic in topics:
            if topic["id"] == int(id):
                title = topic["title"]
                body = topic["body"]
        article = f'''
            <form action="/update/{id}/" method="post">
                <p><input type="text" name="title" placeholder="title" value={title}></p>
                <p><textarea name="body" placeholder="body">{body}</textarea></p>
                <p><input type="submit"></p>
            </form>
        '''
        return HttpResponse(HTMLTemplate(article))
    elif request.method == 'POST':
        title = request.POST['title']
        body = request.POST['body']
        for topic in topics:
            if topic["id"] == int(id):
                topic["title"] = title
                topic["body"] = body
        url = f'/read/{id}'
        return redirect(url)


@csrf_exempt
def delete(request):
    global topics
    if request.method == "POST":
        newtopics = []
        id = request.POST["id"]
        for topic in topics:
            if topic["id"] != int(id):
                newtopics.append(topic)
        topics = newtopics
        return redirect('/')


def read(request, id):
    global topics
    article = ''
    for topic in topics:
        if topic['id'] == int(id):
            article += f'<h2>{topic["title"]}</h2><p>{topic["body"]}</p>'
    return HttpResponse(HTMLTemplate(article, id))
#app/urls.py
from django.urls import path
from myapp import views
urlpatterns = [
    path('', views.index),
    path('create/', views.create),
    path('read/<id>/', views.read),
    path('delete/', views.delete),
    path('update/<id>/', views.update),
]

0개의 댓글