수업 21일차

galoo·2023년 7월 25일
0

HelloVision Dx Data School

목록 보기
21/72
post-thumbnail

✔ Django

가상 환경

  • 프로그램을 독립적으로 실행할 수 있는 환경
  • C와 Python은 컴퓨터에 C나 Python이 설치되어 있지 않아도 실행이 가능
    - 소스 코드와 라이브러리를 합쳐서 별도의 실행 프로그램을 생성하기 때문
  • Java는 JDK(자바가 제공하는 API)의 라이브러리는 포함시키지 않고 실행 프로그램을 생성하기 때문에, Java 프로그램을 실행하기 위해서는 반드시 JDK가 제공하는 라이브러리가 컴퓨터에 존재해야하는데, 이것을 **JRE(Java Runtime Environment)라고 합니다.

명령어로 가상 환경 생성

python3 -m venv 가상환경이름

Django 설치 및 프로젝트 생성과 실행

Django 설치 : pip install django

  • 가상 환경을 사용하지 않으면 한 번만 설치하면 됩니다.

django 프로젝트 생성

  • django를 사용할 수 있도록 디렉토리를 생성합니다.
  • django-admin startproject 프로젝트이름 생성될경로
  • django-admin startproject myweb .
    - .은 현위치
  • 이 때, 프로젝트 이름으로 된 디렉토리와 manage.py가 생성
  • manage.py 는 실행 파일
    - main함수를 소유
    - python의 기본 entry point(시작점)은 main인데, 이름을 변경할 수 있음
    - 실행 파일의 기본 이름은 main.py

django application 생성

  • python manage.py startapp 애플리케이션이름

application 실행

  • python manage.py runserver 외부에서접속할IP:포트번호
    - 외부에서접속할IP:포트번호 을 생략하면 현재 컴퓨터에서만 접속 가능

프로젝트에서 생성해주는 파일

  • 프로젝트의 setting.py파일
  • 외부 접속 가능한 IP 설정
    - 로컬에서만 접속이 기본 설정
  • 시간 대역 설정
    - 기본 시간 대역이 UTC라 배포할거면 시간 대역 수정 권장
  • 접속할 수 있는 DB 설정
    - 기본 : sqlite3 설정
  • 애플리케이션 등록
    - 애플리케이션을 생성하면 반드시 settings.py 파일에 등록해야 사용가능

시간 대역과 애플리케이션 등록

  • 프로젝트의 settings.py 파일에서 TIMEZONE을 수정
    -

프로젝트의 urls.py

  • 클라이언트의 요청 URL을 처리할 함수나 메서드를 등록
  • 여기서 등록된 요청만 서버는 처리할 수 있습니다.

Application의 Models.py

  • 관계형 DB와 연동할 모델을 등록
  • 이 부분을 수정하면 2개의 명령어를 수행해야 합니다.
    - python manage.py make migrations
    - python manage.py migrate (테이블 생성)
  • migration이 수행되지 않았다면, migrations 디렉토리의 __init__.py 파일을 삭제하고 다시 수행하면 됩니다.

Application의 views.py

  • 클라이언트의 요청을 처리할 로직을 작성하거나 호출하는 파일
  • 함수로 만들 수도 있고 클래스로 만들 수 도 있습니다.
  • 대부분의 django sample code에서는 여기에 직접 로직을 작성하지만,
    실무에서는 별도의 파일을 생성해서 로직을 작성하고, views.py에서는 그 로직을 호출만합니다.
  • django의 view는 다른 프레임워크의 Controller의 역할을 수행하는데, Controller는 클라이언트의 요청을 받아서 필요한 로직을 호출하고 그 결과를 화면에 출력하도록 전달하거나 데이터를 클라이언트에게 전송하는 역할을 수행합니다.
  • 대다수의 django 샘플 코드가 실무와 다르게 간단한 작업만 수행하기 때문에 로직을 바로 작성한 것입니다.

관리자 기능 활성화

인증 : 로그인
인가 : 권한

  • 관리자 테이블 생성
    - python manage.py migrate
  • 관리자 생성
    - python manage.py createsuperuser
    - 하고 /admin 가서 해보자.

