Flask 간단한 CRUD 작업

32785 단어 Flask 프레임
간단한 CRUD 조작은 기본적으로 특정한 개발 구조와 플랫폼의 특징을 볼 수 있다.Flask는 마이크로 프레임워크로서 소형 응용 프로그램을 개발할 때 매우 적합하다.본고는 간단한 Notebook 응용을 개발하여 Flask 개발의 기본 모델을 설명하고자 한다.Flask 모듈을 제외한 이번 플러그인은 다음과 같습니다.
  • Flask-SQLAlchemy(SQLAlchemy 기반 확장, 조작 데이터베이스)
  • Flask-WTF(HTML 양식을 쉽게 작성할 수 있는 양식 플러그인)
  • Flask 프로젝트 파일의 구조
    Flask 개발은 업계 권위의 프로젝트 파일 구조가 없지만 주류의 방법이 있다.인터넷상의 문장과 코드를 참고하여 나는 다음과 같은 구조를 채택하려고 한다
    project-folder/
        app / 
            templates /       

    프로비저닝
    먼저 구성부터 시작하겠습니다. 주로 Flask CRUD의 요소를 설명하기 위한 것이기 때문에 구성은 SECRET케이 다 아꼈어.Windows 환경 변수에서 데이터 연결에 대한 URI를 가져옵니다.
    # configs.py
    
    import os
    
    SQLALCHEMY_DATABASE_URI = os.getenv('DB_URI')
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    

    데이터베이스 CRUD 작업
    Flask-SQLAlchemy를 사용하여 데이터베이스의 CRUD 작업을 수행합니다.먼저 app/models.py에서 Model의 구조를 정의하고 데이터 테이블과 필드에 매핑합니다.
    # models.py
    
    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    
    class Notes(db.Model):
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        body = db.Column(db.Text)
    
        def __repr__(self):
            return 'Note body: {}'.format(self.body)
    

    그런 다음 app/controllers.py 파일에서 데이터베이스에 대한 CRUD 작업을 정의하는 다섯 가지 방법이 있습니다.
    # controllers.py
    
    from app.models import db, Notes
    from sqlalchemy import desc
    
    class NotesDao():
        def create_note(self, note_body):
            new_note = Notes(body=note_body)
            db.session.add(new_note)
            db.session.commit()
    
            return new_note
    
    
        def update_note(self, note):
            modified_note = Notes.query.get(note.id)
            db.session.commit()
    
            return modified_note
    
    
        def delete_note(self, note):
            note_to_delete = Notes.query.get(note.id)
            db.session.delete(note_to_delete )
            db.session.commit()
    
            return True
    
    
        def list_all(self):
            return Notes.query.order_by(desc(Notes.id)).all()
    
    
        def get_note(self, id):
            return Notes.query.get(id)
    

    뷰 함수 정의app/views.py 파일에서 청사진(blueprint)과 보기 함수를 정의합니다
    
    from flask import request, render_template, Blueprint, flash, redirect, url_for
    from app.controllers import NotesDao
    from app.forms import *
    
    
    #     
    notesbp = Blueprint('notesbp', __name__, template_folder='templates')
    
    @notesbp.route('/')
    def index():
    
        noteservice = NotesDao()
    
        # return book list to front end
        notes = noteservice.list_all()
        return render_template('index.html', notes=notes)
    
    
    @notesbp.route('/new', methods=['GET', 'POST'])
    def new_note():
        form = NewNoteForm()
    
        if request.method == 'POST':
            body = request.form['body']
            noteservice = NotesDao()
            noteservice.create_note(body)
    
            return redirect(url_for('notesbp.index'))
    
        return render_template('new_note.html', form=form)
    
    
    @notesbp.route('/edit/', methods=['GET', 'POST'])
    def edit_note(note_id):
        form = EditNoteForm()
        note = NotesDao().get_note(note_id)
    
        if request.method == 'POST':
            body = request.form['body']
            note.body = body
            NotesDao().update_note(note)
    
            return redirect(url_for('notesbp.index'))
    
        form.body.data = note.body
        return render_template('edit_note.html', form=form)
    
    
    @notesbp.route('/delete/', methods=['GET'])
    def delete_note(note_id):
        notesdao = NotesDao()
        note = notesdao.get_note(note_id)
        notesdao.delete_note(note)
    
        return redirect(url_for('notesbp.index'))
    

    설명: 블루프린트는 Flask 코드를 모듈화한 도구로 본 예에서는 현재 모듈을 notesbp라고 명명하고, 보기 함수는 블루프린트 맵 루트를 이용하고, url_for() 함수는 블루프린트를 이용하여 보기 함수를 찾는다.
    HTML 파일
    보기 함수에 연결된 html 파일을templates 폴더에 넣습니다.
    index.html
    
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Flask basic CRUDtitle>
        <link rel="stylesheet" type="text/css" href="../static/styles.css">
    head>
    <body>
        <a href="{{ url_for('notesbp.new_note') }}">New notea>
    
        <h4> {{ notes|length }} Notes: h4>
    
        <table>
            <tr>
                <th>IDth>
                <th>Bodyth>
                <th>Actionth>
            tr>
    
            {% for note in notes %}
                <tr>
                    <td> {{note.id}} td>
                    <td> {{note.body}} td>
                    <td>
                        <a href="{{ url_for('notesbp.edit_note', note_id=note.id) }}">Edita>
                        <a href="{{ url_for('notesbp.delete_note', note_id=note.id) }}">Deletea>
                    td>
                tr>
            {% endfor %}
        table>
    body>
    html>
    

    edit_note.html 및 newnote.html 내용 동일
    
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>New notetitle>
    head>
    <body>
        <h2>New noteh2>
    
        <form method="POST">
            {{ form.body(rows='10',cols='100') }}<br/>
            {{ form.submit }}
        form>
    body>
    html>
    

    html 파일의 작성을 간소화하기 위해 flask-wtf 폼을 사용했고 폼의 코드는 app/forms.py 파일에 놓여 있습니다.
    from wtforms import Form, TextAreaField, SubmitField
    
    class NewNoteForm(Form):
        body = TextAreaField('body')
        submit = SubmitField('Save')
    
    class EditNoteForm(Form):
        body = TextAreaField('body')
        submit = SubmitField('Update')
    

    공장 함수로 app 만들기
    코드는 app/__init__.py 파일에 배치됩니다.
    from flask import Flask
    import configs
    from app.models import db
    from app.views import notesbp
    
    
    def create_app():
        app = Flask(__name__)
    
        #     
        app.config.from_object(configs)
    
        #    db
        db.app = app
        db.init_app(app)
    
        #     
        app.register_blueprint(notesbp)
    
        return app
    

    데이터베이스 테이블 생성
    SQL 명령문create database xxx charset utf8;으로 데이터베이스를 만든 다음 실행db_scripts.py 코드로 테이블을 만듭니다.
    from app.models import db
    from app import create_app
    
    app = create_app()
    db.app = app
    db.init_app(app)
    
    if __name__ == '__main__':
        db.drop_all()
        db.create_all()
        print ('Done')
    

    시작 파일
    백엔드 프로그램은 server.py를 통해 시작되며 코드는 다음과 같습니다.
    from app import create_app
    
    app = create_app()
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    본문 소스 코드:https://github.com/stonewm/python-practice-projects/tree/master/Flask/Notebook-v1.0
    참고 자료
  • (이휘)
  • Building a CRUD application with Flask and SQLAlchemy
  • 좋은 웹페이지 즐겨찾기