質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.36%

djangoのカスタムコマンドファイルにAPIで取得したデータを埋め込みたい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 862

score 21

Djangoを使って、登録されたEメールアドレスにメールを送るアプリを製作中で、livedoorの天気情報サイトから天気予報を取得してメールの本文に入れたいと思っているのですが、ターミナルで『python3 manage.py send_mail』と入力すると、下記のようなエラー文が出てしまいます。
send_mail.pyはmanagementフォルダのcommandsフォルダに入っており、APIを使わなければ問題なく動作します。
解決法を教えていただきたいです。
よろしくお願いします。

バージョンは
python 3.7.3
django 2.2.5
MacOS Mojave 10.14.6 です。

Traceback (most recent call last):
File "manage.py", line 21, in <module>
main()
File "manage.py", line 17, in main
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.7/site-packages/django/core/management/init.py", line 381, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.7/site-packages/django/core/management/init.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 323, in run_from_argv
self.execute(*args, cmd_options) File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 364, in execute output = self.handle(*args, options)
File "/Users/(個人情報)/Desktop/weathermail/weathermailapp/management/commands/send_mail.py", line 49, in handle
data = requests.get(url, params=query_params).json()
File "/usr/local/lib/python3.7/site-packages/requests/models.py", line 897, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/init.py", line 348, in loads
return _default_decoder.decode(s)
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

###send_mail.py

from django.core.management.base import BaseCommand
import schedule
import time
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
import ssl
from django.contrib.auth import get_user_model
User = get_user_model()
import requests



url = 'http://weather.livedoor.com/forecast/webservice/json/v1?'


class Command(BaseCommand):

    def handle(self, *args, **kwargs):

        FROM_ADDRESS = 'appofweathermail@gmail.com'
        MY_PASSWORD = 'weathermail8310'
        #TO_ADDRESS = user.email    
        BCC = ''
        SUBJECT = '今日の天気予報です。'
        #BODY = '送信テストです'


        def create_message(from_addr, to_addr, bcc_addrs, subject, body):
            msg = MIMEText(body)
            msg['Subject'] = subject
            msg['From'] = from_addr
            msg['To'] = to_addr
            msg['Bcc'] = bcc_addrs
            msg['Date'] = formatdate()
            return msg


        def send(from_addr, to_addrs, msg):
            #context = ssl.create_default_context()
            smtpobj = smtplib.SMTP_SSL('smtp.gmail.com', 465, timeout=10)
            smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
            smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
            smtpobj.close()


        for user in User.objects.all():
            query_params = {'city': user.location}
            data = requests.get(url, params=query_params).json()

            to_addr = user.email
            subject = SUBJECT
            #body = BODY
            body = data['forecasts'][0]['telop']



            msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
            send(FROM_ADDRESS, to_addr, msg)

            schedule.every(1/60).minutes.do(send, FROM_ADDRESS, to_addr, msg)

        while True:
            schedule.run_pending()
            time.sleep(1)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る