요청을 받아서 처리

  • 클라이언트에게 결과를 전송하는 방식
  • html 만들어서 전송
    - 단순하게 html을 전송
    - 서버에서 생성한 데이터와 함께 html을만들어서 전송(Template Engine 이용)

  • 데이터만 전송 : 최근에는 이 방식을 선호
  • 클라이언트의 요청이 왔을 때 html 코드를 만들어서 전송
  • url을 등록 (urls.py)
from django.contrib import admin
from django.urls import path
#애플리케이션의 views 파일의 내용을 사용할 수 있도록 등록
from 애플리케이션이름 import views
urlpatterns = [
    path("admin/", admin.site.urls),
    #localhost:8000 을 web0726의 views.py 파일의 
    # index 함수가 처리
    path("", views.index)
]
  • urls.py에 등록된 함수를 생성 (views.py)
from django.shortcuts import render
from django.http import HttpResponse
#요청을 처리하는 함수의 매개변수는 request
#request 객체 안에는 클라이언트에 대한 정보가 저장되어 있음
def index(request):
    return HttpResponse("<p>Hi Django</p>")
  • HTML 파일을 만들어서 출력
  • url을 처리할 함수를 설정 (urls.py)
from django.contrib import admin
from django.urls import path
#애플리케이션의 views 파일의 내용을 사용할 수 있도록 등록
from web0726 import views
urlpatterns = [
    path("admin/", admin.site.urls),
    #localhost:8000 을 web0726의 views.py 파일의
    # index 함수가 처리
    path("", views.index),
    #localhost:8000/display 요청이 오면
    #views 파일의 display 함수가 처리
    path("display", views.display)
]
  • 요청을 처리할 함수를 생성 (views.py)
#요청이 오면 templates 디렉토리의 display.html을 출력
def display(request):
    return render(request, "display.html")
=>애플리케이션의 templates 디렉토리에 html 파일을 생성
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTML 출력</title>
</head>
<body>
    <h2>HTML을 출력합니다.</h2>
</body>
</html>
  • 템플릿 엔진을 이용해서 서버가 만든 데이터를 HTML에 출력
  • urls.py에 가서 요청을 생성
    path("template",views.template) # 앞뒤 맞추는게 기억하기 편함
  • views.py에 가서 template 함수를 작성
def template(request):
    msg = "Hello Template"
    #HTML에 데이터를 전송하고자 하면
    #세번째 매개변수에 디셔너리를 만들어서 
    #데이터 이름 과 데이터를 기재
    return render(request, "template.html", {"msg":msg})
  • templates 디렉토리에 template.html 파일을 생성하고 작성
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <h3>데이터:{{msg}}</h3>
</body>
</html>

서버가 전달해준 데이터를 출력하고자 한다면, {{ }} 안에 키를 설정하자

  • template engine에서 if와 for 사용
{% if 조건 %} 
	이 사이에 elif, else 사용 가능함 동일한 {% %} 형태
{% endif %}

{% for 임시변수 in 데이터모임 %}
	내부 작성
{% endfor %}

둘 다 end를 잊지 말자.


추가로

{{날짜|date:포맷}} : 날짜를 포맷에 맞추어 출력 가능
{{문자열|문자열 메서드}} 가능합니다.
  • views.py 예시
from django.shortcuts import render
def template(request):
    msg="Hello Django Tmeplate"
    person={"name":"mino", "age":26}
    data=["mino","mino2","mino3","mino4","mino5","mino6","mino7"]
    #html에 데이터를 전송하고자 한다면
    # 세 번째 변수에 딕셔너리를 만들어서
    # 데이터 이름과 데이터를 기재
    return render(request, 'template.html', 
    {"msg":msg, "person":person, "data":data})
  • html 예시(body만)
<body>
    <h1>안녕하세요?</h1>
    <h3>제가 약간의 메시지를 적었는데 보실래요?</h3>
    <br><br>
    <h4>Data: {{ msg|upper }} msg에 upper 함수를 써봤는데 잘 적용이 되었을까요?</h4>
    <h4>저는 {{ person.name }} 이고, 나이는 {{ person.age }}살 입니다.</h4>
    <h4>data라는 변수에 여러 데이터가 들어있는데, 확인하실래요?</h4>
    <h4>
        {% if  person.age >= 20 %}
            {{ person.name }}은 성인이구나
        {%  else %}
                {{ person.name }}은 미성년자구나
        {% endif %}
    </h4>
    <h3>
        {%  for temp in data %}
            <li>{{ temp }}</li>
        {% endfor %}
    </h3>
</body>

