본문 바로가기
Study/PYTHON,Django

Django(1)-웹 프로그래밍 기초

by 왕방개 2024. 1. 24.

**Python Web Programming
준비

=> 요청을 보내고 응답을 확인하기 위한 도구: Web Browser 나 Web 요청 도구(POSTMAN 등)
=> 서버를 개발하기 위한 파이썬 인터프리터
=> 코드를 작성하기 위한 IDE
=> 데이터를 영구적으로 저장하기 위한 데이터베이스 - ORM 학습을 위해서 관계형 데이터베이스

1. Web 개요

1) Web

=> 인터넷이 연결된 컴퓨터를 통해 사람들이 정보를 공유할 수 있는 정보 공간

2) 웹 애플리케이션을 수행되는 위치에 따라 분류
Web Front End기술
  HTML 4.01:화면구조
  CSS:디자인
  JavaScript:동적인 처리
  HTML5:Semantic 적인 요소를 추가하고 별도의 플러그 인 없이 애플리케이션을 동작시키기 위한 자바스크립트를 추가한 HTML 상위 버전

클라이언트가 서버에게 요청하면 서버가 출력 코드를 만들어서 클라이언트에게 전송하고 클라이언트는 이 내용을 파싱해서 화면에 출력

가끔 브라우저를 이용하지 않고 애플리케이션을 별도로 제작해서 구현하기도 합니다

=>Backend

애플리케이션을 제작하기 위한 프로그래밍 언어 기술
데이터를 반 영구적으로 저장하기 위한 저장 기술
애플리케이션을 구현할 때 필요한 툴이나 프로그램 사용 기술

3)웹 애플리케이션 동작 방식
=>클라이언트가 서버에게 요청을 하고 서버가 처리한 후 출력 코드를 만들어서 클라이언트에게 전송해서 클라이언트가 출력하는 구조:전통적인 방식,템플릿 엔진을 이용하는 방식, 서버 사이드 랜더링

=>클라이언트가 서버에게 요청하고 서버가 처리한 후 결과를 만들어서 클라이언트에게 전송하고 클라이언트가 이데이터를 이용해서 출력 코드를 만들어서 출력하는 벙삭: 서버 애플리케이션과 클라이언트 애플리케이션을 별도로 제작, 클라이언트 사이드 랜더링,최근의 방식'

4)Web 3.0
=>컴퓨터가 정보 자원의 뜻을 이해하고 논리적 추론까지 가능한 시맨틱 웹의 등장
=>플랫폼의 진화:PC->Mobile
=>인공지능의 향상
=>애플리케이션의 진화 -Open API(데이터나 개발도구를 누구나 사용할 수 있도록 제공)
=>OSMU(One Source Multi Use)

5)프레임워크 사용
=>프로그램이 복잡해지면서 높은 생산성과 쉬운 유지보수, 기능 확장이 용이한 개발 기술이 필요하기 때문에 최근에는 직접 구현하기 보다는 프레임워크를 많이 이용
=>개발 방법론, 소프트 웨어 디자인 패턴, 리팩토링 등과 같은 소프트웨어 공학적 기법 등장

6)URL을 바라보는 측면
=>RPC(Remote Procedure Call- 원격 프로시저 호출) -URL이 함수를 호출하는 구조:예전 방식
=>REST(Representational State Transfer)-URL이 서버에 있는 리소스를 표현하는 방식:서버에게 요청할때 데이터를 넘겨주도록 만들고 작업 자체의 구분은 URL이 하는 것이 아니고 전송 방식이 하도록 하는 것

7)전송 방식
=>GET:데이터를 가져올때 사용하는 방식으로 파라미터가 URL에 노출
=>POST:데이터를 삽입할 때 사용하는 방식으로 파라미터가URL에 노출되지 않음
=>PUT:데이터 수정- 데이터 전체를 수정
=>PATCH:데이터 수정-데이터의 일부 속성을 수정, 멱등성이 없다고 권장하지 않음
=>DELETE:데이터 삭제
멱등성:항상 일관된 관계. 입력이 같다면 출력이 같다. 

8)상태코드:서버가 클라이언트에게 응답을 전송할 때 응답에 대한 상태를 나타내는 코드로 3자리
1XX:요청이 수신되었으며 프로세스 진행 중
2XX:성공적으로 처리되었음을 알림
3XX:리다이렉션 중(어려움) 
4XX:클라이언트 오류, 404- URL이 잘못됨
5XX:서버오류

