커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
코드가 이상합니다.
undefined주차
북마크
한*훈
댓글
1
추천
0
조회수
40
조회수
40
답변 완료

솔직히 불만이 한두가지가 아닙니다. 아무리 싼 강의라 해도 2시간 남짓한 수업에 5만원 강의를 산건데 즉문즉답이 토일 2시부터 5시고, 강의도 잘 따라가다가 코드가 전 강의랑 다르다던지 심지어 7강에서는 코드스니펫에 POST API코드에는 @app.route('/exhibit', methods=["POST"])로 적어놓으시고 fetch API코드에는

let formData = new FormData()

formData.append("example_give", "data")

fetch('/target', {method: "POST", body: formData}).then(res => res.json()).then(data => {

  console.log(data)

})

와 같이 적어놓으셔서 오류가 발생하더군요. 중간 강의를 날리신건지 옛날 강의랑 섞인건지 모르겠는데, 제대로 이어지는 강의를 제공해주셨으면 합니다. 코드 오류가 나도 제 잘못인지 강사님의 코드랑 달라서 오류가 난건지 스스로 판단이 힘듭니다.


이와 별개로 8차시 강의를 듣던 중 오류가 발생했습니다.

코드는 강의 잘 따라가며 썼는데 forEach문을 시행하던 중 콘솔창에서 데이터를 못 받아오는 듯 하더군요.

콘솔창과 index.html, app.py, app.py 실행 후 새로고침 시 뜨는 메시지 첨부합니다.




스파르타 즉문즉답





작성한 코드 및 에러 메세지

<!DOCTYPE html>
<html lang="en">


<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>오늘의 전시</title>
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.12.4.min.js"></script>
    <style>
        html,
        body,
        h1,
        h2,
        h3,
        p,
        a,
        span {
            margin: 0;
            padding: 0;
        }


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


        .card {
            width: 320px;
            height: 340px;


            display: flex;
            flex-direction: column;
            align-items: flex-start;
            justify-content: flex-start;


            margin: 16px 10px;
            border: 1px solid black;


            cursor: pointer;
        }


        .card-wrap {
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
        }


        .card-image {
            background-position: center;
            background-size: cover;


            width: 100%;
            height: 200px;


        }


        .card>span {
            margin: 8px;
        }


        .card-title {
            font-size: 18px;
            font-weight: bold;
        }


        .period {
            color: yellowgreen;
            font-size: 14px;
        }


        .tags {
            color: gray;
            font-size: 14px;
            word-break: keep-all;
        }


        .url-form {
            align-items: center;
            justify-content: space-around;
        }


        .plus-form {
            align-items: center;
            justify-content: center;
            cursor: pointer;
        }
    </style>
    <script>
        $(document).ready(() => {
            listing();
            showPlusForm();
        })


        const showUrlForm = () => {
            $('#plus-form').hide();
            $('#url-form').show();
        }


        const showPlusForm = () => {
            $('#url-form').hide();
            $('#plus-form').show();
        }


        const posting = () => {
            let url = $('#url').val()


            let formData = new FormData()
            formData.append("url_give", url)


            fetch('/exhibit', {method: "POST", body: formData}).then(res => res.json()).then(data => {
                alert(data['msg'])
                window.location.reload();
            })
        }


        const move = (url) => {
            window.open(url,'_blank')
        }


        const listing = () => {
            fetch('/exhibit').then(res => res.json()).then(data => {
                let rows = data['result']
                rows.forEach((row) => {
                    console.log(row)
                })
            })
        }
    </script>
</head>


<body>
    <div class="wrap">
        <h1>오늘의 전시</h1>
        <div id="card-wrap" class="card-wrap">
            <div onclick="move('https://korean.visitseoul.net/index')" class="card">
                <div class="card-image"></div>
                <span class="card-title">제목</span>
                <span class="period">기간</span>
                <span class="tags">#설명회 #설명회 #설명회 #설명회 #설명회 #설명회 #설명회 #설명회 #설명회</span>
            </div>
            <div id="url-form" class="url-form card">
                <input id="url" placeholder="전시 URL을 입력해주세요!">
                <div>
                    <button onclick="showPlusForm()">취소하기</button>
                    <button onclick="posting()">등록하기</button>
                </div>
            </div>
            <div id="plus-form" onclick="showUrlForm()" class="plus-form card">
                <span>+</span>
                <span>추가하기</span>
            </div>
        </div>
    </div>


</body>


</html>



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


import requests
from bs4 import BeautifulSoup


