본문 바로가기

Data Science/Python

[개인 프로젝트] flask를 활용한 포트폴리오 블로그

해당 게시글은 튜토리얼글이 아닙니다.
ㄴ 처음 진행한 미니 프로젝트로 여러 시행 차고가 있었다 보니, 나중에 이미 겪었던 사건사고 없이 안정적으로 진행하길 바라며 요약 형식으로 작성하였습니다.
ㄴ 깊게 설명을 하기보다는 어떻게 진행했고, 당시 무슨 에러가 나와서 어떻게 해결했는지 간단한 메모로 이루어져 있습니다.

 

🏆 프로젝트 목표

  • 지금까지 배워왔던 내용 정리하기(python, SQL, 웹크롤링, flask)
  • 데이터가 없더라도 혼자 데이터를 확보, 공개 할 수 있는 방법 연습하기
처음 롤모델이었던 사이트 _ https://www.kpop-radar.com/BTS

📌 flask 블로그 기능 목표

  • 포트폴리오를 위한 블로그 글 작성 기능
  • 연락처 확보를 위한 구독 기능
  • 회원을 구별하기 위한 로그인 기능 
  • 각 데이터를 MySQL에 저장

📐 데이터베이스 _ MySQL & mongodb _

  • 보안, 안정성을 위해 MySQL을 사용(변경 여지가 클 경우, 로깅을 위해 NoSQL사용이 적합
  • 객체 생성시 느려지는 현상을 막고자 pymysql 사용 (SQLAchemy는 사용하지 않음) - 

📐 MySQL - 구독으로 얻어진 이메일 저장 

📐 mongodb - 블로그 접속한 사용자의 ip 와 시간 저장


💡환경설정💡

글쓴이의 현재 컴퓨터 사양
ㄴ macOS Monterey 12.0.1
ㄴ MacBook Air (Retina, 13-inch, 2020)

🖥 MySQL설치

brew 설치 후 터미널에서 코드 입력

자세한 설명 : https://dev.mysql.com/downloads/

brew list # 깔려있는 패키지 확인
brew install mysql # 프로그램 설치(최신버전으로)
mysql.server start #시작
mysql -u root
mysql -u root 사용 후 에러 발생
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
mysql -u root -p 명령어를 통하여 해결 가능
더보기

프로젝트 중간에 macOS 업데이트가 되었고해당 화면을 보게되었다.

 그래서 새로 업데이트된 파일을 재설치하여 해결하였다. https://dev.mysql.com/downloads/mysql/

⌨️  MySQL 설정

mysql 접속 후 터미널에서 이어서 진행

mysql -u root

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost'; 
# root:아이디/localhost:자기피시로 접속 할 경우 모든 권한 확보

CREATE USER '아이디'@'localhost' IDENTIFIED BY '비밀번호';
# 아이디 생성

GRANT ALL PRIVILEGES ON *.* TO 'ID'@'localhost';
# 아이디에 권한 부여

flush privileges; 
# mysql데이터서버에 저장

CREATE DATABASE dbname;
# 연결할 데이터베이스 생성

show databases;
#데이터 베이스 리스트 확인
show tables;
 #테이블 확인

🖥 PyMySQL 설치

pip install PyMySQL

자세한 내용 : https://wikidocs.net/45328

⌨️ PyMySQL 설정

  • pymysql.connect() 메소드를 사용하여 MySQL에 연결
    • 호스트명, 포트, 로그인, 암호, 접속할 DB 등을 파라미터로 지정
    • 주요 파라미터
      • host : 접속할 mysql server 주소
      • port : 접속할 mysql server 의 포트 번호
      • user : mysql ID
      • passwd : mysql ID의 암호
      • db : 접속할 데이터베이스
      • charset='utf8' : mysql에서 select하여 데이타를 가져올 때 한글이 깨질 수 있으므로 연결 설정에 넣어줌
import pymysql # pysql 모듈 소환

connect = pymysql.connect(
    host=localhost, #DB서버 IP 주소
    port=3306,#포트번호
    user='ID_NAME',#접속 계정 ID
    passwd=' password',#접속 계정의 PW
    db='blog_db',#접속 DB
    charset='utf8'
)

cursor = connect.cursor() #연결된 서버에서 커서를 획득

#이후 연결된 커서를 통해 SQL문을 전달할수있게됨

자세한 내용 : https://www.fun-coding.org/mysql_basic6.html

 

💡SQL  테이블 생성💡

만약 에러 발생  
RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
  pip install cryptograpyh 명령어를 통하여 해결 가능

 

🍀tip: ex_SQL 테이블 생성

CREATE TABLE `student_tb` (
    `sno` int(11) NOT NULL,
    `name` char(10) DEFAULT NULL,
    `det` char(20) DEFAULT NULL,
    `addr` char(80) DEFAULT NULL,
    `tel` char(20) DEFAULT NULL,
    PRIMARY KEY (`sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

🍀tip: ex_SQL 테이블 확인

show tables;

# 필드 설정 확인
# DESC 테이블명;
DESC student_tb;

🍀tip: ex_SQL 테이블&필드 수정

# 필드 추가
# ALTER TABLE 테이블명 add 새로추가할필드명과 타입 after 필드이름;
ALTER TABLE student_tb ADD cm int AFTER name;

# 필드 삭제
# ALTER TABLE 테이블명 drop 삭제할 필드명; 
ALTER TABLE student_tb DROP cm;

# 필드 수정
# ALTER TABLE 테이블명 change 기존 필드명 새로운 필드명 타입;
ALTER TABLE student_tb CHANGE cm tall int;

# 타입 변경
# ALTER TABLE 테이블명 modify 기존 필드명 새로운 타입;
ALTER TABLE student_tb MODIFY cm int;

# 이름 변경
# ALTER TABLE 기존 테이블 이름 rename 새 테이블 이름;
ALTER TABLE student_tb RENAME class_tb;

# 테이블 삭제
drop table 삭제할 테이블명;

🖥 MongoDB 설치

brew install mongodb-community # 프로그램 설치
brew services start mongodb-community # 프로그램 서비스 시작
brew services restart mongodb-community # 재시작
mongodb 설치 명령어 사용 후 에러 발생 시 
- Warning: No available formula with the name "mongodb-community".
ㄴ 필요에 따라 xcode-select --install
brew tap mongodb/brew 명령어를 통하여 해결 가능 [자세한설명]

⌨️ MongoDB 연결

import pymongo #mongodb 라이브러리 소환

#주로 사용된 기본 형식
username = ''
password = ''
ip_address = 'localhost'
connection = pymongo.MongoClient('mongodb://%s:%s@%s' % (username, password, ip_address))

자세한 설명 : https://www.fun-coding.org/mongodb_basic5.html

🖥 pymongo 설치

pip install pymongo

📌 VScode를 통해 py파일 생성 및 구조화📌

📌 flask를 선택한 이유

빠르게 원하는 기능을 기반으로 웹서비스 구축 가능, 이후 필요한 기능만 확장 가능 

🖥 flask 설치

pip install flask

#추후 소환 시
from flask import Flask

🖥 flask 기본 문법

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, My First Flask!'

자세한 설명 : https://wikidocs.net/81238

 

 

💡로그인, 로그아웃 기능 구현💡

flask 에서 로그인 기능을 도와주는 라이브러리 flask_login에 대한 자세한 설명 : https://flask-login.readthedocs.io/en/latest/

🖥 flask_login 설치

pip install flask-login

⌨️ flask와 flask_login 연결

자세한 설명 :
https://flask-login.readthedocs.io/en/latest/
https://velog.io/@rudnf003/Flask-Login-이용하여-로그인-기능-구현하기
https://m.blog.naver.com/jcyber/221753699231
from flask import Flask
from flask_login import LoginManager

app = Flask(__name__)  # flask 객체 생성

login_manager = LoginManager()
login_manager.init_app(app)  # app 에 login_manager 연결

⌨️  사용자 클래스에 필요한 속성들

- is_authenticated : 인증된 경우 True, 그렇지 않은 경우 False

 - is_active:  계정이 활성화된 경우 True, 그렇지 않은 경우 False

 - is_anonymous : 익명 사용자는 True, 그렇지 않은 경우 False

 - get_id() : 사용자의 고유 식별 문자를 보여주는 메소드

 

🍀tip: app.secret_key 

app.secret_key = os.urandom(24)
- secret_key는 서버상에 동작하는 어플리케이션 구분하기 위해 사용하고 복잡하게 만들것을 권장
- login_manager의 Session Protection옵션을 설정하여 보안을 더 올리는 방법도있음 
login_manager.session_protection = "strong"
#or
login_manager.session_protection = None​

자세한 설명 : https://github.com/maxcountryman/flask-login

 

🖥 기본 폼 탬플릿 : Bootstrap

자세한 설명 : https://eunyoe.tistory.com/61

 

 

 

이 이후 부분은 시간부족으로 진행하지 못했으며,  추후 개인프로젝트로 이어서 진행할 예정이다.

ㅠㅠㅠㅠ