9)Python의 Web FrameWork
=>Flask: 자유도가 높음.구현해주는 거시 거의 없음. 적은 코드로 웹 서버 구축 나으. 복잡한 애플리케이션 만들때 구현할 내용이 많음

=>Fast API: REST API 를 빠르게 만들기 위해 등장한 프레임워크(AI할떄 많이 사용)

=>Django:자유도 낮음.구현해주는 것이 많음.복잡한 애플리케이션이더라도 구현해야 할 코드가 적음.학습을 많이 해야함.ORM때문.

2.Django 개요

1)패키지 이름:django
설치:pip install django
=>가상환경에서 설치하면 가상환경에서만 사용할 수 있고 가상환경이 아닌곳 에서 설치하면 가상환경에서는 사용할 수 없습니다.

2)개발방식-MTV
=>프로그래밍을 할 떄 역할 별로 분리해서 구현
Model:데이터 처리 관련 부분
Template:출력 관련 부분-최근에는 이영역은 사용X.요즘 서버에서 랜더링을 하지 않음
View: 클라이언트의 요청을 처리하는 부분

=>MVC 패턴 - 장고 이외의 영역에서 사용하는 용어

Model:사용될 데이터에 대한 정의를 담고 있는 Django의 클래스
View:출력, Template
Controller:사용자의 요청과 처리하는 부분(Business Logic과 Common concern)을 연결해주는 것


3)가상환경을 이용해서 django 프로젝트를 만들고 실행
=>가상 환경 생성(꼭 cmd 창에서 생성하기)

python -m venv 가상환경이름 ->python이 없다고 나오면 python 3라고 입력


=>가상환경활성화
windows: 

가상환경\Scripts\activate



=>가상환경에 django 설치

pip install django


=>프로젝트 생성:django 작업의 기본단위로 1개 생성

django-admin startproject 프로젝트 이름 생성할 디렉토리 경로(.을 입력하면 현재 디렉토리)

 

예시

django-admin startproject  mysite .


성공하면 현재 디렉토리에 프로젝트 이름으로 디렉토리가 생성되고 디렉토리 안에 몇개의 파일이 자동으로 만들어짐.

=>프로젝트 안에 애플리케이션 생성:django의 실행 코드를 작성하는 단위로 1개 이상 생성
쉽게 말하면 프로젝트가 office 애플리케이션이 word,excel,powerpoint라 생각하면 쉬움

python manage.py startapp 앱이름

 

예시

python manage.py startapp myweb



성공하면 앱이름의 디렉토리가 생성되고 몇개의 파일이 생성됩니다

프로젝트폴더에는 settings 파일이 존재. 파일이름은 내마음대로 바꿀수 없음.

=>실행하는 법

python manage.py runserver [IP주소:포트번호](생략가능)


IP주소와 포트번호를 생략하면  127.0.0.1:8000으로 실행
IP주소는 외부에서 접속하도록 하고자 하면 0.0.0.0 이나 컴퓨터의 실제 IP를 적어야합니다.
ctrl+c하면 멈춤

4)기본 구조
=>프로젝트 디렉토리/settings.py
프로젝트 설정에 관련된 파일
Secret key:보안을 위한 hash key
ALLOWED_HOST=[]:실제 배포할 컴퓨터의 IP를 등록하는 부분으로 '*'으로 하면 아무데서나 배포가능하고 실제 IP를 작성하면 그 IP를 가진 컴퓨터에서만 배포 가능

INSTALLED_APPS 부분을 실행할 애플리케이션을 등록하는 영역
애플리케이션을 생성한 경우 애플리케이션 이름을 등록해주어야 합니다

Middleware 부분은 장고 애플리케이션이 요청을 처리하기 전에 수행하고자 하는 작업이 있을떄 작업을 기재.주로 필터의 역할을 수행

DataBase 부분은 사용할 데이터베이스를 설정하는 부분인데, 기본 코드는 python 안에 있는 sqlite3에 접속하도록 설정되어 있습니다.

TIME_ZONE은 시간 대역을 설정하는 부분인데 우리는 'Asia/Seoul'로 변경해야 합니다.

=>urls.py
사용자의 요청(url)을 처리할 함수나 클래스를 설정하는 파일

=>views.py
실제로 요청을 처리할 함수나 클래스를 작성하는 곳

=>models.py
사용할 데이터베이스 모델을 만드는 곳

5)프로젝트 모델 변경을 데이터베이스에 반영

python manage.py migrate

 

이명령을 맨 처음 실행시키면 유저 정보나 로그인에 관련된 테이블을 자동으로 생성해줌
admin,auth,session 관련 테이블 생성


