回答編集履歴

9

 

2022/11/28 11:56

投稿

退会済みユーザー
test CHANGED
@@ -71,4 +71,4 @@
71
71
  return render_template('entries/top_page.html', registration_data=entries)
72
72
  ```
73
73
 
74
- (試せていないので、上記で正常に動くこと保証できません)
74
+ (試せていないので、上記で正常に動くかどうかわかりません)

8

 

2022/11/28 11:55

投稿

退会済みユーザー
test CHANGED
@@ -39,7 +39,6 @@
39
39
 
40
40
  # 追記内容について
41
41
 
42
- 断片的なコードだけでは何とも言えませんが、[開示されているコード部分を見る限りでは]実行時に動的に内容が定まると推測される変数(「application」)の属性(「config」)を、インポート時に静的に評価される部分で期待通りに取得しようとするのは無理があると思います。
43
42
 
44
43
  下記のように、実行時に、必要な部分で内容を読みだし、設定するようにしてみてはいかがでしょうか。
45
44
  ## DB

7

 

2022/11/28 11:54

投稿

退会済みユーザー
test CHANGED
@@ -39,7 +39,7 @@
39
39
 
40
40
  # 追記内容について
41
41
 
42
- 断片的なコードだけでは何とも言えませんが、[開示されているコード部分を見る限りでは]実行時に動的に内容が定まると推測される変数(「application」)の属性(「table_name)を、インポート時に静的に評価される部分で期待通りに取得しようとするのは無理があると思います。
42
+ 断片的なコードだけでは何とも言えませんが、[開示されているコード部分を見る限りでは]実行時に動的に内容が定まると推測される変数(「application」)の属性(「config」)を、インポート時に静的に評価される部分で期待通りに取得しようとするのは無理があると思います。
43
43
 
44
44
  下記のように、実行時に、必要な部分で内容を読みだし、設定するようにしてみてはいかがでしょうか。
45
45
  ## DB

6

 

2022/11/28 11:53

投稿

退会済みユーザー
test CHANGED
@@ -42,7 +42,7 @@
42
42
  断片的なコードだけでは何とも言えませんが、[開示されているコード部分を見る限りでは]実行時に動的に内容が定まると推測される変数(「application」)の属性(「table_name」等)を、インポート時に静的に評価される部分で期待通りに取得しようとするのは無理があると思います。
43
43
 
44
44
  下記のように、実行時に、必要な部分で内容を読みだし、設定するようにしてみてはいかがでしょうか。
45
- ## Model
45
+ ## DB
46
46
  ```python
47
47
  from pynamodb.models import Model
48
48
  from pynamodb.attributes import UnicodeAttribute

5

追記

2022/11/28 11:52

投稿

退会済みユーザー
test CHANGED
@@ -36,3 +36,40 @@
36
36
  # 略
37
37
  return 'hello world'
38
38
  ```
39
+
40
+ # 追記内容について
41
+
42
+ 断片的なコードだけでは何とも言えませんが、[開示されているコード部分を見る限りでは]実行時に動的に内容が定まると推測される変数(「application」)の属性(「table_name」等)を、インポート時に静的に評価される部分で期待通りに取得しようとするのは無理があると思います。
43
+
44
+ 下記のように、実行時に、必要な部分で内容を読みだし、設定するようにしてみてはいかがでしょうか。
45
+ ## Model
46
+ ```python
47
+ from pynamodb.models import Model
48
+ from pynamodb.attributes import UnicodeAttribute
49
+
50
+ class DB(Model):
51
+ class Meta:
52
+ pass
53
+
54
+ def init_db():
55
+ DB.Meta.table_name = application.config.get('TABLE_NAME')
56
+ DB.Meta.region = application.config.get('AWS_REGION')
57
+ DB.Meta.aws_access_key_id = application.config.get('AWS_ACCESS_KEY_ID')
58
+ DB.Meta.aws_secret_access_key = application.config.get('AWS_SECRET_ACCESS_KEY')
59
+
60
+ partition_key = UnicodeAttribute(hash_key=True, null=False)
61
+ ```
62
+
63
+ ## View
64
+ ```python
65
+ from sub import DB
66
+
67
+ @application.route('/', methods=['GET'])
68
+ def top_page():
69
+ DB.init_db()
70
+ entries = DB_Training.scan()
71
+ entries = sorted(entries, key=lambda x: x.partition_key, reverse=True)
72
+ return render_template('entries/top_page.html', registration_data=entries)
73
+ ```
74
+
75
+ (試せていないので、上記で正常に動くことは保証できません)

4

 

2022/11/27 05:59

投稿

退会済みユーザー
test CHANGED
@@ -2,11 +2,11 @@
2
2
  main 内で sub がインポートされ、
3
3
  その sub 内で sub2 がインポートされ、
4
4
  その sub2 内で DB クラスが読み込まれます。
5
- そしてこの段階で自動的に
5
+ そしてDB クラスが読み込まれる段階で自動的に
6
6
  ```
