728x90

이글은 완전 기초적인 CRUD 구현방법에 대해 설명해드린느 글입니다.

 


CRUD란?

📥 Create : 데이터 생성
👀 Read : 데이터 불러오기
✍️ Update : 데이터 수정 / 갱신
📤 Delete : 데이터 삭제하기

 

 

 

<1.시작>

#1.장고설치 
pip install django
#2. 장고 프로젝트만들기
django-admin startproject config .
#3. 데이터베이스DB 생성
python manage.py migrate
#4. 앱생성
python manage.py startapp myapp

 

 

<2.프로젝트 구성>

>

 

3. 소스코드

#myproject/urls.py

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

#사용자가 사이트에 접속했을떄 요청을 어떻게 누가 처리할건지 지정하는 
#라우팅을 해주는 파일 

# https://127.0.0.1/
# https://127.0.0.1/app/
# https://127.0.0.1/create/
# https://127.0.0.1/read/1/
urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('myapp.urls'))
]
#myapp/urls.py

#장고의 urls.py 파일은 페이지 요청이 발생하면 가장 먼저 호출되는 파일로 
#URL과 뷰 함수 간의 매핑을 정의한다. 뷰 함수는 views.py 파일에 정의된 함수를 말한다.
# 본 프로젝트에서는 글생성, 읽기, 삭제, 수정 이 있기때문에 4개의 path를 추가해주었다.

from django.contrib import admin
from django.urls import path , include
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)
    
]

 

#myapp/views.py

from django.shortcuts import render, HttpResponse
import random
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import redirect
nextId = 4
topics = [
{'id':1, 'title':'routing', 'body':'Rounting is ..'},
{'id':2, 'title':'view', 'body':'view is ..'},
{'id':3, 'title':'model', 'body':'model is ..'}
]

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

            <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>
        {articleTag}

        <ul>
            <li><a href="/create/">create</a></li>
            {contextUI}
            
        </ul>
        
        </body>
        </html>
                                      
    ''')

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

    return HttpResponse(HTMLTemplate(article))

def read(request,id):
    global topics
    article =''

    for topic in topics:
        if topic['id'] == int(id):
            article = f'<h2>{topic["title"]}</h2>{topic["body"]}'

    return HttpResponse(HTMLTemplate(article,id))

@csrf_exempt
def create(request):
    global nextId

    print('request.method : ' , request.method)
    if request.method == 'GET':       
        article ='''
            <form action= "/create/" method="post">
                <p> <input type="text" placeholder="title" name="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}

        url = '/read/' + str(nextId)
        nextId = nextId + 1
        topics.append(newtopic)
        return redirect(url)
    
@csrf_exempt
def delete(request):
    global topics

    if request.method == 'POST':
        id = request.POST['id']
        newTopics = []
        for topic in topics:
            if topic['id'] != int(id):
                newTopics.append(topic)
        topics = newTopics
        return redirect('/')
    
@csrf_exempt
def update(request,id):
    global topics
    if request.method == 'GET':

        for topic in topics:
            if topic['id'] == int(id):
                selectedTopic ={
                    "title":topic['title'],
                    "body":topic['body']
                }
        article = f'''
            <form action ="/update/{id}/" method="post">
                <p> <input type="text" name="title" placeholder="title"></p>
                <p> <textarea name="body" placeholder="body">{selectedTopic['body']}</textarea></p>
                <p> <input type="submit"></p>
            </form>
        '''
        return HttpResponse(HTMLTemplate(article,id))
    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
        return redirect(f'/read/{id}')

 

<4. 결과화면 >

 

 

< 5.느낀점 >

Django를 처음 공부하면서 배우는건데 파이썬과 웹작동방식을 조금 알고있으니 빨리 빨리 이해되는거같다.

html css db이용해서 웹페이지 게시판을 처음 구현할때 1주일이 넘는시간이 걸렸던거같은데.... 

 

쨋든 개발을 다하고나서 글쓰기에 <script>alert('test')</script> 스크립트문을 넣었더니 그대로 실행되더라... 보안적인 부분은 아직 장고라는 프레임워크를 배우는단계라 고민만 해보고 다음 단계로 넘어가야겠다. 

728x90

'Python > Django' 카테고리의 다른 글

파이썬 Django 웹 개발 환경준비하기  (0) 2023.09.06
728x90

1. 웹 개발 환경준비

1.장고설치 
pip install django
2. 장고 프로젝트만들기
django-admin startproject config .
3. 데이터베이스DB 생성
python manage.py migrate

2. 프로젝트 구조 