authentication(인증):로그인
authorization(인가):권한
session:클라이언트의 정보를 서버에 저장하는 것. 대부분의 경우session에 로그인한 유저 정보를 저장해두는 경우가 많음. 세션은 브라우저 창을 닫으면 자동으로 소멸.

6)관리자 계정 생성 및 접속

python manage.py createsuperuser

 를 수행하고 필요한 정보를 입력

 

관리자 접속 성공!

 

7)메인페이지 작성
=>애플리케이션의 views.py 파일에 작성=>아래 예시에서 index나 request는 다른 이름을 사용해도됩니다

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse

#이 함수를 실행하면 ()안의 내용을 클라이언트에게 전송
def index(request):
  return HttpResponse('<h3>Hello Django</h3>')

 



=>프로젝트 urls.py 파일에 작성 -""을 입력하면 myapps/views.py 파일의 index 함수를 호출해서 처리

from django.urls import path
#my app이라는 디렉토리에 있는 views 파일의 내용을 가져오기
from myweb import views 

urlpatterns = [
    path("admin/", admin.site.urls),
    path("",views.index)
]


=>브라우저에 IP:포트번호를 입력할 때 작성한 내용이 보이는지 확인



=>에러가 난 경우 확인
프로젝트의 settings.py 파일에 INSTALLED_APPS에 자신의 앱을 등록했는지 확인
코드에서 앱 이름이나 함수 이름을 정확히 입력했는지 확인

 

8)menu라는 요청이 오면 HTML 파일(menu.html)을 출력 - 별로 안중요
=>애플리케이션의 views.py 파일에 html을 출력하기 위한 함수를 생성

def menu(request):
  #menu.html 파일을 출력하는데 파일에 message라는 이름으로 data 전달
  return render(request,'menu.html',{'message':'data'})



=>출력할 HTML파일을 저장하기 위한 templates 디렉토리(이름은 고정)를 애플리케이션 디렉토리(myweb)에 생성
★views.py가 있는 파일에 만들어야함.즉,우리 예시에는 myweb안에 templates 폴더를 생성해야함

=>templates 디렉토리에 menu.html 파일을 만들고 출력 내용 작성(서버 애플리케이션에 html파일을 만들어서 출력하는 방식을 서버 사이드 랜더링이라고 하고 최근에는 잘 사용하지 않습니다.)(React나 Vue담당)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>메뉴</title>
</head>
<body>
    <h3>템플릿을 이용한 출력</h3>
    <h3>데이터 출력</h3>
    <div>{{message}}</div>
</body>
</html>


=>프로젝트의 urls.py 파일에 url과 views의 함수를 연결하는 코드를 추가

#127.0.0.1/menu/라는 요청이 오면 views.py 파일의 menu라는 함수를 수행
from myweb import views 

urlpatterns = [
    path("admin/", admin.site.urls),
    path("",views.index),
    path("menu/",views.menu)
]


=>서버를 구동하고 127.0.0.1/menu/라고 브라우저 주소창에 입력하면 HTML 파일이 출력해야함.

 

9)파라미터 읽기
=>parameter:웹에서는 클라이언트가 서버에게 전송하는 데이터
=>전송방식
url 파라미터:url에 파라미터를 포함해서 전송하는 방식으로 최근에 많이 사용
티스토리에서 각 콘텐츠의 url은 https://kingbk.tistory.com/38 형식인데 여기서 38은 게시글번호.

url 파라미터 처리 방법:urls.py 파일에 요청을 만들 떄 path('url/<자료형:변수이름>",요청처리함수)
요청 처리 함수를 만들 때 def 함수이름(request,변수이름)으로 만들면 url의 변수 값이 변수에 형 변환되서 대입됩니다. 상세보기에서 많이 쓰이는 방법

ex.)https://kingbk.tistory.com/38

이면 path('/<int:no>',views.detail)

def detail(request,no):
print(no)

**127.0.0.1/article/글번호에 해당하는 숫자 형태의 URL을 처리할 때 글번호에 해당하는 숫자를 출력
=>views.py 파일에 요청을 처리하기 위한 함수를 작성

def detail(request,no):
return HttpResponse(str(no))


=>urls.py 파일에 요청하는 코드를 추가

path('article/<int:no>',views.detail) # int 를 넣으면 반드시 숫자하나라도 넣어야함


=>서버 구동하고 브라우저에서 입력
127.0.0.1/article/숫자 를 입력하면 화면에 숫자가 출력되어야 합니다. 



