본문 바로가기
IT/Python

[Python] Django 간략하게 살펴보기 (Web FrameWork)

by dwoi 2023. 6. 23.

Python 웹 프레임워크 중 하나인 Django에 대해서 공부한 내용을 정리

 

목차

     


    Django

    https://www.youtube.com/playlist?list=PLuHgQVnccGMDLp4GH-rgQhVKqqZawlNwG 

     

    Python Django Web Framework

     

    www.youtube.com

     


    1. Django

    ⓐ. 설치

    python3 -m pip install django

     

    ⓑ. 프로젝트 시작

    djago-admin startproject myproject .

     

    점(.) : 현재 디렉토리에 프로젝트 시작

    프로젝트 시작 시 다음과 같은 파일이 형성

    ⓒ. 서버 실행

    python manage.py runserver 0:80

    글작성자의 환경은 클라우드 환경이라 80번 포트를 열어서 웹으로 외부 사이트로 접속 가능하도록 설정

     

    ◆ 만약 localhost로 설정하고 싶으면 뒤에 포트번호를 생략

     

     


     

    2. app 만들기

    2.1. urls.py :Django로 작성된 사이트들의 목차

    - 특정 기능을 수행하기 위해 접속하는 주소를 url이라고 하고 이를 설정

    - url 설정을 이 파일 안에 기록

    프로젝트에 해당하는 urls.py는 여러 앱들에 대한 목록을 가지고 있어서 사용자의 요청에 맞게 데이터를 뷰, 모델, db를 거쳐 요청에 맞는 응답을 제공해주는 것이 django의 기본적인 구조

    2.2. 라우팅

    1. project에 있는 url를 통해 호출하는 정보를 app으로 위임
    2. app에서 해당 경로에 해당하는 값이 있다면 views.py에서 해당하는 함수를 호출
    3. 정의된 함수에 따라 http요청, json 반환 등을 실행해서 진행하는 것으로 마무리

    myproject- urls.py
    각 요청에 따라 views 객체에 해당하는 함수들을 호출
    views.py에 여러 함수들을 정의한 후 해당 함수를 통해 http응답을 돌려주는 것으로 해결
    실제 응답

    → /read/3asd라는 url로 요청 시 read <3asd>라는 http 응답을 주는 것으로 확인할 수 있음.


     

    3. 사이트 Read 

    views.py 수정본

    from django.shortcuts import render, HttpResponse
    import random
    
    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) :
        global topics
        ol = ''
        for topic in topics:
            ol += '<li><a href="/read/{}">{}</a></li>'.format(topic["id"], topic["title"])
        return '''
            <!DOCTYPE html>
            <html lang="en">
                <head>
                    <meta charset="UTF-8">
                    <meta name="viewport" content="width=device-width, initial-scale=1.0">
                    <title>Django</title>
                </head>
                <body>
                    <h1><a href="/">Django</a></h1>
                    <ol>
                        {}
                    </ol>
                    {}
                </body>
            </html>
        '''.format(ol, articleTag)
    # Create your views here.
    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 = '<h2>{}</h2><p>{}</p>'.format(topic['title'], topic['body'])
                break
                
        if not article:
            return HttpResponse('<h3>404 Not Found: Requested article does not exist</h3>', status=404)
        else:
            return HttpResponse(HTMLTemplate(article))

     

    1. HTMLTemplate() 함수 정의
      1. HTML 기본적인 탬플릿 함수를 제공해서 공통적으로 사용되는 템플릿 제공
    2. index() 함수 정의
      1. index로 들어오는 경우 어떤 형식을 보여줄 지에 대한 정의
    3. read() 함수 정의
      • 각 read/1 여러 ur로 들어오는 경우 해당하는 url에 맞게 제공
      • 이 때 해당하지 않는 url로 들어오는 경우 404 not found로 설정
      • 또한 문자열로 들어오는 경우에도 에러날 거같은데 일단 수정 보류

     

    → views.py로 들어올때 어떻게 들어오는지에 대한 정의를 해줌으로써 라우팅해주는 결과다.

     

     

     


     

    외부 요청 시 사이트 Create

    def create(request):
            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))
    • /create 로 들어오는 경우
      • title과 body를 입력하면 post 방식으로 전달해주는 방향
    def create(request):
        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>
            '''
            return HttpResponse(HTMLTemplate(article))
        elif request.method == 'POST':
            # 요청된 데이터를 받는다
            title = request.POST.get('title', None)
            body = request.POST.get('body', None)
            newTopic={"id":nextId, "title":title, "body":body}
            topics.append(newTopic)
            url= '/read/'+str(nextId)
            nextId = nextId + 1
            return redirect(url)
    • title과 body라는 요청된 데이터를 받으면 newTopic으로 받고 topics 리스트에 append
    • 그 후 id +1
    • redirect로 해당 url로 연

     


    마무리

    여러 함수들로 서로 라우팅해주면서 연결해주다보니 그거에 대한 헷갈리면서 놓치는 경우가 다수 발생

    이에 대해서 유의하며 django를 익힐 것이 필요하다고 판단!

     

     

     

     

     

     

     

     

     

    댓글