전송 방식
- 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 입력하면
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에 로그인한 유저 정보를 저장해두는 경우가 많습니다.
세션은 브라우저 창을 닫으면 자동으로 소멸됩니다.
- authentication(인증): 로그인
- 서버가 구동중이면 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
- 여기서 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 |