回答ではありません
とりあえず現状の問題点とその対応について、環境構築スクリプトも含めて展開します。
現状の問題点
起動方法が不自然な点
不思議な構成になっている点
原因
(推測)policy未設定により、無署名スクリプト実行が出来ない
__init__.py, main.pyが相互importになっている点と、なぜか相対指定されておらず不思議な位置からimportしている点
2.についてはコメントにある動画内容からそうなっているため
対策
1. power shellのポリシーチェックをバイバスする
元のポリシーを変更せず、一時的にポリシーをバイパスするにはコマンドプロンプトから以下のようにpowershellを起動する
cmd
1 C:\python\hoge>powershell -executionpolicy bypass
2 PS C:\python\hoge> .\env\Scripts\Activate.ps1
3 (env) PS C:\python\hoge> flask
4 Usage: flask [OPTIONS] COMMAND [ARGS]...
5 ...
about_Execution_Policies
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies
2. blueprintを使用する
普通は意味もなく分けるのではなく、ある程度以上のページセットを塊としてルーティングやその内部処理を記述するために、モジュール分割する。flaskではこの塊をblueprintと呼ぶ。逆に言えばblueprintを使うほどでなければ__init__.pyを使っても汚れるだけ。
Blog Blueprint
https://flask.palletsprojects.com/en/2.3.x/tutorial/blog/
対策後ファイル
最後に構築用スクリプトがあるのでコピペは不要
記載のないファイルは変更していない
minhaya_reveiwer/__init__.py
python
1 from flask import Flask
2 def create_app ( ) :
3 app = Flask ( __name__ )
4 from . import main
5 app . register_blueprint ( main . bp )
6 return app
minhaya_reveiwer/main.py
python
1 from flask import Blueprint , render_template
2 bp = Blueprint ( 'main' , __name__ )
3 @bp . route ( "/" )
4 def index ( ) :
5 return render_template ( "index.html" )
6 @bp . route ( "/solve" )
7 def solve ( ) :
8 return render_template ( "solve.html" )
9 @bp . route ( "/manage" )
10 def manage ( ) :
11 return render_template ( "manage.html" )
minhaya_reveiwer/templates/index.html
html
1 <! DOCTYPE html >
2 < html lang = " ja " >
3 < head >
4 < meta charset = " UTF-8 " >
5 < title > QuizReviewer </ title >
6 </ head >
7 < body >
8 < h1 > QuizReviewer </ h1 >
9 < a href = " {{ url_for( ' .solve ' ) }} " > クイズを解く </ a >
10 < a href = " {{ url_for( ' .manage ' ) }} " > クイズの管理 </ a >
11 </ body >
12 </ html >
環境構築スクリプト
venv構築からflaskインストールもまとめて実施。空のディレクトリで実行する
python
1 import os
2 import venv
3 import subprocess
4 ENV = 'env'
5 if os . name == 'posix' :
6 BIN = 'bin'
7 else :
8 BIN = 'Scripts'
9 builder = venv . EnvBuilder ( with_pip = True )
10 builder . create ( ENV )
11 cwd = os . getcwd ( )
12 python = os . path . join ( cwd , ENV , BIN , 'python' )
13 os . environ [ 'VIRTUAL_ENV' ] = os . path . join ( cwd , ENV )
14 os . environ [ 'PATH' ] = os . path . join ( cwd , ENV , BIN ) + os . pathsep + os . environ [ 'PATH' ]
15 p = subprocess . run ( [ python , '-m' , 'pip' , 'install' , '--upgrade' , 'pip' , 'setuptools' ] )
16 p = subprocess . run ( [ python , '-m' , 'pip' , 'install' , 'Flask==2.3.2' , 'Jinja2==3.1.2' ] )
17 app_dir = os . path . join ( cwd , 'minhaya_reveiwer' )
18 templates_dir = os . path . join ( app_dir , 'templates' )
19 os . makedirs ( templates_dir , exist_ok = True )
20 with open ( os . path . join ( app_dir , '__init__.py' ) , 'wt' , encoding = 'utf8' ) as f :
21 f . write ( """\
22 from flask import Flask
23 def create_app():
24 app = Flask(__name__)
25 from . import main
26 app.register_blueprint(main.bp)
27 return app
28 """ )
29 with open ( os . path . join ( app_dir , 'main.py' ) , 'wt' , encoding = 'utf8' ) as f :
30 f . write ( """\
31 from flask import Blueprint, render_template
32 bp = Blueprint('main', __name__)
33 @bp.route("/")
34 def index():
35 return render_template("index.html")
36 @bp.route("/solve")
37 def solve():
38 return render_template("solve.html")
39 @bp.route("/manage")
40 def manage():
41 return render_template("manage.html")
42 """ )
43 with open ( os . path . join ( templates_dir , 'index.html' ) , 'wt' , encoding = 'utf8' ) as f :
44 f . write ( """\
45 <!DOCTYPE html>
46 <html lang="ja">
47 <head>
48 <meta charset="UTF-8">
49 <title>QuizReviewer</title>
50 </head>
51 <body>
52 <h1>QuizReviewer</h1>
53 <a href="{{ url_for('.solve') }}">クイズを解く</a>
54 <a href="{{ url_for('.manage') }}">クイズの管理</a>
55 </body>
56 </html>
57 """ )
58 with open ( os . path . join ( templates_dir , 'manage.html' ) , 'wt' , encoding = 'utf8' ) as f :
59 f . write ( """\
60 <!DOCTYPE html>
61 <html lang="ja">
62 <head>
63 <meta charset="UTF-8">
64 <title>QuizReviewer</title>
65 </head>
66 <body>
67 <h1>QuizReviewer</h1>
68 <a>クイズ管理画面</a>
69 </body>
70 </html>
71 """ )
72 with open ( os . path . join ( templates_dir , 'solve.html' ) , 'wt' , encoding = 'utf8' ) as f :
73 f . write ( """\
74 <!DOCTYPE html>
75 <html lang="ja">
76 <head>
77 <meta charset="UTF-8">
78 <title>QuizReviewer</title>
79 </head>
80 <body>
81 <h1>QuizReviewer</h1>
82 <a>クイズを解く画面</a>
83 </body>
84 </html>
85 """ )
86 p = subprocess . run ( [ python , '-m' , 'flask' , '--app' , 'minhaya_reveiwer' , 'run' ] )