Day9. 웹 서버 만들기

0ㅑ채
|2024. 1. 24. 19:18

 

전송 방식

  • GET: 데이터를 가져올 때 사용하는 방식으로 파라미터가 URL에 노출
  • POST: 데이터를 삽입할 때 사용하는 방식으로 파라미터가 URL에 노출되지 않음
  • PUT: 데이터 수정 - 데이터 전체를 수정
  • PATCH: 데이터 수정 - 데이터의 일부 속성을 수정, 멱등성이 없다고 권장하지 않음
  • DELETE: 데이터 삭제

 

상태 코드: 서버가 클라이언트에게 응답을 전송할 때 응답에 대한 상태를 나타내는 코드로 3자리

  • 1XX: 요청이 수신되었으며 프로세스 진행 중
  • 2XX: 성공적으로 처리 됨
  • 3XX: 리다이렉션 중
  • 4XX: 클라이언트 오류, 404 - URL이 잘못됨
  • 5XX: 서버 오류

 

Python의 Web Framework

  • Flask: 자유도가 높음, 구현해주는 것이 거의 없음, 적은 코드로 웹 서버를 만들 수 있음, 복잡한 애플리케이션을 만들 대 구현할 내용이 많음
  • Fast API: REST API를 빠르게 만들기 위해서 등장한 프레임워크
  • Django: 자유도가 낮음, 구현해주는 것이 많음, 복잡한 애플리케이션이더라도 구현해야 할 코드가 적음, 학습을 많이해야 하고 자유도가 낮음

 

 

1. Django 개요

1) 패키지 이름: django

pip install django
  • 가상환경에서 설치하면 가상환경에서만 사용할 수 있고 가상환경이 아닌 곳에서 설치하면 가상환경에서는 사용할 수 없습니다.

 

2) 개발 방식 -MTV

  • Model: 데이터 처리 관련 부분
  • Template: 출력 관련 부분
    • 최근에는 이 영역은 거의 사용하지 않음
    • 요즈음은 서버가 아니라 클라이언트 사이드에서 랜더링함
    • 서버 애플리케이션과 클라이언트 애플리케이션 별도로 제작
    • 서버가 처리한 후 결과를 만들어서 클라이언트에게 전송하고 클라이언트가 이 데이터를 이용해서 출력 코드를 만들어 출력
  • View: 클라이언트의 요청을 처리하는 부분
  • Controller: 사용자의 요청 과 처리하는 부분(Business Logic 과 Common Concern)을 연결해주는 것


3) 가상환경을 이용해서 django 프로젝트를 만들고 실행

가상 환경 생성

python -m venv 가상환경이름

*python3이라고 쳐야할 수도!

  • 가상환경 디렉토리가 만들어지고, 그 안에 3개의 디렉토리가 만들어진다.

가상 환경 활성화

가상환경이름\Scripts\activate

가상환경에 들어온 것이다.

 

가상 환경에 django 설치

pip install django

 

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

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

django-admin startproject myproject .
  • 성공을 하면 현재 디렉토리에 프로젝트 이름으로 디렉토리가 생성되고 디렉토리 안에 몇 개의 파일이 자동으로 만들어진다.

애플리케이션 생성: django 의 실행 코드를 작성 하는 단위로 1개 이상 생성

python manage.py startapp 앱이름

python manage.py startapp myapp
  • 성공을 하면 앱이름의 디렉토리가 생성되고 몇 개의 파일이 생성됩니다.

실행

python manage.py runserver [IP주소:포트번호]

python manage.py runserver 127.0.0.1:80
  • IP주소 와 포트번호를 생략하면 127.0.0.1:8000 으로 실행
  • IP주소는 외부에서 접속하도록 하고자 하면 0.0.0.0 이나 컴퓨터의 실제 IP를 적어야 한다.

브라우저에 127.0.0.1 입력하면

아무런 요청도 작성하지 않은 페이지를 welcome-file이라고도 한다.

 

 

4) 기본 구조

프로젝트 디렉토리/settings.py

  • 프로젝트 설정에 관련된 파일
  • ALLOWED_HOSTS = []: 실제 배포할 컴퓨터의 IP를 등록하는 부분으로 '*' 으로 하면 아무데서나 배포가 가능하고 실제 IP를 작성하면 그 IP를 가진 컴퓨터에서만 배포가 가능
  • INSTALLED_APPS 부분을 실행할 애플리케이션을 등록하는 영역입니다.
    애플리케이션 생성한 경우 애플리케이션 이름을 등록해주어야 합니다.
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "myapp",
]
  • MIDDLEWARE 부분은 장고 애플리케이션이 요청을 처리하기 전에 수행하고자 하는 작업이 있을 때 작업을 기재하는 곳입니다. 필터의 역할을 수행하는 것입니다.
  • DATABASES 부분은 사용할 데이터베이스를 설정하는 부분인데 기본 코드는 python 안에 있는 sqlite3에 접속하도록 설정되어 있습니다.
  • TIME_ZONE은 시간 대역을 설정하는 부분인데 우리는 'Asia/Seoul' 로 변경해야 합니다.
TIME_ZONE = "Asia/Seoul"

 

urls.py

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

views.py

  • 실제로 요청을 처리할 함수나 클래스를 작성하는 곳

models.py

  • 사용할 데이터베이스 모델을 만드는 곳

 

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

python manage.py migrate
  • 이 명령을 맨 처음 실행시키면 유저 정보나 로그인에 관련된 테이블을 자동으로 생성합니다.
  • admin, auth, session 관련 테이블을 생성
    • authentication(인증): 로그인
      authorization(인가): 권한
    • session: 클라이언트의 정보를 서버에 저장하는 것
      대부분의 경우 session에 로그인한 유저 정보를 저장해두는 경우가 많습니다.
      세션은 브라우저 창을 닫으면 자동으로 소멸됩니다.
  • 서버가 구동중이면 Ctrl + C로 서버 중지하고 수행!

 

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