7
7
  table_name = current_app.config['table_name']
8
8
  ```
9
- が評価されますが、このタイミングでは current_app が空っぽのため、上記のエラーが発生しているのだと思われます。
9
+ が評価(「実行」)されますが、このタイミングでは current_app が空っぽのため、上記のエラーが発生しているのだと思われます。
10
10
   
11
11
  アプリ全体における、sub2 にて定義している `DB` の使われ方が質問文に全く示されていないので何とも言えませんが
12
12
  あくまで現状のコードの限りでは、下記のように必要なときに table_name を設定すればよいのではないのでしょうか。

3

 

2022/11/27 05:59

投稿

退会済みユーザー
test CHANGED
@@ -1,11 +1,15 @@
1
- 起動時に
1
+ 質問文記載のコードでは、起動時に
2
2
  main 内で sub がインポートされ、
3
3
  その sub 内で sub2 がインポートされ、
4
- その sub2 内で DB クラスが読み込まれますが、
4
+ その sub2 内で DB クラスが読み込まれます
5
+ そしてこの段階で自動的に
6
+ ```
7
+ table_name = current_app.config['table_name']
8
+ ```
5
- このタイミングでは current_app が空っぽのため、上記のエラーが発生しているのだと思われます。
9
+ が評価されますが、このタイミングでは current_app が空っぽのため、上記のエラーが発生しているのだと思われます。
6
-
10
+  
7
11
  アプリ全体における、sub2 にて定義している `DB` の使われ方が質問文に全く示されていないので何とも言えませんが
8
- あくまで現状のコードの限りでは、下記のように**必要なときに table_name を設定すればよい**のではないのでしょうか。
12
+ あくまで現状のコードの限りでは、下記のように必要なときに table_name を設定すればよいのではないのでしょうか。
9
13
 
10
14
  sub2.py
11
15
  ```python

2

 

2022/11/27 05:14

投稿

退会済みユーザー
test CHANGED
@@ -1,9 +1,11 @@
1
+ 起動時に
1
- main で sub インポート、
2
+ mainで sub インポートされ
2
- その sub内 で sub2 インポート、
3
+ その sub 内で sub2 インポートされ
4
+ その sub2 内で DB クラスが読み込まれますが、
3
- その sub2 内で DB クラスを読み込んでいますが、このタイミングでは current_app が空っぽのため失敗していると思われます。
5
+ このタイミングでは current_app が空っぽのため、上記のエラーが発生しているのだと思われます。
4
6
 
5
7
  アプリ全体における、sub2 にて定義している `DB` の使われ方が質問文に全く示されていないので何とも言えませんが
6
- あくまで現状のコードの限りでは、下記のように**必要なときに table_name を設定すればい**のではないのでしょうか。
8
+ あくまで現状のコードの限りでは、下記のように**必要なときに table_name を設定すればい**のではないのでしょうか。
7
9
 
8
10
  sub2.py
9
11
  ```python
@@ -25,7 +27,8 @@
25
27
 
26
28
  @application_sub.route('/')
27
29
  def top_page():
28
- DB.initdb() # 追加(たとえばここでDBを使いたいというとき)
30
+ DB.initdb() # 追加(たとえばここ以降でDBを使いたいというとき)
29
- # 以下DBを使った処理
31
+ # 以下DBを使った処理。詳細は質問文に記載がないため不明。
32
+ # 略
30
33
  return 'hello world'
31
34
  ```

1

 

2022/11/27 05:12

投稿

退会済みユーザー
test CHANGED
@@ -25,6 +25,7 @@
25
25
 
26
26
  @application_sub.route('/')
27
27
  def top_page():
28
- DB.initdb() # 追加
28
+ DB.initdb() # 追加(たとえばここでDBを使いたいというとき)
29
+ # 以下DBを使った処理
29
30
  return 'hello world'
30
31
  ```