작업 순서 Python Flask (서버 기본 설정)

2025. 12. 27. 18:38·BackEnd

가장 먼저 해야할 일은 작업 공간을 만드는 일이다. 

 

1. 가상환경을 생성한다.

 

python -m venv venv

// 해당 명령어가 안될 경우 py나 python3 으로 변경해 작업을 해보자.

 

# 가상환경 활성화
# Windows:
venv\Scripts\activate
# Mac/Linux:
source venv/bin/activate

 

가상환경을 활성화 해서 아래의 이미지처럼 앞쪽에 가상환경 키워드가 뜨면 활성화에 성공한 것이다.

 

2. Flask 사용을 위한 기본 라이브러리 설치

또한, .env 파일을 사용하기 위해 dotenv와 jwt 인증을 위한 라이브러리도 함께 설치한다.

pip install flask flask-cors flask-sqlalchemy flask-jwt-extended pymysql pillow python-dotenv

 

3. requirements.txt 생성

(node.js 의 package.json 같은 역할을 수행)

pip freeze > requirements.txt

 

4. 기본 파일 구조 만들기

# 작업공간 폴더 안에서
mkdir routes
mkdir uploads
touch app.py
touch models.py
touch config.py
touch .env

# touch 명령어는 리눅스 명령어라 따로 사용하려면 WSL 설정을 해줘야하는데 
# 그냥 window 명령어로 만들어도 된다. 
# echo . > app.py 또는 type nul > app.py 둘중 하나를 선택해 생성하자.

 

5. MySQL 데이터베이스 준비

(유저 데이터 및 이미지 url을 저장하기 위한 공간)

-- MySQL에 접속해서 데이터베이스 생성
CREATE DATABASE image_board;

 

6. .env 파일 작성

(환경변수)

# .env 파일 내용
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=image_board
SECRET_KEY=your-secret-key-here
JWT_SECRET_KEY=your-jwt-secret-key

# 시크릿키와 jwt키 생성
# 터미널에서 Python 실행
python

# Python 쉘에서
>>> import secrets
>>> secrets.token_hex(32)
'a1b2c3d4e5f6...'  # 이런 긴 문자열이 나옴

>>> secrets.token_hex(32)
'x9y8z7w6v5u4...'  # 또 다른 키

# 두 개 생성해서 하나는 SECRET_KEY, 하나는 JWT_SECRET_KEY에 사용
# Ctrl+Z (Windows) 또는 Ctrl+D (Mac/Linux)로 종료

 

7. config.py 파일 작성

(실제 설정을 위해)

import os
from dotenv import load_dotenv

load_dotenv()

class Config:
    SECRET_KEY = os.getenv('SECRET_KEY')
    SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{os.getenv('DB_USER')}:{os.getenv('DB_PASSWORD')}@{os.getenv('DB_HOST')}/{os.getenv('DB_NAME')}"
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    JWT_SECRET_KEY = os.getenv('JWT_SECRET_KEY')
    UPLOAD_FOLDER = 'uploads'
    MAX_CONTENT_LENGTH = 16 * 1024 * 1024  # 16MB max file size

 

8.models.py 작성

(데이터베이스 모델링을 위해)

from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

db = SQLAlchemy()

class User(db.Model):
    __tablename__ = 'users'
    
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(255), nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    
    images = db.relationship('Image', backref='user', lazy=True)

class Image(db.Model):
    __tablename__ = 'images'
    
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False)
    description = db.Column(db.Text)
    image_url = db.Column(db.String(500), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

 

9. app.py 기본 구조 작성

from flask import Flask, jsonify
from flask_cors import CORS
from flask_jwt_extended import JWTManager
from config import Config
from models import db
import os

app = Flask(__name__)
app.config.from_object(Config)

# CORS 설정 (React와 통신하기 위해)
CORS(app, origins=['http://localhost:3000'])

# JWT 설정
jwt = JWTManager(app)

# JWT 에러 핸들러 추가
@jwt.unauthorized_loader
def unauthorized_callback(callback):
    return jsonify({
        'message': '로그인이 필요합니다. (토큰 없음)'
    }), 401

@jwt.invalid_token_loader
def invalid_token_callback(callback):
    return jsonify({
        'message': '유효하지 않은 토큰입니다.'
    }), 422

@jwt.expired_token_loader
def expired_token_callback(jwt_header, jwt_payload):
    return jsonify({
        'message': '토큰이 만료되었습니다.'
    }), 401

# 데이터베이스 초기화
db.init_app(app)

if not os.path.exists('uploads'):
    os.makedirs('uploads')

from routes.auth import auth_bp
from routes.images import images_bp
app.register_blueprint(auth_bp, url_prefix='/api/auth')
app.register_blueprint(images_bp, url_prefix='/api/images')

@app.route('/')
def index():
    return {'message': 'Image Board API'}

# 데이터베이스 테이블 생성
with app.app_context():
    db.create_all()

if __name__ == '__main__':
    app.run(debug=True, port=5000)

 

10 서버가 동작하는지 확인

python app.py

 

추가 gitignore 생성

# backend/.gitignore
venv/
.env
__pycache__/
*.pyc
uploads/*
!uploads/.gitkeep

 

추가 파이썬 명령어 입력해 쉘 진입시 빠져나오는 명령어

Windows: Ctrl + Z를 누른 뒤 Enter

Mac / Linux: Ctrl + D

 

 

'BackEnd' 카테고리의 다른 글

HTTP, 소켓 구분  (0) 2026.01.06
상태 코드 (StatusCode)  (0) 2025.12.29
auth.py, images.py 예시  (0) 2025.12.28
'BackEnd' 카테고리의 다른 글
  • HTTP, 소켓 구분
  • 상태 코드 (StatusCode)
  • auth.py, images.py 예시
dev_user
dev_user
csjang94-dev 님의 블로그 입니다.
  • dev_user
    devJang
    dev_user
    • Category (127)
      • Linux (2)
      • FrontEnd (11)
        • HTML (1)
        • CSS (5)
        • JavaScript (4)
        • React (1)
      • BackEnd (4)
        • node.js (7)
        • Vue.js (1)
      • DB (13)
      • Python (3)
      • GitHub (1)
      • AWS (18)
      • ErrorCode (2)
      • AWS 광주 개발일지(25.08.19~25.01... (55)
        • 교육 25년 8월 일지 (7)
        • 교육 25년 9월 일지 (22)
        • 교육 25년 10월 일지 (2)
        • 교육 25년 11월 일지 (4)
        • 교육 25년 12월 일지 (19)
      • Projects (3)
        • 미니프로젝트(25.08.29) (0)
        • Git Page -> Portfolio제작 (2.. (1)
      • 개념 정리 (1)
      • 유용한 서비스 (3)
  • 인기 글

  • 링크

    • GitHub
    • Portfolio
    • YouTube
    • 개발자 로드맵 사이트
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.4
dev_user
작업 순서 Python Flask (서버 기본 설정)
상단으로

티스토리툴바