python manage.py createsuperuser
  • 수행하고 필요한 정보(username, email, password)를 입력

127.0.0.1/admin으로 접속하면

로그인 회원가입은

 

 

7) 메인 페이지 작성

myapp > views.py 파일에 작성

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse('<h1>야채입니당</h1>') #HTML
  •  index 나 request는 사용자 설정!

myproject > urls.py 파일에 작성

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

#myapp 디렉토리에 있는 views 파일의 내용을 가져오기
from myapp import views

urlpatterns = [
    path("admin/", admin.site.urls),
    path("user/", admin.site.urls),
    path("", views.index)
]
  • "" 를 입력하면 myapp/views.py 파일의 index 함수를 호출해서 처리

브라우저에 IP를 입력하면 이제

 

8) 요청이 오면 HTML 파일을 출력  (별로 안 중요)

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

 

  • 출력할 HTML 파일을 저장하기 위한 templates 디렉토리를 애플리케이션 디렉토리(myapp)에 생성

  • templates 디렉토리에 menu.html 파일을 만들고 출력 내용을 작성
  • 서버 애플리케이션에 html 파일을 만들어서 출력하는 방식을 서버 사이드 랜더링이라고 하고 최근에는 잘 사용하지 않음
<!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>
    <h4>데이터 출력</h4>
    <div>{{message}}</div>
</body>
</html>
  • urls.py 파일에 url과 views의 함수 연결하는 코드 추가서버를 구동하고 127.0.0.1/menu/ 라고 브라우저 주소 창에 입력하면 HTML 파일이 출력되어야 합니다.

 

9) 파라미터 읽기

parameter: 웹에서는 클라이언트가 서버에게 전송하는 데이터

 

https://yachae4910.tistory.com/16

 

NoSQL

1. 데이터베이스 분류 1) RDBMS 테이블 기반, SQL 이용해서 작업 트리구조라서 깊이에 따라 조회 속도가 다름 2)NoSQL Not only SQL RDBMS 시스템의 주요 특성을 보장하는 ACID(Atomicity, Consistency, Isolation, Durabi

yachae4910.tistory.com

  • 여기서 16은 게시글 번호다.

querystring

  • GET 방식 요청에서 URL 뒤에 ?를 추가하고 key=value&key=value 형태로 데이터를 전송하는 방식
  • 파라미터가 URL에 노출되고 데이터의 길이에 제한이 있어서 비밀번호 나 파일 등은 전달이 불가능
  • POST 나 PUT, DELETE 방식은 데이터를 header에 숨겨서 전송합니다.

 

 

10) URL 파라미터 읽기

path('url/<자료형:변수이름>", 요청 처리 함수)

#urls.py 파일 요청 연결 코드 추가
path('url/<자료형:변수이름>", 요청 처리 함수)

urlpatterns = [
	...
    path('article/<int:no>', views.detail),
    ...
]
  • 요청 처리 함수를 만들 때 def 함수이름(request, 변수이름) 으로 만들면 url의 변수 값이 변수에 형 변환되서 대입
#view.py 요청 처리 함수
def detail(request, no):
	return HttpResponse(str(no))

 

  • 브라우저에 127.0.0.1/article/숫자 입력하면

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

 

 

11) GET 이나 POST 방식으로 전송된 파라미터를 읽기

요청 처리 메서드의 매개변수에 GET 이나 POST 라는 딕셔너리로 데이터가 전달

  • query라는 파라미터를 GET 방식으로 전송했을 때 읽는 함수를 views.py 파일에 작성
#views.py 파일 - query라는 파라미터를 GET 방식으로 전송했을 때 읽는 함수
def search(request):
    keyword = request.GET["query"]
    return HttpResponse(keyword)
#urls.py 파일- search?query=검색어 를 처리하는 url 과 함수를 연결

urlpatterns = [
	...
    path('search', views.search),
    ...
]
  • 127.0.0.1/search?query=문자열

 

MultiValueDictKeyError at /search

query를 제대로 입력하지 않으면 생기는 오류

 

 

 

 

4. 데이터베이스 연동

Docker 나 운영체제에 관계형 데이터베이스가 실행 중 인지 확인

 

1) 관계형 데이터베이스 연동 방식

SQL을 이용하는 방식

  • 프로그래밍 언어의 코드에 SQL을 직접 입력하거나 SQL을 별도의 파일에 만들어두고 사용하는 방식
  • 이 방식은 관계형 데이터베이스가 변경되면 SQL을 수정해야 한다.

Object Relation Mapper 방식

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

 

2) 데이터베이스 연결

기본설정

# 기본적으로 로컬의 sqlite3에 접속
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "db.sqlite3",
    }
}

 

mysql

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "데이터베이스이름",,
        "USER": "접속할 계정",
        "PASSWORD": "비밀번호",
        "HOST": "데이터베이스접속위치",
        "PORT": "접속할 포트번호",
    }
}

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "myDB",
        "USER": "root",
        "PASSWORD": "password",
        "HOST": "127.0.0.1",
        "PORT": "3306",
    }
}

 

데이터베이스 관련 작업이 수정된 경우 수행할 내용

python manage.py makemigrations

python manage.py migrate

 

 

 

'Python' 카테고리의 다른 글

[Python] Numpy  (0) 2024.02.06
Day10. REST API  (0) 2024.01.26
Day8. 가상환경 만들기  (1) 2024.01.19
Day7. 웹프로그래밍 개요  (1) 2024.01.18
Day6. 객체지향 프로그래밍  (0) 2024.01.16