Djangoの循環インポートエラーの回避について

前提

Django・LINE messagingAPI(SDK)によるチャットボット開発
Django:3.2.8
Pyrhon:3.9.13

実現したいこと

views.pyにベタ書きのSDKを用いたメッセージのコード(プッシュメッセージ・リッチメニュー)を別途作成したutils ディレクトリ 内create_screen.py に移しコードを分離して管理したいが、cannot import のエラーが発生する。

初学者のため不慣れな点多々あるかと存じますが、どうぞ宜しくお願い致します。

発生している問題・エラーメッセージ

ImportError: cannot import name 'line_bot_api' from partially initialized module 'bot.views' (most likely due to a circular import)(/Users/TAK/Desktop/sdk/djangobot/bot/views.py)

該当のソースコード

<views.py> import os from django.http import HttpResponseForbidden, HttpResponse from django.views.decorators.csrf import csrf_exempt from linebot import LineBotApi, WebhookHandler from linebot.exceptions import InvalidSignatureError from linebot.models import MessageEvent, TextMessage from dotenv import load_dotenv from utils.create_screen import * #carouselTemplate load_dotenv() line_bot_api = LineBotApi(os.environ["CHANNEL_ACCESS_TOKEN"]) handler = WebhookHandler(os.environ["CHANNEL_SECRET"]) @csrf_exempt def callback(request): signature = request.META['HTTP_X_LINE_SIGNATURE'] body = request.body.decode('utf-8') try: handler.handle(body, signature) except InvalidSignatureError: HttpResponseForbidden() return HttpResponse('OK', status=200) @handler.add(MessageEvent, message=TextMessage) def handle_image_message(event): line_bot_api.reply_message( event.reply_token, messages = carouselTemplate() )
<create_screen.py> from linebot.models import TextSendMessage from bot.views import line_bot_api def sendMessage(): line_bot_api.broadcast(TextSendMessage(text='Hello World!')) sendMessage()

試したこと

以下の理由が原因と考え、調査したURLの【解決策2】を参考にviews.py の import 部分を書き換えするも変わらず。
from utils.create_screen import carouselTemplate → * 
(反対にcreate_screen.py の import line_bot_api → * )
※【解決策1】は勉強不足により、本課題に置き換えられず現状試せておりません。
https://www.kthksgy.com/python/python-circular-dependency/

循環インポートが原因かと想定しておりますが、そもそもの循環インポートの認識誤っておりましたらご指摘いただけますと幸いです。
→ views. py は create_screen.py より (自作の)carouselTemplate 関数をimport している
対し、create_screen.py は views.py から 変数 line_bot_api を呼び出そうとしているため相互間のインポート(循環インポート)が発生している?
※ line_bot_api : sendMessage関数内に組み込む予定の変数

https://startlab.jp/learning-python/module-error/
こちらの記事を見ると、views自体は自作モジュールではなく、かつファイル名と変数名が同じではないため以下参考の症状とは異なると思われる。

https://ja.stackoverflow.com/questions/77522/cannot-import-name-xxx-from-partially-initialized-moduleの発生条件
こちらは解釈ができず、現在試せておりません。

コメントを投稿

0 コメント