ホームページ  >  記事  >  バックエンド開発  >  組織体制調整の具体例(Python)

組織体制調整の具体例(Python)

Y2J
Y2Jオリジナル
2017-04-26 11:17:081590ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。