1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

天気予報を教えるWebサイトを作ってみたい!

Posted at

こんにちは!
最近は成果物作成意欲(?)がすごいので
どんどん作っていってPythonとGitに慣れていこうと思います!

今回は天気予報Webページを作成します!

どういうもの?

翌日の天気予報を見ることができるWebページを作成します
PythonとHTMLを使用して作っていきます!

どんな感じで作っていくの?

今回もGitHubに保存しながらやっていきます
①準備とプロジェクトのセットアップ
②バックエンドの基礎を作成する
③天気予報取得の機能を実装する
④フロントエンドを作成する
⑤バックエンドとフロントエンドを連携させる
以上の5ステップで作成していきます!
プロジェクトのセットアップなどについては
前回と一緒なので割愛します!

バックエンドの基礎を作成

webサーバーのコードを書いていきます

webサーバーのコード

webサーバーのコード
from flask import Flask

# Flaskアプリの本体を作成
app = Flask(__name__)

# ルートURL ("/") にアクセスがあったときに実行される関数を定義
@app.route('/')
def home():
    return "天気予報アプリへようこそ!"

# このファイルが直接実行された場合にのみ、Webサーバーを起動
if __name__ == '__main__':
    app.run(debug=True)

ちょっとだけコードの解説をすると
"from flask import Flask" → Flaskの読み込み
"app = Flask(name)" → Flaskを使ってWebサーバー本体を作成
"@app.route('/')" → トップページにアクセスが来たときにhome() 関数を実行
"if name == 'main'" → 開発用のWebサーバーを起動するための文
って感じですね(Markdown記法に吸われて正しいコードが書けてない...)
ここから天気予報取得の機能を実装していきます!

天気予報取得の機能を実装

PythonでOpenWeatherMapのAPIに問い合わせて天気予報データを
取得する機能をapp.pyを作成してそこに追加していきます!

まず、.gitignoreを作成します
これはGitにこのファイルは無視してほしいというもので
この後、openweathermapからAPIキーを保存しておくための
ファイルを作成しますが、そのAPIキーがGitHubに
アップロードされるのを防ぐものになります
めちゃ大事です

次はAPIキーを保存しておくためのconfig.pyファイルを作成します

configファイルの中身
API_KEY = "APIキーをここに貼り付け"

そして先ほど書いたapp.py(Webサーバーのコード)を少し書き換えます!

app.py(ver2)
import requests
from flask import Flask, jsonify
from config import API_KEY # config.py から API_KEY を読み込む

app = Flask(__name__)

@app.route('/')
def home():
    # APIに問い合わせる都市名
    city_name = "Tokyo"
    
    # OpenWeatherMapのAPIエンドポイントURL
    # units=metric: 温度を摂氏に
    # lang=ja: 表示を日本語に
    api_url = f"http://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={API_KEY}&units=metric&lang=ja"
    
    # APIにリクエストを送って、結果を取得する
    response = requests.get(api_url)
    
    # 結果をJSON形式に変換する
    data = response.json()
    
    # 変換したデータをブラウザに表示する
    return jsonify(data)

if __name__ == '__main__':
    app.run(debug=True)

動かして確認します!

こんな感じであればOK!
{
"base": "stations",
  "clouds": { "all": 75 },
  "cod": 200,
  "coord": { "lat": 35.6895, "lon": 139.6917 }
}

ここまでで一旦GitHubに保存します

フロントエンドを作成

初のHTML...
うまくできるかな...
とりあえずやってみます!!

HTMLファイルを置くためのフォルダを作成する

まずは保管用のフォルダを作成します
(FlaskはHTMLファイルを特定の場所で管理するようになっているらしい)
今回はtemplatesというフォルダを作成しました

全体図
weather_app/
├── app.py
├── config.py
├── .gitignore
├── README.md
└── templates

HTMLファイルを作成する

templatesフォルダの中にindex.htmlというファイルを作成します
その中に以下のコードを書きます

HTMLファイル
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>天気予報アプリ</title>
    <style>
        body { font-family: sans-serif; background-color: #f0f4f8; color: #333; max-width: 600px; margin: 40px auto; padding: 20px; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }
        h1 { color: #005a9c; }
        form { margin-bottom: 20px; }
        input[type="text"] { padding: 10px; width: 70%; border: 1px solid #ccc; border-radius: 4px; }
        input[type="submit"] { padding: 10px 15px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
        .weather-info { background-color: #fff; padding: 20px; border-radius: 4px; }
    </style>
</head>
<body>
    <h1>天気予報アプリ</h1>
    <form action="/" method="post">
        <input type="text" name="city" placeholder="都市名を入力 (例: London)">
        <input type="submit" value="天気を調べる">
    </form>

    {% if weather_data %}
    <div class="weather-info">
        <h2>{{ weather_data.name }}の天気</h2>
        <p>天気: {{ weather_data.weather[0].description }}</p>
        <p>気温: {{ weather_data.main.temp }} °C</p>
        <p>体感温度: {{ weather_data.main.feels_like }} °C</p>
        <p>湿度: {{ weather_data.main.humidity }} %</p>
    </div>
    {% endif %}

</body>
</html>

form action="/" method="post":ユーザーが入力した情報を、このアプリのトップページ(/)にpostという方法で送信するためのフォーム

input type="text" name="city":ユーザーが都市名を入力するテキストボックス
(name="city"という名前が重要で、後でPython側がこの名前を使って入力内容を受け取る)

{% if weather_data %} や {{ weather_data.name }}:これらはFlaskのテンプレートエンジン(Jinja2)の特殊な記法

{% ... %}:if文のような制御文を書く場所

{{ ... }}: 変数を表示する場所

app.pyを修正してHTMLを表示させる

以下のコードが最終版です!

app.py(ver3)
import requests
from flask import Flask, render_template, request
from config import API_KEY

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def home():
    weather_data = None
    if request.method == 'POST':
        city_name = request.form.get('city')
        api_url = f"http://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={API_KEY}&units=metric&lang=ja"
        
        response = requests.get(api_url)
        if response.status_code == 200:
            weather_data = response.json()

    return render_template('index.html', weather_data=weather_data)

if __name__ == '__main__':
    app.run(debug=True)

できた!!

image.png

こんな感じで殺風景ですが、できました!
試しに地点を入れてみましょう!

image.png

おー!!すごい!!
HTMLすごいなぁ...
これは色々バージョンアップできそうですね!
今度こそこれをアップデートしていく気持ちで
さらに勉強していきます!

まとめ

今回はPythonとHTMLを使用して天気予報Appを作ってみました!
これは色々アップデートができるような気がしています...
なんか便利機能を追加してみたい気がする...
思いついたらアップデートをしていこうと思います!
次はゲーム作りたいなぁ...
作り方調べてやってみます!!
それではまた次回!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?