【Python】別のファイルを読み込んでみよう
Pythonでは「別のpyファイル」を読み込んで、そこに記述してある「変数」や「関数」などを使うことができるようです。
今回はその「インポート方法」を見ていきましょう。
別のpyファイルをインポートしてみよう
今回試していく「pyファイル」は「Flask-WTF」を使って「入力フォーム」を作成した時のものを使っていきます。
「Flask-WTF」についてはこちら。
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import InputRequired, Length, AnyOf
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
class LoginForm(FlaskForm):
username = StringField('ユーザー名', validators=[InputRequired(), Length(min=8, max=16, message='8文字以上16文字以下で入力してください')])
password = PasswordField('パスワード', validators=[InputRequired(), AnyOf(values=['password'], message='パスワードが違います')])
@app.route('/form', methods=['GET', 'POST'])
def form():
form = LoginForm()
if form.validate_on_submit():
return '<h1>ユーザー名は {}. パスワードは {}.'.format(form.username.data, form.password.data)
return render_template('form.html', form=form)
if __name__ == "__main__":
app.run(debug=True)
このコードを2つの「pyファイル」に分けて使ってみましょう。
今回の分け方
- 「main.py」メインの部分(Flask)
- 「forms.py」フォームの部分(Flask-WTF)
こんな感じで進めていきます。
pyファイルを分けてみよう
1.main.py
from flask import Flask, render_template
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
@app.route('/', methods=['GET', 'POST'])
def form():
form = LoginForm()
if form.validate_on_submit():
return '<h1>ユーザー名は {}. パスワードは {}.'.format(form.username.data, form.password.data)
return render_template('form.html', form=form)
if __name__ == "__main__":
app.run(debug=True)
2.forms.py
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, HiddenField, SubmitField
from wtforms.validators import InputRequired, Length, AnyOf
class LoginForm(FlaskForm):
username = StringField('ユーザー名', validators=[InputRequired(), Length(min=8, max=16, message='8文字以上16文字以下で入力してください')])
password = PasswordField('パスワード', validators=[InputRequired(), AnyOf(values=['password'], message='パスワードが違います')])
単純に分けてみるとこうなります。
しかしこのままでは動作しませんね。
別のファイルからインポートしよう
今回の場合は「forms.py」ファイルから「LoginForm」クラスをインポートしています。
from flask import Flask, render_template
-------------------------------------------
from forms import LoginForm
-------------------------------------------
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
@app.route('/', methods=['GET', 'POST'])
def form():
form = LoginForm()
if form.validate_on_submit():
return '<h1>ユーザー名は {}. パスワードは {}.'.format(form.username.data, form.password.data)
return render_template('form.html', form=form)
if __name__ == "__main__":
app.run(debug=True)
こうすることで「form」関数内の「form = LoginForm()」が成り立ちますね。
実行してみよう
「VSCode」で実行していきます。
「入力フォーム」に入力してみます。
問題なく動作しているようですね。
まとめ
今回は別の「pyファイル」の読み込みをしてみました。
これを使えば一度書いたコードはどこにでも使えそうですね。
今回は「同じ階層」のファイルをインポートしたのですが「別の階層」だとどうなるのでしょうか。
調べてみたいと思います。
それではまた。