from pymongo import MongoClient
client = MongoClient("mongodb+srv://sparta:test@cluster0.xa8mbuw.mongodb.net/?retryWrites=true&w=majority")
db = client.pirates_lv1


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


@app.route('/exhibit', methods=["POST"])
def post_exhibit():
    url_receive = request.form["url_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('#container > div.wide-inner > section > h3').text
    period = soup.select_one('#container > div.detial-cont-element.active > div > dl:nth-child(1) > dd').text.strip()
    tags = soup.select_one('#container > section.tag-element.poi > p').text.replace('\n',' ')
    image = soup.select('.item')[1]['style'].replace("background-image:url('",'').replace("');",'')
    image = 'https://korean.visitseoul.net'+image


    doc = {
        'url' : url_receive,
        'title' : title,
        'period' : period,
        'tags' : tags,
        'image' : image
    }


    db.exhibition.insert_one(doc)


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


@app.route('/exhibit', methods=["GET"])
def get_exhibit():
    exhibitions = db.exhibition.find({},{'_id':False})
    return jsonify({"result": exhibitions})


if __name__ == "__main__":
    app.run(debug=True, port=8080)



한지훈@DESKTOP-2M1UUPH MINGW64 ~/OneDrive/바탕 화면/스파르타/pirates/web/lv1
$ source "c:/Users/한지훈/OneDrive/바탕 화면/스파르타/pirates/web/lv1/venv/Scripts/activate"
(venv) 
한지훈@DESKTOP-2M1UUPH MINGW64 ~/OneDrive/바탕 화면/스파르타/pirates/web/lv1
$ "c:/Users/한지훈/OneDrive/바탕 화면/스파르타/pirates/web/lv1/venv/Scripts/python.exe" "c:/Users/한지훈/OneDrive/바탕 화면/스파르타/pirates/web/lv1/app.py"
 * Serving Flask app 'app'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:8080
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 690-093-432
127.0.0.1 - - [18/Apr/2023 16:32:04] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [18/Apr/2023 16:32:04] "GET /exhibit HTTP/1.1" 500 -
Traceback (most recent call last):
  File "C:\Users\한지훈\OneDrive\바탕 화면\스파르타\pirates\web\lv1\venv\lib\site-packages\flask\app.py", line 2551, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\한지훈\OneDrive\바탕 화면\스파르타\pirates\web\lv1\venv\lib\site-packages\flask\app.py", line 2531, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\한지훈\OneDrive\바탕 화면\스파르타\pirates\web\lv1\venv\lib\site-packages\flask\app.py", line 2528, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\한지훈\OneDrive\바탕 화면\스파르타\pirates\web\lv1\venv\lib\site-packages\flask\app.py", line 1825, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\한지훈\OneDrive\바탕 화면\스파르타\pirates\web\lv1\venv\lib\site-packages\flask\app.py", line 1823, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\한지훈\OneDrive\바탕 화면\스파르타\pirates\web\lv1\venv\lib\site-packages\flask\app.py", line 1799, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "c:\Users\한지훈\OneDrive\바탕 화면\스파르타\pirates\web\lv1\app.py", line 45, 
in get_exhibit
    return jsonify({"result": exhibitions})
  File "C:\Users\한지훈\OneDrive\바탕 화면\스파르타\pirates\web\lv1\venv\lib\site-packages\flask\json\__init__.py", line 342, in jsonify
    return current_app.json.response(*args, **kwargs)
  File "C:\Users\한지훈\OneDrive\바탕 화면\스파르타\pirates\web\lv1\venv\lib\site-packages\flask\json\provider.py", line 309, in response
    f"{self.dumps(obj, **dump_args)}\n", mimetype=mimetype
  File "C:\Users\한지훈\OneDrive\바탕 화면\스파르타\pirates\web\lv1\venv\lib\site-packages\flask\json\provider.py", line 230, in dumps
    return json.dumps(obj, **kwargs)
  File "C:\Python310\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Python310\lib\json\encoder.py", line 201, in encode
    chunks = list(chunks)
  File "C:\Python310\lib\json\encoder.py", line 431, in _iterencode
    yield from _iterencode_dict(o, _current_indent_level)
  File "C:\Python310\lib\json\encoder.py", line 405, in _iterencode_dict
    yield from chunks
  File "C:\Python310\lib\json\encoder.py", line 438, in _iterencode
    o = _default(o)
  File "C:\Users\한지훈\OneDrive\바탕 화면\스파르타\pirates\web\lv1\venv\lib\site-packages\flask\json\provider.py", line 122, in _default
    raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable")    
TypeError: Object of type Cursor is not JSON serializable


취소
 공유
취소
댓글 0
댓글 알림
나의얼굴