Flask-기본 응용 구축 모델

1.개발 도구
윈도 우즈 든 리 눅 스 든 PyCharm 을 IDE 로 사용 할 수 있어 기능 이 완비 되 고 사용 이 편리 하 다.
2.VirtualEvn 만 들 기
PyCharm 을 사용 하면 명령 행 에 ve 를 만 들 지 않 고 새 프로젝트 를 만 들 고 create virtualevn 을 선택 하여 이름 을 짓 고 저장 경 로 를 선택 하면 됩 니 다.
3.패키지 의존 패키지 설치
PyCharm 에 서 는 메뉴[File]->[Settings]->[Project:youprocject name]->[Project Interpreter]를 통 해 이 환경 에 설 치 된 가방 을 볼 수 있 으 며,"+"아이콘 을 누 르 면 새 가방 을 추가 할 수도 있 고,여기 서 가방 을 삭제 할 수도 있 습 니 다.일반 Flask 프로젝트 의 수요 에 따라 우리 가 설치 해 야 할 가방 은 다음 과 같 습 니 다.
  • Flask(Werkzeug 와 Jinja 2 포함)
  • Flask-SQLAlchemy
  • Flask-MySQLdb
  • Flask-Migrate
  • Flask-script

  • 이 가방 들 을 설치 할 때 의존 가방 을 추가 로 설치 할 수 있 습 니 다.
    4.프로젝트 디 렉 터 리 구조
    전형 적 인 프로젝트 디 렉 터 리 구 조 는 다음 과 같다.
    +program    //    
        +app                  //      
            +view1            //    1
                -__init__.py  //    ,     ,         
                -view.py      //    1       
            +view2            //    2
            +models           //    
                -model1.py    //          
            +static           //    (css,js,images )
            +templates        //    ,      ,                
            -__init__.py      //  SQLAlchemy   ,   create_app      Flask        
        +log                  //     
        +venv                 //    
        +migrations           //    ,     ,    
        -config.py            //      (   ,   )
        -manage.py            //      
        -run.py               //  app

    5. config.py
    import os
    
    basedir = os.path.abspath(os.path.dirname(__file__))
    
    class Config:
        DEBUG = False
        TESTING = False
        SECRET_KEY = os.environ.get('SECRET_KEY') or \
                     b'\x90\x87d\xcfk\xbd\x81\xa2\\G\xb2\x9a\x8d\xe5\xb5c\xa3\xbd\x85\x8c\x8c\x86\xbc`\x94ZM\xf5\xdaN\x92'
        SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    
        @staticmethod
        def init_app(app):
            pass
    
    class DevelopmentConfig(Config):
        DEBUG = True
        SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
            'sqlite:////database/flaskdb.db'
        SQLALCHEMY_TRACK_MODIFICATIONS = True
    
    class TestingConfig(Config):
        TESTING = True
        SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
            'sqlite:////database/flaskdb.db'
        SQLALCHEMY_TRACK_MODIFICATIONS = True
    
    class ProductionConfig(Config):
        SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
            'mysql://user:password&lp@localhost:3306/flaskdb'
        SQLALCHEMY_TRACK_MODIFICATIONS = True
    
    config = {
        'development':DevelopmentConfig,
        'testing':TestingConfig,
        'production':ProductionConfig,
        'default':DevelopmentConfig,
    }

    6. app/__init__.py
    from flask import Flask, render_template, logging
    from flask_sqlalchemy import SQLAlchemy
    from logging.handlers import TimedRotatingFileHandler
    
    from config import config
    
    db = SQLAlchemy()
    
    def create_app(config_name):
        app = Flask(__name__)
        app.config.from_object(config[config_name])    
        #      
        mylog = TimedRotatingFileHandler('log/mylog.log', 'D')
        mylog.setLevel(logging.DEBUG)
        mylog.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s'))
        app.logger.addHandler(mylog)
        #   DB
        db.init_app(app)
        #    
        from app.view1 import view1 as view1_blueprint
        app.register_blueprint(view1_blueprint, url_prefix='/view1')
        #    ,       
        
        return app

    7. run.py
    import os
    from app import create_app
    
    app = create_app(os.getenv('FLASK_CONFIG') or 'default')
    
    if __name__ == '__main__':
        app.run()

    8. manage.py
    import os
    from app import create_app, db
    from flask_script import Manager
    from flask_migrate import Migrate, MigrateCommand
    
    '''
    manager    :
        :python3 manager.py db [command]
     PyCharm   manager.py     db [command]
    command  :
    init-        (    migrations     ),       
    migrate-      ,    model          ,     
    upgrade-      ,             ,        
    downgrade-      ,            
    '''
    
    app = create_app(os.getenv('FLASK_CONFIG') or 'default')
    migrate = Migrate(app, db)
    manager = Manager(app)
    manager.add_command('db', MigrateCommand)
    manager.run()

    9. model1.py
    from app import db
    
    class Book(db.Model):
        __tablename__ = 'book'
    
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(50), unique=True)
        pub_date = db.Column(db.DateTime)
    
    
        def __init__(self, name):
            self.name = name
    
        def __repr__(self):
            return "" % self.name

    10. app/view1/__init__.py
    from flask import Blueprint
    
    #    
    view1 = Blueprint('view1', __name__)
    from app.view1 import view
    
    #      
    @book.app_template_filter('reverse')
    def reverse_filter(s):
        return s[::-1]
    #        ,       ,            
    @book.context_processor
    def utility_processor():
        rt = dict()
        def format_date(date):
            return date.strftime('%Y{y}%m{m}%d{d}').format(y=' ', m=' ', d=' ')
        rt['formatdate'] = format_date
        def format_date2(date):
            return date.strftime('%Y-%m-%d')
        rt['formatdate2'] = format_date2
        rt['xname'] = 'other strings'
        return rt

    11. app/view1/view.py
    from flask import render_template, flash, current_app
    from app.models.model1 import Book
    from . import view1
    
    @view1.route('/', methods=['GET'])
    def index():
        books = Book.query.all()
        return render_template('book/bookindex.html', books=books)
    
    @view1.route('/index2', method=['GET', 'POST'])
    def index2():
        books = Book.query.all()
        return  render_template('book/bookindex2.html', books=books)

    12. app/templates/book/bookindex.html,layout.html
    layout.html
    
    
    
        
            
        
    
    
    {% with messages = get_flashed_messages(with_categories=true) %}
    {% if messages %}
    
      {% for category, message in messages %}
    • {{ message }}
    • {% endfor %}
    {% endif %} {% endwith %} {% block body %}{% endblock %}
    bookindex.html
    {% extends "book/layout.html" %}
    {% block body %}
    

    첫 페이지

    {%for book in books%}
  • {{ book.name | reverse }}==={{ formatdate(book.pub_date) }}
  • {%endfor%} {% endblock %}

    좋은 웹페이지 즐겨찾기