Django

Django - ExcelCalCulator_2

개요

  • Django 한 그릇 뚝딱 교재의 내용에서 멀티캠퍼스 강의에 맞게 일부 수정함
  • 2019년 버전이고 현재는 2023년이기 때문에 소스코드 변경 사항이 필요할 거 같아서 글을 남김

교재 홍보

Untitled

Step 01 - 이전 글

Step 02 - 이메일 인증으로 회원 가입

  • 절차는 다음과 같다.
    • 회원 가입 화면에서 개인정보 입력 후 회원 가입하기 버튼 클릭 때 해당 정보로 유저 데이터 생성 및 DB에 저장, 이 때 인증되지 않은 유저로 등록
    • DB에 저장 후, 입력한 이메일로 인증 코드 발송
    • 발송된 인증 코드는 유저 이름과 함께 쿠키로 저장 후 인증 코드 입력 화면으로 전환
    • 인증 코드 입력 화면에서 인증 코드 입력 후 인증하기 버튼 클릭 때 입력된 코드와 쿠키에 저장된 인증 코드 비교 후 회원 성공/실패 처리
    • 성공 때는 회원의 인증 값을 true 로 설정, 실패 때 해당 회원정보 삭제

Step 03 - DB 설정

  • 사용자 정보를 저장할 수 있는 모델을 만들어야 한다.
  • 회원 가입 시 필요한 기본 정보 : 이름, 이메일, 비밀번호, 그리고 사용자의 인증여부를 체크해 주는 정보를 가지게 된다.
    • 파일 경로 : ExcelCalculate > main > models.py
from django.db import models

# Create your models here.
class User(models.Model):
    user_name = models.CharField(max_length = 20)
    user_email = models.EmailField(unique=True)
    user_password = models.CharField(max_length=100)
    user_validate = models.BooleanField(default=False)
  • User 모델을 정의했다면, 이를 반영하기 위해서 아래 명령어들을 통해 migrations 파일을 만들고 migrate 한다.
$ python manage.py makemigrations
Migrations for 'main':
  main\migrations\0001_initial.py
    - Create model User
$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, main, sessions
Running migrations:
  Applying main.0001_initial... OK

Step 04 - 회원가입 url 설정

  • 회원 가입 때 사용자 데이터를 저장하기 위해, 먼저 signup.html 에서 회원 가입 버튼 클릭 때 이동할 url 설정을 하도록 한다.

Django - ExcelCalCulator_1

개요

  • Django 한 그릇 뚝딱 교재의 내용에서 멀티캠퍼스 강의에 맞게 일부 수정함
  • 2019년 버전이고 현재는 2023년이기 때문에 소스코드 변경 사항이 필요할 거 같아서 글을 남김

교재 홍보

Untitled

Step 01 - Github Repo 생성

  • 아래와 같이 Github Repo를 생성한다.

Untitled

Step 02 - 가상환경 생성 및 라이브러리 설치

  • virtualenv 명령어를 활용하여 가상환경을 설치한다.
  • 실행 경로 : ExcelCalculate-with-Django
$ virtualenv venv
created virtual environment CPython3.9.13.final.0-64 in 2305ms
  creator CPython3Windows(dest=C:\Users\j2hoo\OneDrive\Desktop\ExcelCalculate-with-Django\venv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\j2hoo\AppData\Local\pypa\virtualenv)
    added seed packages: pip==23.1.2, setuptools==68.0.0, wheel==0.40.0
  activators BashActivator,BatchActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
  • 가상환경 접속 방법은 Windows와 Mac/Linux 계열이 다르다.

Django Gmail 발송 예제 (2023년 버전)

개요

  • 최근 django 강의를 진행하면서, Gmail로 이메일을 발송 하는 예제에서 인증 코드 진행하는 부분이 오래된 것을 확인
  • 업그레이드 된 버전을 소개한다.

가상환경 및 django 라이브러리 설치

  • 먼저 빈 폴더를 생성 후, 가상환경�� 생성한다.
  • (옵션) virtualenv 라이브러리 미 설치 시