=>이 방식은 대부분의 경우 하나의 데이터를 가져오고자 할때 기본키값을 데이터로 전송하는 형식에서 주로 사용

 
querystring:GET 방식 요청에서 URL 뒤에 ?을 추가하고 key=value&key=value 형태로 데이터를 전송하는 방식인데 이 방식은 파라미터가 url에 노출되고 데이터의 길이에 제한이 있어서 비밀번호나 파일은 전송할수 없습니다.
=>GET이나 POST 방식으로 전송된 파라미터 읽기
=>요청 처리 메서드의 매개변수에 GET이나 POST라는 딕셔러니로 데이터가 전달됩니다
https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=adele
views.py에서는

def search(request):
request.GET["where"]->nexearch
reuest.GET["query"]->adel
request.GET["fbmm"]->예외발생

urls.py에서는
path('search.naver',views.search)


=>query라는 파라미터를 GET 방식으로 전송할때 읽는 함수를 views.py 파일에 작성

def search(request):
  #keyword=request.GET["query"] 이렇게 하면 잘못칠때 사이트 터짐
  keyword=request.GET.get("query","default value")
  return HttpResponse(keyword)


=>urls.py파일에 search?query=검색어 를 처리하는 url과 함수를 연결

from django.contrib import admin
from django.urls import path
#my app이라는 디렉토리에 있는 views 파일의 내용을 가져오기
from myweb import views 

urlpatterns = [
    path("admin/", admin.site.urls),
    path("",views.index),
    path("menu/",views.menu),
    path('article/<int:no>',views.detail),
    path('search',views.search)
]

 


POST나PUT,DELETE 방식은 데이터를 header 에 숨겨서 전송합니다.
query string 방식으로 전송하게 되면 주소창에 노출되게됨.아이디나 비번같은 경우는 보이면 안되기 떄문에 header에 숨겨서 전송하는 것.

 


3.데이터베이스 연동


=>Docker나 운영체제에 관계형 데이터베이스가 실행 중인지 확인
1)관계형 데이터베이스 연동 방식
=>SQL을 이용하는 방식
프로그래밍 언어의 코드에 SQL을 직접 입력하거나 SQL을 별도의 파일에 만들어두고 사용하는 방식

단점)이 방식은 관계형 데이터베이스가 변경되면 SQL을 수정해야 합니다

 

위 그림에서 id가 root에서 admin으로 수정될떄 2번 방법으로 하는게 간편+ 오류가 일어나지 않게됨. 위와 마찬가지로 ORM을 이용하게 되면 다른 관계형 데이터베이스를 활용하게 되더라도 코드는 수정할 필요가 없게 됨.

 

=>★ORM(Object Rrelation Mapping) 방식★
하나의 객체와 하나의 레코드를 매핑시키는 방식
실제 구현할 떄는 클래스와 테이블을 매핑시킵니다
CRUD 작업을 할 때 SQL을 사용하지 않고 함수를 이용합니다
함수를 호출하면 연결된 데이터베이스에 맞게 SQL을 만들어서 작업을 수행합니다
관계형 데이터베이스가 변경되더라도 파이썬 코드를 수정할 필요가 없어집니다.
작업이 어렵고 잘못하면 성능 저하를 가져올 수 있습니다
SI 업체에는 SQL을 직접 사용하는 방식 선호. 솔루션 업체(플랫폼 기업)에서는 ORM 방식을 선호
Django 를 이용하는 경우 자체적인 ORM엔진이 내장
Flask를 이용할때 ORM을 사용하고자 하면 별도의 패키지를 설치해서 사용.



2)데이터베이스 연결
=>settings.py의 아래 부분을 수정 -기본적으로 로컬의 sqlite3 에 접속하도록 되어 있음
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "db.sqlite3",
    }
}

=>mysql로 수정하는 경우
mysqlclient 패키지를 설치후
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": 데이터베이스 이름",
"USER":"접속할 계정",
"PASSWORD":"비밀번호",
"HOST":"데이터베이스 접속 위치",
"PORT":"접속할 포트번호"
    }
}

=>데이터베이스 관련 작업이 수정된 경우 수행할 내용:수정된 내용이 반영됩니다.
1.python manage.py makemigrations
2.python manage.py migrate

'Study > PYTHON,Django' 카테고리의 다른 글

Django(3)-RestAPI 구현  (0) 2024.01.25
Django(2)-데이터베이스 연동  (0) 2024.01.25
Python(4)-OOP심화  (0) 2024.01.19
PYTHON(3)-객체지향(OOP)  (0) 2024.01.09
Python(2)-모듈,패키지  (0) 2024.01.05