Python Flask簡易チュートリアル

17779 ワード

1. Why Flask?
  • 公式文書詳細、学習コストが低く、プロジェクトの他のメンバーが迅速に開発に投入するのに有利である
  • フレームワークは軽く、拡張性が高く、使いやすい拡張(extension)
  • がたくさんあります.
  • このフレームワークは、
  • を積極的に維持および開発している.
    2.紹介するFlaskの拡張
  • flask blueprintは、ルーティング
  • を登録、管理するために使用される.
  • flask_restfulは、REST APIs
  • の構築をサポートするために使用される
  • flask_migrateデータベースバージョンの移行を管理するための
  • flask_sqlalchemy ormは、データベース・オブジェクトをマッピングするためのデータ操作方法
  • を提供する.
    3.プロジェクト構造
    - project
    	- user
    		- helpers.py
    		- views.py
    	- migrations
    	- __init__.py
    	- blueprint.py
    	- bootstrap.py
    	- models.py
    

    パス
    機能
    user/
    リソースまたはモジュール、ここではユーザーモジュール
    migrations
    データベース移行ファイル
    user/views.py
    資源に対する要求を処理する(例えばGET,POST)
    user/helpers.py
    モジュールに関連する補助関数__init__.py
    Flask appの初期化
    blueprint.py
    ルート
    bootstrap.py
    appの起動
    models.py
    データベースエンティティのオブジェクト
    4.キーコード
    Flask appの初期化
    # __init__.py
    from flask import Flask
    
    app = Flask(__name__)
    

    ルーティング登録
    2種類のパッケージを使用
  • flask blueprintの一般的なルーティングであり、1つの関数はapi要求
  • に対応する.
    # user/views.py
    @blueprint.route('/password', methods=['PUT'])
    def update_password():
        form = request.get_json(True, True)
        user_id = auth_helper()
        new_pass = form.get("password")
        if not new_pass:
            return jsonify(error="      "), 400
        new_pass = encrypt_helper(new_pass)
        User.patch(user_id=user_id, password=new_pass)
        cookie = request.cookies
        session_id = cookie.get('fat-wallet')
        session.pop(session_id)
        return jsonify(data="ok"), 200
    
  • flask_restful単位はリソースであり、GET、POSTなどのhttpメソッド
  • をサポートする.
    # user/views.py
    class UserResource(Resource):
        def get(self):
            student_id = request.args.get("student_id")
            username = request.args.get("username")
            offset = request.args.get("offset")
            limit = request.args.get("limit")
            users = User.get(student_id=student_id, username=username, offset=offset, limit=limit)
            result = [{"user_id": user.id, "student_id": user.student_id,
                       "username": user.username, "major": user.major,
                       "email": user.email, "phone": user.phone,
                       "avatar": user.avatar.decode() if user.avatar else None} for user in users]
            return dict(data=result, count=len(result)), 200
    

    以上の2つのルーティングをappに登録します
    # blueprint.py
    from backend.user.views import blueprint as user_blueprint
    from backend.user.views import UserResource
    def setup(app):
        api = Api(app)
        app.register_blueprint(user_blueprint, url_prefix='/users')
        api.add_resource(UserResource, '/users/')
    

    マッピングされたデータベースのオブジェクトを定義し、オブジェクトによってデータを操作します.
    # models.py
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:admin@mysql/money'
    db = SQLAlchemy(app)
    migrate = Migrate(app, db)
    
    class MyMixin(object):
        __table_args__ = {
            'mysql_engine': 'InnoDB',
            'mysql_charset': 'utf8mb4',
        }
    
    class User(db.Model, MyMixin):
        __tablename__ = 'users'
        id = db.Column(BIGINT(unsigned=True), primary_key=True)
        student_id = db.Column(db.String(10), unique=True)
        username = db.Column(db.String(20), unique=True, nullable=False)
        password = db.Column(db.String(40), nullable=False)
        major = db.Column(db.String(20))
        email = db.Column(db.String(30), unique=True)
        phone = db.Column(db.String(20), unique=True)
        avatar = db.Column(db.LargeBinary(2**21 - 1))  # 2M
    
    #   model    
    	user = User(username=username, password=pass_md5, email=email)
    	db.session.add(user)
    	db.session.commit()
    

    flask_の使用migrate管理データの移行
    flask db init  #    (  migrations   )
    flask db migrate -m "msg" #      model      ,      
    flask db upgrade id #                  , id        ,   head,     
    flask db history  #       
    

    プロジェクトの実行
    # debug mode
    flask run --host=0.0.0.0
    

    Githubプロジェクトアドレス