まえがき
昨年、私は自分でPythonを詳しく知り、後でそれを使ってPHPに移行することにしました。 現時点では、私の道はWeb開発です。したがって、私はWebの側面、特に利用可能なフレームワークとプロジェクトのレビューから新しい言語を学び始めました。 TurboGears、web2py、Djangoの機能に精通していた私は、まだ「トレンド」に負けてDjangoの世界に飛び込んできました。
ほぼ1年間、私は正直に彼と友達になろうとしました。 彼はいくつかの簡単なプロジェクトを書きましたが、フレームワークの極悪さはおびえ、「バッテリー」の豊富さは選択を混乱させ、いくつかの制限を我慢したくありませんでした。 私の魂は簡潔さと曖昧さを必要とし、最終的に私はフラスコに精通するようになりました。 フレームワークと関連プロジェクト(Jinja2、Werkzeug)のドキュメントを研究した後、私はイデオロギーに触発され、フレームワークを詳しく研究し始めました。
フラスコは、拡張可能なマイクロフレームワークとして配置されます。 これは、必要最小限の機能のみが存在することを意味しますが、同時に、拡張機能を通じてプロジェクトに必要なレベルに追加する機能もあります。
この叙事詩は、Flaskとその拡張機能を使用した私の経験であり、むしろ、ほぼすべてのレベルのプロジェクトを作成する際に役立つロシア語で何かをまとめる試みです。
構造と構成
各プロジェクトでは、以下に説明する典型的な構造を順守しています。 Djangoプログラマーにとっては、すべてが非常に簡単で馴染みのあるものです。
app/ --commands/ --migrations/ --static/ --templtaes/ --app.py --config.py --forms.py --manage.py --models.py --views.py
- コマンドディレクトリには、manage.pyモジュールで接続されているアプリケーションを処理するためのコマンドが含まれています。
- 移行ディレクトリ- 移行のファイルと構成。 通常、移行の初期化時に自動的に作成されます。
- 静的ディレクトリ-プロジェクトリソース:js、css、scss、pictures。
- カタログテンプレート -テンプレート。
- app.pyファイルはアプリケーションのヘッドモジュールであり、ここで基本設定が決定され、拡張機能が登録され、Webサーバーも実装します。
- manage.pyファイルは、プロジェクトの管理と保守に使用されます。
- config.pyファイルには、アプリケーション構成オブジェクトが含まれています。 Flaskはさまざまな方法で構成できますが、オブジェクトに基づいた最も便利な方法のように思えました。 簡略化された形式では、ファイルの内容は次のようになります。
config.pyimport os basedir = os.path.abspath(os.path.dirname(__file__)) class Config(object): DEBUG = False CSRF_ENABLED = True WTF_CSRF_SECRET_KEY = 'dsofpkoasodksap' SECRET_KEY = 'zxczxasdsad' SQLALCHEMY_DATABASE_URI = 'mysql+mysqlconnector://webuser:web_password@localhost/webuser_db' class ProductionConfig(Config): DEBUG = False class DevelopConfig(Config): DEBUG = True ASSETS_DEBUG = True
そして、そのアプリケーションは次のとおりです。
app.pyapp.config.from_object('config.DevelopConfig')
大規模なプロジェクトの場合、公式ドキュメントでは、機能をいわゆるブループリント( Flaskアプリケーションに構造的に類似したモジュール)に分割し、プロジェクトをPythonパッケージに編成することを推奨しています。 しかし、今日はそれについてではありません。
拡張機能
Flask-SQLAlchemy
深刻なアプリケーションはすべてデータベースを使用します。 この拡張機能は、Pythonで最も人気のあるORMライブラリであるSQLAlchemyとFlaskに対応しており、サポートされているDBMSを使用したり、Djangoと同様にPythonオブジェクトにテーブルをマッピングしたりできます。 ただし、SQLAlchemyはORMなしでも実行できます。
使用する
# config.py class Config(object): ... # DSN SQLALCHEMY_DATABASE_URI = 'mysql+mysqlconnector://webuser:web_password@localhost/webuser_db' # app.py # from flask.ext.sqlalchemy import SQLAlchemy # db = SQLAlchemy(app) # models.py from app import db # User - users class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), unique=True, nullable=False) password = db.Column(db.String(255))
ドキュメント: pythonhosted.org/Flask-SQLAlchemy
フラスコスクリプト
プロジェクトを提供するスクリプトのサポートを追加します:開発サーバーの起動、データベースの移行、cronタスクなど。 推奨事項に従って、サービスごとに必要なすべてのコマンドが追加された各プロジェクトのmanage.pyファイルを作成します。 デフォルトのrunserverコマンドが使用可能です 。 コマンドの起動は次のとおりです。
$ python manage.py command <action> $ python manage.py runserver $ python manage.py db migate
たとえば、パッケージに含まれるCommandクラスの子孫を実装し、それをマネージャに登録することにより、コマンドを追加できます。 コマンドにはアクション(サブコマンド)を含めることができ、コマンドラインパラメーターを渡すことができます。
manage.py
from flask.ext.script import Manager from flask.ext.migrate import Migrate, MigrateCommand from app import app, db from models import * migrate = Migrate(app, db) # manager = Manager(app) # , Command manager.add_command('db', MigrateCommand) if __name__ == '__main__': manager.run()
ドキュメント: flask-script.readthedocs.org/en/latest
フラスコ移行
SQLAlchemy ORMの移行を設定できます。 このパッケージには、上記のFlask-Script拡張機能と組み合わせて使用できるMigrateCommandクラスが用意されています。 移行を使用するには、コマンド(上記の例)を接続し、 manage.py db initを実行して初期初期化を実行し、このコマンドのmigrate、upgrade、downgradeアクションを使用して移行を管理する必要があります。 manage.py db helpを実行すると、チームのアクションのリストとその簡単な説明を取得できることに注意してください 。
ドキュメント: flask-migrate.readthedocs.org/en/latest
フラスコ-wtf
WTFormsへのバインディングを実装します-フォームを操作するための素晴らしいライブラリです。 繰り返しになりますが、Djangoに類似しています。 ボックス内:フィールドクラスとそれらのバリデーター、継承、ネストされたフォームなどの強固なセット。
forms.py
from flask_wtf import Form from wtforms import StringField, PasswordField, TextAreaField, SelectField from wtforms.validators import Email, DataRequired, EqualTo class LoginForm(Form): email = StringField('E-mail', validators=[Email(), DataRequired()]) password = PasswordField('', validators=[DataRequired()]) class RegistrationForm(LoginForm): password_repeat = PasswordField(' ', validators=[DataRequired(), EqualTo('password')])
SQLAlchemyモデルに基づいてフォームを作成するためのwtforms-alchemy拡張機能もあります。 最近彼に出会ったので、まだ仕事の経験はありません。 ただし、Djangoとの類推はここでも適用できると思います。
ドキュメント: flask-wtf.readthedocs.org/en/latest
フラスコログイン
承認およびユーザーセッションの基本的なサポートを追加します。 この拡張機能を接続するには多くのアクションが必要なので、できるだけ簡潔にするようにし、ユーザーのログインとログアウトの実装をスキップします。
Flask-Loginの使用
# app.py # from flask.ext.login import LoginManager, current_user # "" login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = 'login' # , Id, None. . @login_manager.user_loader def load_user(userid): from models import User return User.query.get(int(userid)) # before_request, - @app.before_request def before_request(): g.user = current_user # models.py class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), unique=True, nullable=False) password = db.Column(db.String(255)) # User, def is_authenticated(): return True def is_active(): return True def is_anonymous(): return False def get_id(self): return str(self.id)
ドキュメント: flask-login.readthedocs.org/en/latest
フラスコ暗号化
パスワードをハッシュおよびチェックする機能を追加します。
models.py
from flask.ext.bcrypt import generate_password_hash, check_password_hash class User(db.Model): ... def check_password(self, password): return check_password_hash(self.password, password) @staticmethod def hash_password(password): return generate_password_hash(password)
フラスコアセット
Flaskはwebassetsライブラリと友達になり、プロジェクトリソースで作業するのを非常にエレガントにします。 リソースをパッケージに結合し、scss(sass)以下をコンパイルし、jsとcssを縮小し、それらをテンプレートで簡単に接続する方法を知っています。
使用する
# app.py # from flask.ext.assets import Environment, Bundle assets = Environment(app) # js = Bundle('jquery.js', 'jquery.file-upload.js', filters='jsmin', output='assets/jquery-min.js') css = Bundle('main.css', 'form.css', 'flashes.css', filters='cssmin', output='assets/all-min.css') assets.register('js_all', js) assets.register('css_all', css) # templates/index.html {% assets "js_all" %} <script type="text/javascript" src="{{ ASSET_URL }}"></script> {% endassets %} {% assets "css_all" %} <link rel="stylesheet" href="{{ ASSET_URL }}"> {% endassets %}
Bundleでfiltersパラメータを指定することにより、パッケージファイルに指定されたフィルターを強制的に通過させます。 この場合、ファイルは縮小されて1つにマージされます。 一部のフィルターでは、追加のPythonモジュールのインストールが必要になります。
パラメーターASSETS_DEBUG = Trueが構成で設定されている場合、パッケージファイルはフィルターを通過せずに接着され、各ファイルのテンプレートに個別のURLが生成されます。
PS十分な数のリソースがある場合、パッケージ(バンドル)を形成し、それらを別のファイル(assets.pyなど)に登録するための機能を使用する必要があります。
ドキュメント: flask-assets.readthedocs.org/en/latest
Flask-DebugToolbar
便利なデバッガなしでどのような開発が行われますか? この拡張機能は、Djangoから移植されたデバッグパネルと包括的なリクエスト情報を追加します。 構成でDEBUG = Trueが指定されている場合、パネルが表示されます。
app.py
# config.py class Config(object): ... # cookie SECRET_KEY = 'xv3gavkxc04n3mzx7oksd6q' # app.py # from flask_debugtoolbar import DebugToolbarExtension # dtb = DebugToolbarExtension(app)
ドキュメント: flask-debugtoolbar.readthedocs.org/en/latest
結論の代わりに
この記事では、私のプロジェクトで使用した拡張機能を紹介しますが、これはFlaskに既に存在するものの完全なリストではありません。 関連する拡張機能のより包括的なリストは、 flask.pocoo.org / extensionsのフレームワークの公式Webサイトで入手できます。
追加
ユーザーdanSamara は 、Flaskのアプリケーションスケルトンのプロジェクトを指しました。このプロジェクトには、説明した多くの拡張機能とFlask-Cacheキャッシング、bootstrap3のテーマが含まれ、スケルトン自体はpythonパッケージとして設計され、ブループリントを使用しています。 とても良いことです。 ;-)