Flask ベースの Web アプリケーションの誕生に関する 7 番目の記事です。この記事は主に組織構造の調整を紹介するもので、興味のある方は参考にしてください。
これで、すべての Py コードが py ファイルに書き込まれます。この方法では、プログラムが責任を持つようになると、開発と保守の両方に多くの問題が発生することは明らかです。
Flask フレームワークはプロジェクトに特定の組織構造の使用を強制するものではないため、ここで使用される組織構造は他のプロジェクトと必ずしも同じではありません。
default.pyのコードによれば、フォームモデル、データモデル、ビューメソッドの3つに大別できるので、モデルもこのカテゴリーで区別されます。したがって、他の言語(Java)から得た経験によれば、各クラスはpyファイルであり、対応するフォルダーに配置されます
単一のファイルでは、マルチ後のすべての設定が単一のファイルに書き込まれます。 -ファイルの再構築では、これを行うのは明らかに不適切であるため、別の設定ファイルを作成する必要があります:
class Config: SECRET_KEY="Niu_blog String" SQLALCHEMY_DATABASE_URI='mysql://root:1234@localhost/cblog' SQLALCHEMY_COMMIT_ON_TEARDOWN=True LOGIN_PROTECTION="strong" LOGIN_VIEW="login"
次に、初期化ファイル (app/__init__.py):
from flask import Flask from flask_bootstrap import Bootstrap from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager import pymysql pymysql.install_as_MySQLdb() from config import Config bootstrap = Bootstrap() db = SQLAlchemy() login_manager=LoginManager(); def create_app(): app = Flask(__name__) app.config.from_object(Config) bootstrap.init_app(app) login_manager.init_app(app) login_manager.session_protection=Config.LOGIN_PROTECTION login_manager.login_view=Config.LOGIN_VIEW db.init_app(app) return app
ブループリントを使用するには、さらなるモジュール化も可能ですブループリントの機能は、asp.net mvc の領域に似ており、さまざまなモジュールのビュー メソッドを統合し、URL によって区別します。 まず、入り口であるインデックス ページがメイン ブループリントとして定義されます。次のように:
メイン フォルダーを作成します
新しいブループリント初期化ファイル __init__.py を作成します
ビュー メソッド ファイル view.py を作成します
エラー ページ ビュー メソッド error.py を作成しますメインのブループリント
初期化ファイルのコードは次のとおりです:
from flask import Blueprint main=Blueprint("main",__name__) # 创建蓝本 from . import errors,views
現在、ビュー メソッド ファイルにはインデックス メソッドが 1 つだけあり、コードは次のとおりです:
from flask import render_template from . import main @main.route("/") def index(): return render_template("index.html",site_name='myblog')
エラー ページのコードは省略されています
メイン ブループリントの URL はプレフィックスを使用しません
その後、ログイン、登録、およびログアウト ページはパーミッション ブループリント (認証) に集中し、パーミッション ブループリントの初期化コードは次のとおりです:
from flask import Blueprint auth=Blueprint("auth",__name__) from . import views
ビューは主に、以前に完了したビュー:
from . import auth from .. import db,login_manager from ..forms.LoginForm import LoginForm(*) from ..models.User import User (*) from flask_login import login_user,logout_user from flask import render_template,flash,redirect,url_for @auth.route("/login",methods=["GET","POST"]) def login(): form = LoginForm() print(url_for("main.index")) if form.validate_on_submit(): username = form.username.data password = form.password.data print(User) user = User.query.filter_by(username=username, password=password).first() if user is not None: login_user(user, form.remember_me.data) print(url_for("main.index")) return redirect(url_for("main.index")) else: flash("您输入的用户名或密码错误") return render_template("/auth/login.html", form=form) # 返回的仍为登录页 return redirect(url_for("main.index")) return render_template("/auth/login.html",form=form) @auth.route("/logout",methods=["GET","POST"]) def logout(): logout_user() return redirect(url_for("main.index")) @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id))
アスタリスクでマークされた 2 行に注意してください。ファイル内にインポートする必要がある py ファイルと py オブジェクトに注意してください。LoginForm ファイルのコードは次のとおりです。
from flask_wtf import FlaskForm from wtforms import StringField,PasswordField,SubmitField,BooleanField from wtforms.validators import DataRequired class LoginForm(FlaskForm): username=StringField("请输入用户名",validators=[DataRequired()]) password=PasswordField("请输入密码") remember_me=BooleanField("记住我") submit=SubmitField("登录")
User ファイルのコードは次のとおりです:
from flask_login import UserMixin from .. import db class User(UserMixin,db.Model): __tablename__="users" id=db.Column(db.Integer,primary_key=True) username=db.Column(db.String(50),unique=True,index=True) password=db.Column(db.String(50)) nickname=db.Column(db.String(50)) email=db.Column(db.String(100)) birthday=db.Column(db.DateTime) gender=db.Column(db.Integer) remark=db.Column(db.String(200)) role_id=db.Column(db.Integer,db.ForeignKey("roles.id"))
flask プラグインのインポート方法が、flask.ext.* から新バージョンで推奨されている flask_* メソッドに変更されていることに注意してください。思い出させてくれたブロガー仲間の Zhi Dian Xiaabaicai に感謝します。
もちろん、最後にブループリントを登録する必要があるため、create_app メソッドの最終的なコードは次のとおりです:
def create_app(): app = Flask(__name__) app.config.from_object(Config) bootstrap.init_app(app) login_manager.init_app(app) login_manager.session_protection=Config.LOGIN_PROTECTION login_manager.login_view=Config.LOGIN_VIEW db.init_app(app) from .main import main as main_blueprint from .auth import auth as auth_blueprint app.register_blueprint(main_blueprint) #无url前缀 app.register_blueprint(auth_blueprint,url_prefix="/auth") #url前缀为/auth return app
最後の変更は、新しい manager.py ファイルを作成し、スタートアップ コードを構成する方法です。
from app import create_app, db from flask_script import Manager,Shell from flask_migrate import Migrate,MigrateCommand from app.models.User import User from app.models.Role import Role import pymysql pymysql.install_as_MySQLdb() app=create_app() manager=Manager(app); migrate = Migrate(app, db) def make_shell_context(): return dict(app=app,db=db,User=User,Role=Role) #注册shell命令 manager.add_command("db", MigrateCommand) #新增db命令用于数据库迁移 manager.add_command("shell" ,Shell(make_context=make_shell_context())) if __name__ =='__main__': manager.run()
最も素朴なメソッドを使用して実行すると、実行結果はdefault.pyのみの場合と同じです。この時のシステムディレクトリは次のとおりです。参考までに:
以上が組織体制調整の具体例(Python)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。