잘 나옴을 알 수 있다.

Django의 Model(이건 못하면 큰일난다.)

Model

  • Data Service를 제공하는 Layer
  • Django에서는 Model을 Application 내의 models.py 파일에 작성
  • Model 클래스는 관계형 DB의 Table과 1:1로 mapping이 됩니다.
  • Model 클래스 안에 만든 속성은 Table의 컬럼과 1:1 mapping 됩니다.
  • primary key를 설정하지 않으면, Table 생성할 때 자동으로 id 컬럼 생성
  • 속성을 만들 때는 클래스 변수로 만들어야 하고, 각 속성에 맞는 Field Class 객체(DB 자료형)를 생성해서 할당한다.
    - Field Class 객체 생성을 하고 할당할 때, 옵션 설정을 한다.
    이때, 필수 옵션이 있는 경우도 있습니다.
    - ex) 문자열은 최대 길이를 지정해야 합니다.

Model의 필드 타입

  • CharField
    - 문자열 저장에 사용, max_length 속성을 이용해서 최대 길이를 설정
    - 파생 클래스(상속을 받은, 하위 클래스)로 EmailField, GenericIPAddressField, CommaSeparatedIntegerField, FilePathField, URLField 등이 존재함(형식이 맞는지 확인)
  • TextField
    - 대용량 문자열
  • IntegerField
    - 정수
  • BooleanField
  • DateTimeField
  • DecimalField
    - 소수
  • BinaryField
  • UUIDField
    - UUID(식별하기 위한 코드)는 숫자와 문자가 섞여있다.
    - 64자리나 128자리

Field 옵션

  • null
    - null 허용 여부
  • blank
    - 필수 여부(False 설정 시 필수가 됨)
  • primary_key
  • unique
  • default
  • db_column으로 컬럼 이름을 속성이름과 다르게 하고자 할 때 사용

DB 설정

  • settings.py 파일의 DATABASES 항목에 설정
  • htpps://docs.djangoproject.com/en/4.2/ref/databases/

MySQL 사용

  • mysqlclient 설치
    - pip install mysqlclient
  • 접속 정보 수정
    - ENGINE : django.db.backends.mysql
    - NAME : 데이터베이스 이름
    - USER : 계정
    - PASSWORD : 비밀번호
    - HOST : 접속위치
    - PORT : 포트번호
    • 이거 도커 mysql 이미지&컨테이너 할때 한거 쓴다.
    • 아 물론 쓸때, "" 안에 넣어줘야 하는거 잊지 말자.
  • 도커 mysql 실행해두기

Models.py

class Item(models.Model):
    itemID=models.CharField(max_length=50, primary_key=True)
    itemName=models.CharField(max_length=50)
    price=models.IntegerField()
    description=models.CharField(max_length=100)
    pirctureURL=models.CharField(max_length=200)
  • 모델을 만들고 db에 반영
    - makemigration & migrate
  • 이를 수행하게 된다면, 관리자를 위한 테이블과 models.py에서 만든 클래스의 테이블을 생성하는데, 해당 테이블 이름은 애플리케이션_모델이름 형태이다.

  • 신기하넹

Django 프로젝트에서 MySQL CRUD

데이터베이스 접속해서 사용할 DB 확인

데이터 조회

  • 조회 방법
    - 모델클래스이름.objects().조회메서드

조회 메서드

  • all()
    - 테이블의 모든 데이터를 조회
  • get(기본키=값)
    - 데이터 1개만 조회
  • filter(필드이름 연산자 값)
    - 조건에 맞는 데이터만 조회
  • exclude(필드이름 연산자 값)
    - 조건에 맞지 않는 데이터만 조회
  • count()
    - 데이터 개수
  • order_by()
    - 정렬할 필드 이름을 나열하는데, 필드 이름 앞에 -를 붙이면 내림차순
  • distinct(필드이름)
    - 필드 중복 제거
  • fist(), last()
    - 첫 번째, 마지막 데이터 조회

데이터 조회를 위해 데이터 삽입

insert into myweb_item values('1','레몬',500,'비타민 A', 'lemon.jpg');
insert into myweb_item values('2','오렌지',600,'비타민 B', 'orange.jpg');
insert into myweb_item values('3','포도',700,'비타민 C', 'grape.jpg');

urls.py 파일에 전체 데이터 가져오기 요청을 처리할 코드를 넣어보자.

