31[小鬼手帳]-POST練習(注釈)


  • meta_prac.py
  • import requests
    from bs4 import BeautifulSoup
    
    url = 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=171539'
    
    headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    data = requests.get(url,headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    
    title = soup.select_one('meta[property="og:title"]')['content']
    image = soup.select_one('meta[property="og:image"]')['content']
    desc = soup.select_one('meta[property="og:description"]')['content']
    
    print(title,image,desc)
  • dbprac.py
  • from pymongo import MongoClient
    client = MongoClient('localhost', 27017)
    db = client.dbsparta
    
    # insert / find / update / delete
    
    # 저장 - 예시
    doc = {'name':'bobby','age':21}
    db.users.insert_one(doc)
    
    # 한 개 찾기 - 예시
    user = db.users.find_one({'name':'bobby'})
    
    # 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
    same_ages = list(db.users.find({'age':21},{'_id':False}))
    
    # 바꾸기 - 예시
    db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
    
    # 지우기 - 예시
    db.users.delete_one({'name':'bobby'})
  • index.html
  • <!Doctype html>
    <html lang="ko">
    
        <head>
            <!-- Required meta tags -->
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    
            <!-- 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">
    
            <!-- 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>
    
            <!-- 구글폰트 -->
            <link href="https://fonts.googleapis.com/css?family=Stylish&display=swap" rel="stylesheet">
    
    
            <title>스파르타코딩클럽 | 나홀로 메모장</title>
    
            <!-- style -->
            <style type="text/css">
                * {
                    font-family: "Stylish", sans-serif;
                }
    
                .wrap {
                    width: 900px;
                    margin: auto;
                }
    
                .comment {
                    color: blue;
                    font-weight: bold;
                }
    
                #post-box {
                    width: 500px;
                    margin: 20px auto;
                    padding: 50px;
                    border: black solid;
                    border-radius: 5px;
                }
            </style>
            <script>
                $(document).ready(function () {
                    showArticles();
                });
    
                function openClose() {
                    if ($("#post-box").css("display") == "block") {
                        $("#post-box").hide();
                        $("#btn-post-box").text("포스팅 박스 열기");
                    } else {
                        $("#post-box").show();
                        $("#btn-post-box").text("포스팅 박스 닫기");
                    }
                }
    
                function postArticle() {
                    let url = $('#post-url').val()
                    let comment = $('#post-comment').val()
    
                    $.ajax({
                        type: "POST",
                        url: "/memo",
                        data: {url_give:url, comment_give:comment},
                        success: function (response) { // 성공하면
                            alert(response["msg"]);
                            window.location.reload() //알림창 띄운 후 새로고침
                        }
                    })
                }
    
                function showArticles() {
                    $.ajax({
                        type: "GET",
                        url: "/memo?sample_give=샘플데이터",
                        data: {},
                        success: function (response) {
                            alert(response["msg"]);
                        }
                    })
                }
            </script>
    
        </head>
    
        <body>
            <div class="wrap">
                <div class="jumbotron">
                    <h1 class="display-4">나홀로 링크 메모장!</h1>
                    <p class="lead">중요한 링크를 저장해두고, 나중에 볼 수 있는 공간입니다</p>
                    <hr class="my-4">
                    <p class="lead">
                        <button onclick="openClose()" id="btn-post-box" type="button" class="btn btn-primary">포스팅 박스 열기
                        </button>
                    </p>
                </div>
                <div id="post-box" class="form-post" style="display:none">
                    <div>
                        <div class="form-group">
                            <label for="post-url">아티클 URL</label>
                            <input id="post-url" class="form-control" placeholder="">
                        </div>
                        <div class="form-group">
                            <label for="post-comment">간단 코멘트</label>
                            <textarea id="post-comment" class="form-control" rows="2"></textarea>
                        </div>
                        <button type="button" class="btn btn-primary" onclick="postArticle()">기사저장</button>
                    </div>
                </div>
                <div id="cards-box" class="card-columns">
                    <div class="card">
                        <img class="card-img-top"
                             src="https://www.eurail.com/content/dam/images/eurail/Italy%20OCP%20Promo%20Block.adaptive.767.1535627244182.jpg"
                             alt="Card image cap">
                        <div class="card-body">
                            <a target="_blank" href="#" class="card-title">여기 기사 제목이 들어가죠</a>
                            <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                            <p class="card-text comment">여기에 코멘트가 들어갑니다.</p>
                        </div>
                    </div>
                    <div class="card">
                        <img class="card-img-top"
                             src="https://www.eurail.com/content/dam/images/eurail/Italy%20OCP%20Promo%20Block.adaptive.767.1535627244182.jpg"
                             alt="Card image cap">
                        <div class="card-body">
                            <a target="_blank" href="#" class="card-title">여기 기사 제목이 들어가죠</a>
                            <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                            <p class="card-text comment">여기에 코멘트가 들어갑니다.</p>
                        </div>
                    </div>
                    <div class="card">
                        <img class="card-img-top"
                             src="https://www.eurail.com/content/dam/images/eurail/Italy%20OCP%20Promo%20Block.adaptive.767.1535627244182.jpg"
                             alt="Card image cap">
                        <div class="card-body">
                            <a target="_blank" href="#" class="card-title">여기 기사 제목이 들어가죠</a>
                            <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                            <p class="card-text comment">여기에 코멘트가 들어갑니다.</p>
                        </div>
                    </div>
                    <div class="card">
                        <img class="card-img-top"
                             src="https://www.eurail.com/content/dam/images/eurail/Italy%20OCP%20Promo%20Block.adaptive.767.1535627244182.jpg"
                             alt="Card image cap">
                        <div class="card-body">
                            <a target="_blank" href="#" class="card-title">여기 기사 제목이 들어가죠</a>
                            <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                            <p class="card-text comment">여기에 코멘트가 들어갑니다.</p>
                        </div>
                    </div>
                    <div class="card">
                        <img class="card-img-top"
                             src="https://www.eurail.com/content/dam/images/eurail/Italy%20OCP%20Promo%20Block.adaptive.767.1535627244182.jpg"
                             alt="Card image cap">
                        <div class="card-body">
                            <a target="_blank" href="#" class="card-title">여기 기사 제목이 들어가죠</a>
                            <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                            <p class="card-text comment">여기에 코멘트가 들어갑니다.</p>
                        </div>
                    </div>
                    <div class="card">
                        <img class="card-img-top"
                             src="https://www.eurail.com/content/dam/images/eurail/Italy%20OCP%20Promo%20Block.adaptive.767.1535627244182.jpg"
                             alt="Card image cap">
                        <div class="card-body">
                            <a target="_blank" href="#" class="card-title">여기 기사 제목이 들어가죠</a>
                            <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                            <p class="card-text comment">여기에 코멘트가 들어갑니다.</p>
                        </div>
                    </div>
                </div>
            </div>
        </body>
    
    </html>
  • app.py
  • from flask import Flask, render_template, jsonify, request
    app = Flask(__name__)
    
    import requests
    from bs4 import BeautifulSoup
    
    from pymongo import MongoClient
    client = MongoClient('localhost', 27017)
    db = client.dbsparta
    
    ## HTML을 주는 부분
    @app.route('/')
    def home():
       return render_template('index.html')
    
    @app.route('/memo', methods=['GET'])
    def listing():
        sample_receive = request.args.get('sample_give')
        print(sample_receive)
        return jsonify({'msg':'GET 연결되었습니다!'})
    
    ## API 역할을 하는 부분
    @app.route('/memo', methods=['POST'])
    def saving():
        url_receive = request.form['url_give']
        comment_receive = request.form['comment_give']
    
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
        data = requests.get(url_receive, headers=headers)
    
        soup = BeautifulSoup(data.text, 'html.parser')
    
        title = soup.select_one('meta[property="og:title"]')['content']
        image = soup.select_one('meta[property="og:image"]')['content']
        desc = soup.select_one('meta[property="og:description"]')['content']
    
        doc = {
            'title':title,
            'image':image,
            'desc':desc,
            'url':url_receive,
            'comment':comment_receive
        }
    
        db.articles.insert_one(doc)
    
        return jsonify({'msg':'저장이 완료되었습니다!'})
    
    if __name__ == '__main__':
       app.run('0.0.0.0',port=5000,debug=True)