1. config 폴더 : 프로젝트 설정 파일과 웹 서비스 실행을 위한 파일이 들어 있습니다.

   __init__.py : 파이썬 2.x 버전과 호환을 위해 만들어진 비어있는 파일 

   settings.py : 프로젝트 설정에 관한 내용이 담긴 파일

      BASE_DIR : 프로젝트 루트폴더, 설정 파일이나 py파일 등에서 프로젝트의 루트 폴더를 찾아 그 하위를 탐색함, 이 때         문에 변수를 미리 준비해 두는 값

      SECRET_KEY: 보안을 위해 사용되는값, 세션값의 보호나 비밀번호 변경시 사용되는 보안URL을 만드는데 이용

      DEBUG: 디버그 모드를 설정합니다. True 일경우 다양한 오류 메시지ㅣ를  즉시 확인가능 *배포시에는 False 

      allowed_hosts : 현재 서비스의 호스트를 설정 *개발시에는 비어두고 배포시 '*'나 실제 도메인을 사용함

      INSTALLED_APPS: 장고 웹서비스는 다양한 앱의결합으로 만들어지는데, 현재 프로젝트에서 사용하는 앱의 목록을        기록하고 관리합니다.

      MIDDLEWARE: 장고의 모든 요청응답메시지 사이에 실행되는 특수한 프레임워크

      ROOT_URLCONF:기준이 되는 urls.py파일의 경로를 설정

      TEMPLATES: 장고에서 사용하는 템플릿 시스템에 대한 설정들

      WSGI_APPLICATION: 실행을 위한 WSGI 어플리케이션을 설정함

      DATABASE: DB관련 설정

      AUTH_PASSWORD_VALIDATORS : 비밀번호 검을위한 설정

      LANGUAGE_CODE : 다국어에 관한 설정

 

   urls.py : 특정 기능을 수행하기 위해 접속하는 주소를 url이라고 하고 이를 설정해 주는데, 그 설정을 이 파일에 기록함.

   wsgi.py : 웹 서비스를 실행하기 위한 wsgi관련 내용이 들어있습니다. / 실제로 웹 서버와 장고 애플리케이션 사이 통신 역할을 담당 

 

2. venv 폴더 : 프로젝트 구동에 필요한 가상환경이 들어있는 폴더

3. db.sqlite3 : SQLite3 DB파일

4. manage.py : 장고의 다양한 명령어를 실행하기 위한 파일

 

장고 기본명령어

1. 서버 시작하기

$ python manage.py runserver 8080 기본 웹 서버는 8000 포트를 기본으로 동작한다. 변경하고 싶다면 포트 번호를 적어준다.
$ python manage.py runserver 0.0.0.0:8000 IP를 직접 지정하거나 같은 네트워크 망 안에서 접속이 가능하도록 할 때 왼쪽과 같이 적어준다.
$ python manage.py runserver 0:8000 0은 0.0.0.0의 약어이다. 해당 형태로 동작을 시킬 때는 settings.py에 있는 ALLOWED_HOSTS를 설정해 준다.

서버를 실행 후 종료를 하기 위해서는 [Ctrl+C]를 누르면 된다.

 

 

 

2. 기본 명령어 정리

$ django-admin startproject 프로젝트이름

장고 프로젝트를 만드는 명령이다. 장고를 설치 후에 위와 같이 명령어를 치면 프로 젝트가 생성된다. 아래와 같이 뒤에 .을 붙여주면 새로운 파일에서 프로젝트가 생성되는 것이 아니라 현재 파일에서 프로젝트가 생성된다.

$ django-admin startproject 프로젝트이름 .

 

 

$ python manage.py startapp 앱이름

프로젝트에 기능 단위인 앱을 새로 만들 때 사용한다.

 

 

$ python manage.py makemigrations 어플리케이션의 변경 사항을 추적에 DB에 적용할 내용을 정리한다. 보통 모델의 변경 사항이 있을 때 주로 사용한다.
$ python manage.py migrate 실제 변경사항을 DB에 반영한다.
$ python manage.py showmigrations DB 변경사항 목록과 상태를 출력한다.
$ python manage.py createsuperuser 관리자 계정을 생성한다.
$ python manage.py changepassword 계정의 비밀번호를 변경할 수 있다.

 

$ python manage.py sqlmigrate 실행할 SQL 명령문을 출력한다. 어떤 명령문을 실행할지 확인할 떄 사용하고, 튜닝이 안된 쿼리나 슬로우 쿼리 여부를 확인할 수 있다.
$ python manage.py dumpdata 현재 DB의 내용을 백업할 때 사용한다.
$ python manage.py loaddata 백업 파일에서 DB로 내용을 복구 할 때 사용한다.
$ python manage.py flush DB 테이블은 그대로 두고 테이블의 내용만 전부 삭제한다.
$ python manage.py shell 장소 쉘(shell)을 실행한다. 작성한 모델 등을 불러와 실제로 테스트를 해볼 수 있다.
$ python manage.py dbshell DB에 직접 접근할 수 있는 쉘을 실행한다. 장고 어플리케이션에 문제가 있어 관리자 페이지에 접근할 수 없을 때 보통 shell을 이용해 DB를 수정하는데 SQL 구문을 이용해 직접 수정하고 싶다면 dbshell을 이용할 수 있다.

 

참고 : https://han-py.tistory.com/308 

참고 : 배프의 오지랖 파이썬 웹프로그래밍

 

728x90

'Python > Django' 카테고리의 다른 글

[Django] Django CRUD 간단한 게시판 구현하기  (0) 2023.09.17

+ Recent posts