from myweb import views
urlpatterns = [
    # admin/요청이 오면 admin.site.urls 함수가 처리하겠다고 남김
    path("admin/", admin.site.urls),
    path("checkDB",views.checkDB) #얼른 views에다가 checkDB를 만들어주자.
]

이건 views.py이다.

from myweb.models import Item
def checkDB(request):
    data=Item.objects.all()
    print(data)

이렇게만 하면 오류날거야

하지만 보이죠?

웹페이지에서 오류가 안나게 만들려면?

def checkDB(request):
    dbData=Item.objects.all()
    print(dbData)
    return render(request, 'checkDB.html', {"dbData":dbData})

보여줘야 한다.

파라미터 전송 및 읽기

웹 클라이언트가 웹 서버에게 요청을 하는 방법

  • a 태그의 href 속성에 url 작성 후 클릭
    - a 태그는 입력 x
  • form을 만들고 sbumit을 수행하는 경우
    - form은 입력을 합니다.
  • ajax 이용
    - 비동기적 요청
    - 다른 작업을 수행하면서 요청을 처리해달라고 하는 것(다른 동작이 멈춤x)
  • web socket 이용
    - 계속 연결해두고 주고 받는 방식
  • 브라우저에 url을 직접 입력 : 메인 페이지를 접속할 때 제외하곤 사용x
  • http나 https 요청 처리

client가 서버와 연결 가능한지 확인하고 서버에 요청을 전송
\rarr
서버는 요청을 처리한 뒤에 응답을 전송합니다.
\rarr
응답이 해제됩니다.

parameter

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

전송방식

  • GET
    - URL에 파라미터를 붙여서 전송하는 방식
    - 자동 재전송이 된다는 장점
    - 데이터 크기에 제약이 있고 보안이 취약
    - 일반적으로 데이터 크기가 작고 보안이 중요하지 않은 요청에 사용
    - "조회"
    - 데이터에 숫자나 영문이 아닌 것이 있다면 Encoding 후 전송해야 함
  • POST
    - 파라미터를 헤더나 바디에 숨겨서 전송하는 방식
    - 숨겨서 전송하기에 보안이 GET보다 우수하며, 데이터 크기 제한이 없다.
    - 서버에서 Enconding 처리를 하기에, Encoding해서 전송할 필요 없다.
    - 일반적으로 삽입, 삭제, 갱신작업에 사용을 합니다.
    - 노출되면 안되는 정보 조회를 하는 경우에는 POST를 사용합니다.
    - 최근에는 삽입, 삭제, 갱신 작업을 구분하기 위해 삽입은 POST, 수정은 PUT, 삭제는 DELETE 방식으로 요청
    - 왜냐면 POST 하나로 여러 작업을 하기에 "어떤 작업을 하는지 명확하지 않기 때문"

Parameter 작성

  • GET 방식의 파라미터 작성

  • URL뒤에 파라미터를 이름과 함께 작성(파라미터2개 이상일 때 주로이용)
    - 요청경로?이름=값&이름=값...
    - https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=102 이러면 mode, mid, sid1 파라미터가 같이 전송됩니다.

  • URL에 파라미터를 포함시키는 경우 - 파라미터가 1개일때
    - ~~.com/469
    - 이 경우는 469가 파라미터입니다.
    - url에 포함시켜 전송합니다.
    - 상세보기를 구현할 때 많이 이용합니다.

  • form을 만들어 데이터를 전송하는 경우는 첫 번째 방법으로 전송됩니다.
  • POST 방식의 파라미터 작성
    - formdata로 전송하는 방식
    - json 형식으로 전송하는 방식

django 서버에서 파라미터 읽기

  • 전송된 방식에 따라 읽는 방법이 달라집니다.
  • url에 포함시켜서 파라미터를 전송하는 경우
    - urls.py에서 요청 처리 부분을 설정할 때
    path('요청경로/<파라미터자료형:파라미터이름>',처리할함수나 클래스)
    - views.py에서 요청을 처리할 때
    def 함수이름(request, 파라미터이름):
    	파라미터이름에 데이터가 저장됨
    <a href='detail/{{item.itemID}}'>{{item.itemName}}</a>
    path('detail/<str:itemID>',views.detail)
    def detail(request,itemID):
    	~~~
    이렇게 처리됩니다.
profile
밀가루 귀여워요

0개의 댓글