$ pip install virtualenv
  • 기 설치가 되어 있다면 아래 코드를 순차적으로 실행한다.
$ virtualenv venv
$ source venv/Scripts/activate
  • 가상환경에 접속해 있다면 django를 설치 한다.
$ pip install django

장고 프로젝트 및 앱 설치

  • 이제 장고 프로젝트를 설정한다.
$ django-admin startproject djangogmail
  • 이제 해당 프로젝트 폴더에서 1개의 app을 만들어준다.
$ cd djangogmail/
$ python manage.py startapp main
  • 앱을 등록해준다.
    • 파일 경로 : djangogmail > djangogmail > settings.py
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "main"
]
  • runserver를 실행하여 장고 기본 화면이 나오는지 확인한다.
$ python manage.py runserver

Untitled

Django Project ToDoList - 5

개요

  • Django 한 그릇 뚝딱 교재의 내용에서 멀티캠퍼스 강의에 맞게 일부 수정함
  • 2019년 버전이고 현재는 2023년이기 때문에 소스코드 변경 사항이 필요할 거 같아서 글을 남김

교재 홍보

Untitled

Step 01 - 이전 내용 확인

Step 02 - 데이터 삭제 방법 개요 및 HTML 수정

  • 완료 버튼을 눌렀을 시, 데이터를 삭제하는 기능을 구현한다.
  • HTML 코드를 살펴보면 완료 버튼이 존재한다.
    • 완료 버튼을 클릭할 때, form 태그 내에 ���는 input 태그의 값이 함께 넘어오고, inputvalue 값을 이용해 DB에서 알맞은 데이터를 찾아 삭제한다.
          <div class="toDoDiv">
                <ul class="list-group">
                    {% for todo in todos %}
                    <form action="" method="GET">
                        <div class="input-group" name='todo1'>
                            <li class="list-group-item">{{ todo.content }}</li>
                            <input type="hidden" id="todoNum" name="todoNum" value="{{ todo.id }}"></input>
                            <span class="input-group-addon">
                                <button type="submit" class="custom-btn btn btn-danger">완료</button>
                            </span>
                        </div>
                    </form>
                    {% endfor %}
                </ul>
            </div>
  • form 태그의 action은 아직 정의되지 않았는데, 완료 버튼을 클릭 시, form 태그의 action값을 설정하도록 한다.

Django Project ToDoList - 4

개요

  • Django 한 그릇 뚝딱 교재의 내용에서 멀티캠퍼스 강의에 맞게 일부 수정함
  • 2019년 버전이고 현재는 2023년이기 때문에 소스코드 변경 사항이 필요할 거 같아서 글을 남김

교재 홍보

Untitled

Step 01 - 이전 내용 확인

Step 02 - 남은 과제

  • 사용자가 입력한 문자열을 데이터베이스에 저장하기
  • DB에 저장된 내용을 보여 주기

