웹개발 플러스 1주차 숙제

Talysa Lee·2021년 9월 5일
0

스파르타코딩클럽

목록 보기
6/12

웹개발 플러스 1주차 수업은 왕초보 시작반의 복습과 약간의 추가 정보로 구성돼 있었다. 파일과 날짜 처리 방법이 새로운 요소.

숙제는 나홀로일기장에 일기를 쓴 시간을 출력하는 거였는데,
힌트는 날짜를 DB에 따로 저장하는 거였지만...
일기의 이미지 파일 저장 시, 저장 시간으로 파일 이름을 구성하므로 DB에 괜히 따로 파일을 저장하지 않아도 연-월-일의 필요한 시간 정보를 구할 수 있다고 판단했다. 그래서 파일 이름에서 시간 정보를 꺼내와 띄워주도록 함.

그리고 AWS에 배포해보기까지 한 뒤, 인스턴스 꺼 버림. 습관적으로 꺼버릇 해야 사고 안 치지...

app.py
from flask import Flask, render_template, jsonify, request
from datetime import datetime
app = Flask(__name__)

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
# 아래는 AWS에 올려서 테스트할 때 사용
# client = MongoClient('mongodb://test:test@localhost', 27017)
db = client.dbsparta_plus_week1

@app.route('/')
def home():
    return render_template('index.html')

@app.route('/diary', methods=['GET'])
def show_diary():
    diaries = list(db.diary.find({}, {'_id': False}))
    return jsonify({'all_diary': diaries})

@app.route('/diary', methods=['POST'])
def save_diary():
    title_receive = request.form['title_give']
    content_receive = request.form['content_give']
    file_receive = request.files["file_give"]

    file_name = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
    extension = file_receive.filename.split('.')[-1]
    save_to = f'static/{file_name}.{extension}'
    file_receive.save(save_to)

    doc = {
        'title': title_receive,
        'content': content_receive,
        'file': f'{file_name}.{extension}'
    }

    db.diary.insert_one(doc)

    return jsonify({'msg': '저장 완료'})

if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)
index.html
<!doctype html>
<html lang="en">

<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta property="og:title" content="나홀로일기장"/>
    <meta property="og:description" content="코린이의 개발 연습 페이지"/>

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
          integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Jua&display=swap" rel="stylesheet">

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
            integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
            crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
            integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
            crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bs-custom-file-input/dist/bs-custom-file-input.js"></script>

    <script>
        $(document).ready(function () {
            bsCustomFileInput.init()
            listing()
        })

        function listing() {
            $.ajax({
                type: "GET",
                url: "/diary?sample_give=샘플데이터",
                data: {},
                success: function (response) {
                    let diaries = response['all_diary']

                    for (let i = 0; i < diaries.length; i++) {
                        let title = diaries[i]['title']
                        let content = diaries[i]['content']
                        let file = diaries[i]['file']
                        let date_split = file.split('-')
                        let date = date_split[0] + '.' + date_split[1] + '.' + date_split[2]

                        let temp_html = `<div class="card">
                                            <img src="../static/${file}" class="card-img-top">
                                            <div class="card-body">
                                                <h5 class="card-title">${title}</h5>
                                                <p class="card-text">${content}</p>
                                                <p class="date-text">${date}</p>
                                            </div>
                                        </div>`

                        $('#cards-box').append(temp_html)
                    }
                }
            })
        }

        function posting() {
            let title = $('#title').val()
            let content = $('#content').val()
            let file = $('#file')[0].files[0]
            let form_data = new FormData()
            form_data.append("file_give", file)
            form_data.append("title_give", title)
            form_data.append("content_give", content)

            $.ajax({
                type: "POST",
                url: "/diary",
                data: form_data,
                cache: false,
                contentType: false,
                processData: false,
                success: function (response) {
                    alert(response['msg'])
                    window.location.reload()
                }
            })
        }
    </script>
    <style>
        * {
            font-family: 'Jua', sans-serif;
        }

        .wrap {
            width: 900px;
            margin: auto;
        }

        .container {
            padding-left: 50px;
        }

        .posting-box {
            width: 500px;
            margin-top: 20px;
        }

        .posting-box > .custom-file {
            margin-bottom: 15px;
        }

        .date-text {
            color: gray;
            font-size: 13px;
        }
    </style>

    <title>스파르타코딩클럽 | 부트스트랩 연습하기</title>
</head>

<body>
<div class="wrap">
    <div class="jumbotron jumbotron-fluid">
        <div class="container">
            <h1>나홀로일기장</h1>
            <div class="posting-box">
                <div class="custom-file">
                    <input type="file" class="custom-file-input" id="file">
                    <label class="custom-file-label" for="customFile">사진 선택하기</label>
                </div>
                <div class="form-group">
                    <input type="title" class="form-control" id="title" placeholder="사진 제목">
                </div>
                <div class="form-group">
                    <textarea class="form-control" id="content" rows="3"
                              placeholder="내용 입력"></textarea>
                </div>
                <button type="button" class="btn btn-primary" onclick="posting()">저장하기</button>
            </div>
        </div>
    </div>
    <div class="card-columns" id="cards-box">

    </div>
</div>
</body>

</html>

0개의 댓글

관련 채용 정보