파이썬 flask 405오류

조회수 2255회

index.html

{% for obj in data_list%}
      <!-- single item -->
      <div class="item my-3">
      <h5 class="item-name text-capitalize">{{obj.contents}}</h5>
      <div class="item-icons">
        <a href="{{url_for('delete')}}" name="id" value="{{obj._id}}" class="delete-item item-icon">
        <i class="far fa-times-circle"></i>
       </a>
      </div>
     </div>
      <!-- end of single item -->
      {% endfor %}

list.py

@app.route('/delete', methods=['POST'])
def delete():
    idx=request.values.get('id')
    db.delete_todo(idx)
    return '''
                <script>
                    alert("삭제되었습니다")
                    location.href="."
                </script>
              '''

db.py

def delete_todo(idx):
    conn = mongodb.get_conn()
    conn.delete_one({"_id":idx})

이미지

index.html에서 a태그 있는곳을 클릭하면 db.py에서 데이터를 삭제하고 화면에서 없애는 연산을 하고 싶은데 a태그를 클릭하면 The method is not allowed for the requested URL.이런 405오류가 나옵니다. 디비는 몽고디비를 썼어요.

어디가 잘못된걸까요? 혼자 구글링하면서 공부하니 쉬운것 같은데도 막히네요ㅜㅜ

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    HTTP 405는 "그런 메소드로 처리할 방법이 없다"는 의미입니다. 질문자님의 코드는 POST 메소드로 /delete를 요청할 수 있게 되어 있지만 정작 버튼을 누를 때는 GET /delete를 요청하도록 되어 있어요. a 태그는 GET 요청을 처리하기 때문이지요. 그러니 정당한 오류인 405가 반환되는 거구요.

    가장 단순 무식한 핫픽스는 이런 식이 됩니다.

    <form action="POST" action="{{ url_for('delete') }}">
        <input type="hidden" name="id" value="{{ obj._id }}" />
        <button type="submit" class="delete-item item-icon">
            <i class="far fa-times-circle"></i>
        </button>
    </form>
    

    핵심은 POST 요청을 보낼 수 있는 방법을 찾아서 그 방법으로 /delete를 요청해야 한다는 겁니다. 좀더 잘 만들면 예컨대 이런 스크립트가 동원이 되겠죠.

    $('body').on('click', '.delete-item', function () {
        $.ajax({
            type: 'POST',
            url: '/delete',
            data: {id: obj._id}
        });
    });
    

    이해가 되신다면 잘 응용해 보셔요.

    • 게으른 저는, flask 코드에 "GET" 을 추가하겠습니다. ㅎㅎ. nowp 2020.11.10 10:36

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)