Step 03 - 모델에 데이터 저장

  • 먼저, my_to_do_app 폴더에 있는 [views.py](http://views.py) 파일에서 model을 사용하려면 [models.py](http://models.py) 파일을 불러와야 한다.

Django Project ToDoList - 3

개요

  • Django 한 그릇 뚝딱 교재의 내용에서 멀티캠퍼스 강의에 맞게 일부 수정함
  • 2019년 버전이고 현재는 2023년이기 때문에 소스코드 변경 사항이 필요할 거 같아서 글을 남김

교재 홍보

Untitled

Step 01 - 이전 내용 확인

Step 02 - model.py 작성 및 장고 서버 반영

  • ToDo에 대한 데이터를 다룰 예정이며, 다음과 같이 코드를 작성한다.
    • 파일 경로 : ToDoList > my_to_do_app > models.py
from django.db import models

# Create your models here.
class Todo(models.Model):
    content = models.CharField(max_length=255)
  • 위 코드를 실제 Django 서버에 등록해줘야 한다. 다음과 같은 명령어를 입력한다.
    • 실행 경로는 [manage.py](http://manage.py) 이 있는 곳에서 아래 코드를 실행한다.
$ ls
db.sqlite3  manage.py*  my_to_do_app/  ToDoList/

$ python manage.py makemigrations
Migrations for 'my_to_do_app':
  my_to_do_app\migrations\0001_initial.py
    - Create model Todo
  • 그런데, 아직 데이터베이스 모델과 같은 테이블이 생성된 것은 아니다. 다음 명령어를 추가한다.
$ python manage.py migrate
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying my_to_do_app.0001_initial... OK
  Applying sessions.0001_initial... OK

Step 03 - DB 확인

  • 실제 Django 프로젝트 DB에 접근해서 확인하도록 한다.
$ python manage.py dbshell
SQLite version 3.39.3 2022-09-05 11:02:23
Enter ".help" for usage hints.
sqlite>
  • 테이블을 확인하기 위해서 다음 명령어를 이용한다.
    • my_to_do_app_todo 테이블이 만들어졌음을 확인한다.
sqlite> .tables
auth_group                  django_admin_log
auth_group_permissions      django_content_type       
auth_permission             django_migrations
auth_user                   django_session
auth_user_groups            my_to_do_app_todo
auth_user_user_permissions
  • 테이블이 가진 정보를 확인한다.
sqlite> PRAGMA table_info(my_to_do_app_todo);
0|id|INTEGER|1||1
1|content|varchar(255)|1||0
  • SELECT 명령어를 통해 데이터가 있는지 확인해본다.
    • 아무런 데이터가 없기 때문에 조회는 되지 않는다.
sqlite> SELECT * FROM my_to_do_app_todo;

Step 04 - HTML 코드 해석

  • index.html 파일을 연다.
  • 44번째 줄의 form 태그를 살펴본다.

Untitled

Django Project ToDoList - 2

개요

  • Django 한 그릇 뚝딱 교재의 내용에서 멀티캠퍼스 강의에 맞게 일부 수정함
  • 2019년 버전이고 현재는 2023년이기 때문에 소스코드 변경 사항이 필요할 거 같아서 글을 남김

교재 홍보

Untitled

Step 01 - 이전 내용 확인

Step 02 - HTML 템플릿 사용

  • HTML과 CSS가 적용된 기본 템플릿은 다음 github 저장소에서 다운로드 받을 수 있다.

  • my_to_do_app 폴더에 가면 templates 폴더는 처음에는 존재하지 않는다. 따라서, 새로운 폴더를 생성하여 폴더명을 templates라고 명명한다.

Django Project ToDoList - 1

개요

  • Django 한 그릇 뚝딱 교재의 내용에서 멀티캠퍼스 강의에 맞게 일부 수정함
  • 2019년 버전이고 현재는 2023년이기 때문에 소스코드 변경 사항이 필요할 거 같아서 글을 남김

교재 홍보

Untitled

Step 01 - 깃허브 Repo 생성

  • 아래와 같이 깃허브에서 Repo를 생성한다.
  • Repo명 : ToDoList-with-Django

Untitled

Step 02 - 바탕화면으로 Git Clone

  • 이 때 중요한 것은 본인 경로에 한글이 없도록 하는 것이 중요하다.
  • 간혹 한글이 있는 경우 인코딩 문제로 라이브러리 설치 등 되지 않을 수가 있다.
  • 복사할 때는 $ 는 제외한다.
$ git clone https://github.com/your_account_id/ToDoList-with-Django.git

Untitled

django Web 개발 - IRIS Prediction

개요

  • Python Django와 Sklearn을 활용하여 간단한 iris prediction 웹을 만들어본다.

사전준비

  • 머신러닝 기본 이론 및 원리는 어느정도 알고 있다고 가정한다.
  • Django 앱에 대해 어느정도 알고 있다고 가정한다.

무엇을 배우는가?

  • 머신러닝 모델을 활용하여 배포하는 과정을 배운다.

가상환경 설정

  • 가상환경을 생성한다.
$ virtualenv venv
created virtual environment CPython3.9.1.final.0-64 in 475ms
  creator CPython3Posix(dest=/Users/evan/Desktop/django-iris-tutorial/venv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/evan/Library/Application Support/virtualenv)
    added seed packages: pip==22.1.1, setuptools==62.3.2, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
  • 만들어진 가상환경에 접속한다.
$ source venv/bin/activate
(venv) $
  • 크게 3개의 라이브러리를 설치한다.
    • jupyterlab : 머신러닝 개발 과정을 진행할 에디터로 활용한다.
    • sklearn : 머신러닝 개발 관련 라이브러리이다.
    • django : django 웹 프레임워크 라이브러리이다.
(venv) $ pip install jupyterlab sklearn django

머신러닝 개발

  • iris 데이터를 불러오고 sklearn을 활용하여 모형 개발을 진행한다.
  • 모형 개발 시, 주요 Feature Engineering 과정은 생략한다.

(1) 모형 개발

  • jupyterlab을 실행한다.
(venv) $ python -m jupyterlab
  • 아래와 같이 코드를 입력한다.
# Module 불러오기
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
import pandas as pd

# 데이터셋 불러오기
df = pd.read_csv("data/iris.csv")

# 독립변수와 종속변수 분리
X = df[['sepal_length','sepal_width','petal_length','petal_width']]
y = df['classification']

# 훈련데이터와 종속데이터 분리
X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.20, random_state=1)

# 모형 학습
model = SVC(gamma='auto')
model.fit(X_train, Y_train)

# 모형 예측
sepal_length = float(1.5)
sepal_width = float(5)
petal_length = float(4)
petal_width = float(3)

result = model.predict([[sepal_length,sepal_width,petal_length,petal_width]])  # input must be 2D array
print(result)
['Iris-virginica']
/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/sklearn/base.py:445: UserWarning: X does not have valid feature names, but SVC was fitted with feature names
  warnings.warn(

(2) 모형 저장

  • pickle을 통해 모형 저장을 할 수 있다.
pd.to_pickle(model, r'models/svc_model.pickle')

Django 시작

  • django 웹사이트 프로젝트를 시작한다.
(venv) $ django-admin startproject iris
(venv) $ cd iris
(venv) $ python manage.py startapp predict

settings.py

  • iris/settings.py를 열고 아래와 같이 수정한다.
.
.
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'predict', 
]
.
.

urls.py

  • iris/urls.py를 열고 아래와 같이 수정한다.
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('predict.urls', namespace='predict'))
]
  • predict/urls.py를 새로 생성하고 아래와 같이 코드를 추가한다.
