前提
Django・LINE messagingAPI(SDK)によるチャットボット開発
Django:3.2.8
Pyrhon:3.9.13
実現したいこと
views.pyにて記載のdef sendMessage()を別途、作成した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に移動させるとエラーが発生します。 def sendMessage(): line_bot_api.broadcast(TextSendMessage(text='Hello World!')) sendMessage()
<create_screen.py> from linebot.models import TextSendMessage from bot.views import line_bot_api #上記view.pyに記述していたsendMessage()関数をここに移行しエラーなく実行させたいがImportErrorが発生。 def sendMessage(): line_bot_api.broadcast(TextSendMessage(text='Hello World!')) sendMessage()
試したこと
エラーメッセージの most likely due to a circular import から以下を試しましたが変わりませんでした。
from utils.create_screen import carouselTemplate → *
(反対にcreate_screen.py の import line_bot_api → * )
参考元:https://www.kthksgy.com/python/python-circular-dependency/
※【解決策1】は勉強不足により、本課題に置き換えられず現状試せておりません。
何卒よろしくお願い致します。
回答1件