강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

양성현님의 프로필 이미지
양성현

작성한 질문수

남박사의 파이썬으로 실전 웹사이트 만들기

글 작성시 첨부파일 기능 구현하기

첨부파일 삭제

해결된 질문

작성

·

17

0

@blueprint.route("/edit/<idx>", methods=["GET", "POST"])
@login_required
def board_edit(idx):
    board = mongo.db.board
    try:
        doc = board.find_one({"_id": ObjectId(idx)})
    except Exception:
        doc = None

    if not doc:
        flash("해당 게시물이 존재하지 않습니다.")
        return redirect(url_for("board.lists"))

    if str(session.get("id") or "") != str(doc.get("writer_id") or ""):
        flash("글 수정 권한이 없습니다.")
        return redirect(url_for("board.lists"))

    if request.method == "GET":
        return render_template("edit.html", data=doc, title="글수정")

    # --- POST ---
    title     = (request.form.get("title") or "").strip()
    contents  = (request.form.get("contents") or "").strip()
    deleteold = "deleteoldfile" in request.form   # ✅ 체크박스 감지

    old_file = doc.get("attachfile")
    filename = old_file

    f = request.files.get("attachfile")
    if f and f.filename:
        base, ext = os.path.splitext(secure_filename(f.filename))
        new_name  = f"{base}_{int(time.time())}{ext.lower()}"
        save_dir  = app.config["BOARD_ATTACH_FILE_PATH"]
        os.makedirs(save_dir, exist_ok=True)
        f.save(os.path.join(save_dir, new_name))
        if old_file:
            board_delete_attach_file(old_file)
        filename = new_name

    elif deleteold:
        if old_file:
            board_delete_attach_file(old_file)
        filename = None

    update_set = {"title": title, "contents": contents}
    if deleteold and filename is None:
        board.update_one({"_id": doc["_id"]},
                         {"$set": update_set, "$unset": {"attachfile": ""}})
    else:
        update_set["attachfile"] = filename
        board.update_one({"_id": doc["_id"]}, {"$set": update_set})

    flash("수정되었습니다.")
    return redirect(url_for("board.board_view", idx=str(doc["_id"])))

챗지피티의 도움을 받아 작성했습니다. 근데 삭제 기능만 안되는데 왜 안돼는지 모르겠습니다..

답변 2

0

남박사님의 프로필 이미지
남박사
지식공유자

안녕하세요, 성현님.

일단 코드에는 큰 문제는 없어보입니다만 일단 어느 구간에서 문제가 생기는지 의심 구간에 print() 문을 사용하여 변수의 값들을 확인해보는게 좋을듯 합니다.

 

@blueprint.route("/edit/<idx>", methods=["GET", "POST"])
@login_required
def board_edit(idx):
    board = mongo.db.board
    try:
        doc = board.find_one({"_id": ObjectId(idx)})
    except Exception:
        doc = None

    if not doc:
        flash("해당 게시물이 존재하지 않습니다.")
        return redirect(url_for("board.lists"))

    if str(session.get("id") or "") != str(doc.get("writer_id") or ""):
        flash("글 수정 권한이 없습니다.")
        return redirect(url_for("board.lists"))

    if request.method == "GET":
        return render_template("edit.html", data=doc, title="글수정")

    # --- POST ---
    title     = (request.form.get("title") or "").strip()
    contents  = (request.form.get("contents") or "").strip()
    deleteold = "deleteoldfile" in request.form   # ✅ 체크박스 감지

    print(f"deleteold::{deleteold}") # 디버깅 deleteold 변수값 확인

    old_file = doc.get("attachfile")
    filename = old_file

    f = request.files.get("attachfile")
    if f and f.filename:
        base, ext = os.path.splitext(secure_filename(f.filename))
        new_name  = f"{base}_{int(time.time())}{ext.lower()}"
        save_dir  = app.config["BOARD_ATTACH_FILE_PATH"]
        os.makedirs(save_dir, exist_ok=True)
        f.save(os.path.join(save_dir, new_name))
        if old_file:
            board_delete_attach_file(old_file)
        filename = new_name

    elif deleteold:

        print(f">> deleteold <<") # elif 문을 탔는지 체크

        if old_file:

            print(f"deletefile::{old_file}") # 디버깅 조건문과 변수값 확인

            board_delete_attach_file(old_file)
        filename = None

    update_set = {"title": title, "contents": contents}
    if deleteold and filename is None:
        board.update_one({"_id": doc["_id"]},
                         {"$set": update_set, "$unset": {"attachfile": ""}})
    else:
        update_set["attachfile"] = filename
        board.update_one({"_id": doc["_id"]}, {"$set": update_set})

    flash("수정되었습니다.")
    return redirect(url_for("board.board_view", idx=str(doc["_id"])))

위의 코드에서처럼 기존 파일을 삭제하는 기능이 동작해야할 구간에 print() 함수를 사용하여 변수의 값과 조건문을 타고 있는지 등을 확인하면서 무엇이 문제인지 확인해보는게 좋을듯 합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 님의 질문에 도움을 드리기 위해 유사한 상황을 다루는 답변을 찾아보았습니다. 첨부파일 삭제가 제대로 작동하지 않는 문제에 대해 살펴보겠습니다.

삭제 기능이 작동하지 않는 몇 가지 일반적인 원인을 소개해 드리겠습니다:

  1. checkbox의 name 속성과 request.form에서 가져오는 값 확인: 첨부 파일 삭제를 위해 사용된 deleteold 변수가 비어 있거나 잘못된 경우입니다. HTML 폼의 체크박스의 name 속성이 "deleteoldfile"인지 확인해보세요. HTML에서 정확한 속성이 사용되어야 서버에서 해당 값이 감지될 수 있습니다.

  2. 파일 경로 문제: board_delete_attach_file 함수에서 실제 파일 삭제가 이루어지고 있는지 확인해보세요. 올바른 파일 경로가 설정되어 있는지 확인해야 합니다.

  3. 데이터베이스 업데이트 오류: update_one 쿼리가 데이터베이스에서 잘못 실행되고 있을 수 있습니다. $unset를 사용하는 부분이 올바르게 작성되어 있는지 확인하세요.

위 사항들을 확인해 보시고, 문제가 해결되지 않는다면 코드 또는 로그에 있는 오류 메시지를 추가적으로 공유해 주시면 보다 구체적인 문제 해결에 도움이 될 수 있습니다.

비슷한 문제를 다룬 몇 가지 게시물을 소개해 드립니다:
1. 등록된 글 수정시 - 파일 처리 및 데이터베이스 업데이트 관련 힌트를 얻을 수 있습니다.
2. 글 작성 폼에 HTML 에디터 기능 추가하기 이미지 저장 오류 - 파일 저장 관련 부분을 참고해 보세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

양성현님의 프로필 이미지
양성현

작성한 질문수

질문하기