from django.urls import path
from . import views

app_name = 'predict'

urlpatterns = [
    path('', views.predict, name='predict'),
]

views.py

  • 이제 predict/views.py에서 predict 함수를 만들어 백엔드 처리를 진행하고, 최종 결괏값을 predict.html로 돌려주는 함수를 구현할 것이다.
from django.shortcuts import render

# Create your views here.
def predict(request):
    return render(request, 'predict.html', {})

predict.html

  • predict/templates 폴더를 만들고, predict.html 파일을 새로 생성한다.
hello
  • predict.html 파일이 잘 열리는지 확인한다.
(venv) iris$ python manage.py runserver 

Django with Elastic Beanstalk - Settings

한줄 요약

  • 생각보다 쉽지 않기 때문에 Windows로 하기 보다는 WSL2로 하는 것을 권한다.
    • 이 부분은 추후 업데이트 할 예정이다.

Windows에 EB CLI 설치

C:\WINDOWS\system32>python --version
Python 3.7.4

C:\WINDOWS\system32>pip --version
pip 19.0.3 from c:\users\human\appdata\local\programs\python\python37-32\lib\site-packages\pip (python 3.7)
  • pip을 이용하여 EB CLI를 설치한다.
C:\Windows\System32> pip install awsebcli --upgrade --user
  • 환경변수를 설정한다.
    • Python 3.7 버전으로 설치 했다면, 아래 코드를 환경변수에 추가한다.
%USERPROFILE%\AppData\roaming\Python\Python37\scripts