ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [FLASK] 삭제(Delete)
    FLASK 2022. 11. 14. 10:42

     

     

     

    현재 코드 ▼

    from flask import Flask, request, redirect
    
    app = Flask(__name__)
    
    nextId = 4
    topics = [
        {'id':1, 'title': 'html', 'body': 'html is ...'},
        {'id':2, 'title': 'css', 'body': 'css is ...'},
        {'id':3, 'title': 'javascript', 'body': 'javascript is ...'}
    ]
    
    def template(contents, content, id=None):
        contextUI = ''
        if id != None:
            contextUI = f'''
                <li><a href="/update/{id}/">update</a></li>
            '''
        return f'''<!doctype html>
        <html>
            <body>
                <h1><a href="/">WEB</a></h1>
                </ol>
                    {contents}
                </ol>
                {content}
                <ul>
                    <li><a href="/create/">create</a></li>
                    {contextUI}
                </ul>
            </body>
        </html>
        '''
    
    def getContents():
        liTags = ''
        for topic in topics:
            liTags = liTags + f'<li><a href="/read/{topic["id"]}/">{topic["title"]}</a></li>'
        return liTags
    
    
    @app.route('/')
    def index():
        return template(getContents(), '<h2>Welcome</h2>Hello, WEB')
    
    
    @app.route('/create/', methods=['GET', 'POST'])
    def create():
        if request.method == 'GET':
            content = '''
                <form action="/create/" method="POST">
                    <p><input type="text" name="title" placeholder="title"></p>
                    <p><textarea name="body" placeholder="body"></textarea></p>
                    <p><input type="submit" value="create"></p>
                </form>
            '''
            return template(getContents(), content)
        elif request.method == 'POST':
            global nextId
            title = request.form['title']
            body = request.form['body']
            newTopic = {'id': nextId, 'title': title, 'body': body}
            topics.append(newTopic)
            url = '/read/'+str(nextId)+'/'
            nextId = nextId + 1
            return redirect(url)
    
    
    @app.route('/read/<int:id>/')
    def read(id):
        title = ''
        body = ''
        for topic in topics:
            if id  == topic['id']:
                title = topic['title']
                body = topic['body']
                break
        return template(getContents(), f'<h2>{title}</h2>{body}', id)
    
    
    @app.route('/update/<int:id>/', methods=['GET', 'POST'])
    def update(id):
        if request.method == 'GET':
            title = ''
            body = ''
            for topic in topics:
                if id  == topic['id']:
                    title = topic['title']
                    body = topic['body']
                    break
    
            content = f'''
                <form action="/update/{id}/" method="POST">
                    <p><input type="text" name="title" placeholder="title" value="{title}"></p>
                    <p><textarea name="body" placeholder="body">{body}</textarea></p>
                    <p><input type="submit" value="update"></p>
                </form>
            '''
            return template(getContents(), content)
    
        elif request.method == 'POST':
            title = request.form['title']
            body = request.form['body']
            for topic in topics:
                if id == topic['id']:
                    topic['title'] = title
                    topic['body'] = body
                    break
            url = '/read/'+str(id)+'/'
            return redirect(url)
    
    app.run(debug=True)

     

     

     

    마지막으로 삭제 기능을 구현해 보도록 하겠습니다 !

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    삭제 기능도 id가 있을 때 활성화 되어야 하므로

    contextUI에 삭제 버튼을 만들어 주도록 합니다!

     

    create나 update는 수정과 추가라는 ui가 필요했고

    이동하기 위해서 <a>태그를 사용했습니다.

    예를 들어 create를 클릭하면 생성 페이지로 이동하고

    글을 쓰고 create버튼을 누르면 생성이 완료됩니다.

    삭제 기능은 클릭하면 바로 삭제가 되도록 할 것이므로

    링크 사용이 필요하지 않습니다 !

     

    <form>태그를 이용해

    action 속성에 데이터를 전송할 url을 적어주고

    method=POST로 명시해 줍니다.

     

    누군가 직접 url을 치고 들어간다 하더라도

    그것은 GET 방식이기 때문에 삭제가 되지 않고

    의도적으로 "POST"방식으로 전송시에만 삭제가 됩니다 !

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    위와 같이 delete 라우트를 만들어 줍니다.

    id값을 받고 method는 POST 방식만을 허용합니다.

     

    id가 topic의 id와 같아면

    remove() 함수를 이용하여 topics에서 제거합니다.

     

    삭제가 완료되면 홈페이지로('/') 이동합니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    잘 작동하는지 확인해 보겠습니다 !

    홈페이지에서 html을 클릭하면 ~

     

     

     

     

     

     

     

     

     

     

     

    read페이지로 이동하고

    delete버튼이 보입니다.

     

     

     

     

     

     

     

     

     

     

     

     

    삭제가 완료되어 홈페이지로 이동하고

    html이 목록에서 사라졌습니다 !

     

     

     

     

     

     

     

     

     

     

     

    삭제(Delete) 완성!

    @app.route('/delete/<int:id>/', methods=['POST'])
    def delete(id):
        for topic in topics:
            if id == topic['id']:
                topics.remove(topic)
                break
        return redirect('/')

     

     

     

     

     

     

     

     

    출처

    'FLASK' 카테고리의 다른 글

    [FLASK] 수정(Update)  (0) 2022.11.13
    [FLASK] 쓰기(Create)_2  (0) 2022.11.12
    [FLASK] 쓰기(Create)_1  (0) 2022.11.12
    [FLASK] 읽기(Read)  (0) 2022.11.11
    [FLASK] 홈페이지 구현  (0) 2022.11.11
Designed by Tistory.