CRUD 기능 만들기



소개



Flask를 사용하여 1에서 응용 프로그램을 만들고 필요한 기술을 배울 수 있도록 정리하고 있습니다.
  • flask로 간단한 앱 만들기
  • Home 화면을 작성해 보기
  • 인증 기능 만들기
  • 데이터베이스 처리
  • CRUD 기능을 작성해 본다 ← ★현재 여기

  • CRUD란?



    CRUD는 Create, Read, Update, Delete 각각의 이니셜을 찍은 것입니다.
    이번에 작성한 블로그 애플리케이션에서는 다음과 같습니다.
  • Create : 신규 블로그 작성 기능 (데이터의 신규 작성)
  • 읽기 : 블로그 목록 표시 기능 및 상세 표시 기능 (데이터로드)
  • 업데이트 : 블로그 업데이트 기능 (데이터 업데이트)
  • 삭제 : 블로그 삭제 기능 (데이터 삭제)

  • CRUD를 충족하여 한 가지 기능을 만들 수 있습니다. 이번 기능을 다른 어플리케이션을 작성할 때에도 응용할 수 있습니다.

    Create



    블로그 투고 화면 작성


  • 네비게이션 바 추가

  • src/templates/layout.html
    <div class="collapse navbar-collapse" id="navbarNav">
      <ul class="nav navbar-nav navbar-lighy">
        {% if not session.logged_in %}
        <li class="nav-item">
          <a class="nav-link" href="{{ url_for('login') }}">LogIn</a>
        </li>
        {% else %}
        <li class="nav-item">
          <a class="nav-link" href="{{ url_for('new_add') }}">新規登録</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="{{ url_for('logout') }}">Logout</a>
        </li>
        {% endif %}
      </ul>
    </div>
    
  • 게시 양식

  • src/templates/new.htnl
    {% extends "./layout.html" %}
    
    {% block body %}
    <form action="{{ url_for('add_entry') }}" method=post class=add-entry>
        <div class=form-group>
            <label for="InputTitle">タイトル</label>
            <input type="text" class="form-control" id="InputTitle" name=title>
        </div>
    
        <div class="form-group">
            <label for="InputText">本文</label>
            <textarea name=text id="InputText" rows="10" class="form-control"></textarea>
        </div>
        <button type="submit" class="btn btn-primary">作成</button>
    </form>
    {% endblock %}
    

    블로그 게시 기능 작성



    src/views.py
    from src import app, db
    from flask import flash
    from flask import redirect
    from flask import request
    from flask import render_template
    from flask import url_for
    from flask import session
    
    from src.domains.entry import Entry
    
    User = {
        'username': 'test',
        'password': 'testpass'
    }
    
    @app.route('/')
    def index():
        if not session.get('logged_in'):
            return redirect('/login')
        return render_template('index.html')
    
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'POST':
            if request.form['username'] != User['username']:
                flash(f'ユーザ名が異なります')
            elif request.form['password'] != User['password']:
                flash(f'パスワードが異なります')
            else:
                session['logged_in'] = True
                flash('ログインしました')
                return redirect('/')
        return render_template('login.html')
    
    @app.route('/logout', methods=['GET'])
    def logout():
        session.pop('logged_in', None)
        flash('ログアウトしました')
        return redirect('/')
    
    @app.route('/new_add', methods=['GET','POST'])
    def new_add():
        return render_template('/new.html')
    
    @app.route('/add_entry', methods=['POST'])
    def add_entry():
        if not session.get('logged_in'):
            return redirect(url_for('login'))
        entry = Entry(
            title = request.form['title'],
            text = request.form['text'])
    
        db.session.add(entry)
        db.session.commit()
        flash('新しく記事が作成されました')
        return redirect(url_for('index'))
    

    읽기



    목록 기능



    src/templates/index.html
    {% extends "./layout.html" %}
    
    {% block body %}
    {% for entry in entries %}
    <ul class="card">
        <div class="card-body">
            <h5 class="card-title">
                <a href="{{ url_for('show_entry', id=entry.id) }}">{{ entry.title }}</a>
            </h5>
        </div>
    </ul>
    {% else %}
    投稿がありません
    {% endfor %}
    
    {% endblock %}
    

    src/views.py
    @app.route('/')
    def index():
        if not session.get('logged_in'):
            return redirect('/login')
        entries = Entry.query.order_by(Entry.id.desc()).all()
        return render_template('index.html', entries=entries)
    



    고급 기능



    src/views.py
    @app.route('/entry/<int:id>', methods=['GET'])
    def show_entry(id):
        if not session.get('logged_in'):
            return redirect(url_for('login'))
        entry = Entry.query.get(id)
        return render_template('show.html', entry=entry)
    

    src/templates/show.html
    {% extends "./layout.html" %}
    
    {% block body %}
    <h2>{{ entry.title }}</h2>
    <br />
    
    {{ entry.text }}
    
    <br /><br />
    投稿日時:{{ entry.create_at }}
    {% endblock %}
    



    업데이트


  • 편집 버튼 만들기

  • src/templates/show.html
    {% extends "./layout.html" %}
    
    {% block body %}
    <h2>{{ entry.title }}</h2>
    <br />
    {{ entry.text }}
    <br /><br />
    投稿日時:{{ entry.create_at }}
    <br /><br />
    <div class="btn-group">
        <form action="{{ url_for('edit_entry', id=entry.id) }}" method="GET">
            <button type="submit" class="btn btn-secondary">Edit</button>
        </form>
    </div>
    
    {% endblock %}
    
  • 편집 화면 만들기

  • src/templates/edit.html
    {% extends "./layout.html" %}
    
    {% block body %}
    <form action="{{ url_for('update_entry', id=entry.id) }}" method="POST" class="add-entry">
        <div class="form-group">
            <label>タイトル</label>
            <input type="text" class="form-control" name="title" value={{ entry.title}}>
        </div>
        <div class="form-group">
            <label>本文</label>
            <textarea class="form-control" name="text" cols="100" rows="3">{{ entry.text | safe }}</textarea>
        </div>
        <button type="submit" class="btn btn-primary">Update</button>
    </form>
    {% endblock %}
    
  • 업데이트 기능 만들기

  • src.views.py
    @app.route('/entry/<int:id>/edit', methods=['GET'])
    def edit_entry(id):
        if not session.get('logged_in'):
            return redirect(url_for('login'))
        entry = Entry.query.get(id)
        return render_template('edit.html', entry=entry)
    
    @app.route('/entry/<int:id>/update', methods=['POST'])
    def update_entry(id):
        if not session.get('logged_in'):
            return redirect(url_for('login'))
        entry = Entry.query.get(id)
        entry.title = request.form['title']
        entry.text = request.form['text']
        db.session.merge(entry)
        db.session.commit()
        flash('記事が更新されました')
        return redirect(url_for('index'))
    
  • 상세 화면
  • 편집 화면

  • Delete


  • 삭제 버튼 만들기

  • src/templates/show.html
    {% extends "./layout.html" %}
    
    {% block body %}
    <h2>{{ entry.title }}</h2>
    <br />
    
    {{ entry.text }}
    
    <br /><br />
    投稿日時:{{ entry.create_at }}
    <br /><br />
    <div class="btn-group">
        <form action="{{ url_for('edit_entry', id=entry.id) }}" method="GET">
            <button type="submit" class="btn btn-secondary">Edit</button>
        </form>
    
        <form action="{{ url_for('delete_entry', id=entry.id) }}" method="POST">
            <button type="submit" class="btn btn-danger" style="margin-left:5px">Delete</button>
        </form>
    </div>
    
    {% endblock %}
    
  • 삭제 기능 만들기

  • src/views.py
    @app.route('/entry/<int:id>/delete', methods=['POST'])
    def delete_entry(id):
        if not session.get('logged_in'):
            return redirect(url_for('login'))
        entry = Entry.query.get(id)
        db.session.delete(entry)
        db.session.commit()
        flash('投稿が削除されました')
        return redirect(url_for('index'))
    
  • 상세 화면
  • 삭제 후 화면
  • 좋은 웹페이지 즐겨찾기