在Python中,Flask和requests是两个流行的框架,分别用于构建Web应用和发送HTTP请求。要添加这些框架到你的项目中,你需要确保它们已经被安装在你的Python环境中。以下是如何安装和添加这些框架的步骤:

安装Flask和requests

首先,你需要安装Flask和requests。这通常通过pip来完成,pip是Python的包管理工具。打开你的命令行界面(在Windows上是CMD或PowerShell,在macOS或Linux上是终端),然后输入以下命令:

pip install Flask requests

如果你使用的是Python的虚拟环境(推荐),你应该先激活你的虚拟环境,然后再运行上面的命令。虚拟环境可以帮助你为每个项目隔离依赖项,避免版本冲突。

在项目中使用Flask和requests

一旦Flask和requests被安装,你就可以在你的Python代码中导入并使用它们了。下面是一个简单的例子,展示了如何在你的Flask应用中导入并使用requests库来发送HTTP请求:

创建app.py

# 导入Flask库,用于创建Web应用
from flask import Flask, request, jsonify, send_from_directory
# 导入requests库,用于发送HTTP请求
import requests

# 创建一个Flask应用实例
app = Flask(__name__)

# 设置高德API的密钥,请替换为您实际的高德API密钥
api_key = '6ea9079afb6a5b3a19ebe1765e018691'  # 请替换为您的高德API密钥


# 定义路由,当用户访问根路径时返回index.html页面
@app.route('/')
def index():
    # 使用send_from_directory方法发送静态目录下的index.html文件
    return send_from_directory('static', 'index.html')


# 定义路由,当用户发送POST请求到/get_weather时执行get_weather函数
@app.route('/get_weather', methods=['POST'])
def get_weather():
    # 从请求中获取名为city_adcode的表单数据
    city_adcode = request.form.get('city_adcode')
    # 构造查询天气的URL,其中city为城市编码,key为API密钥
    url = f'https://restapi.amap.com/v3/weather/weatherInfo?city={city_adcode}&key={api_key}'
    # 发送GET请求到高德API获取天气信息
    outputs = requests.get(url)

    # 判断请求是否成功
    if outputs.status_code == 200:
        # 将响应内容解析为JSON格式
        weather_dict = outputs.json()
        # 检查返回的数据中是否包含'lives'字段,并且该字段不为空
        if 'lives' in weather_dict and weather_dict['lives']:
            # 获取'lives'字段中的第一个元素,即天气数据
            lives_l = weather_dict['lives']
            # 判断获取到的天气数据是否为字典类型
            if isinstance(lives_l[0], dict):
                # 获取天气数据中的城市、天气状况和温度信息
                w_data = lives_l[0]
                city = w_data.get('city', 'N/A')
                weather = w_data.get('weather', 'N/A')
                temperature = w_data.get('temperature', 'N/A')
                # 将获取到的天气信息以JSON格式返回
                return jsonify({'city': city, 'weather': weather, 'temperature': temperature})
            else:
                # 如果天气数据不是字典类型,返回错误信息
                return jsonify({'error': '输入的城市编码无效'})
        else:
            # 如果'lives'字段不存在或为空,返回错误信息
            return jsonify({'error': '数据格式有误,请检查输入的城市编码'})
    else:
        # 如果请求失败,返回错误信息
        return jsonify({'error': '请求失败,请重试'})

    # 当脚本作为主程序运行时,启动Flask应用


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

注释说明:

  • 导入Flask库:Flask是一个轻量级的Web应用框架,用于构建Web应用程序。

  • 导入requests库:requests是一个用于发送HTTP请求的Python库。

  • 创建Flask应用实例:使用Flask类创建一个Web应用实例。

  • 设置API密钥:将高德API的密钥存储在变量api_key中,请替换为实际的密钥。

  • 定义路由/:当用户访问应用的根路径时,返回静态目录下的index.html页面。

  • 定义路由/get_weather:当用户发送POST请求到/get_weather时,执行get_weather函数,用于获取指定城市的天气信息。

  • get_weather函数中,首先从请求中获取城市编码,然后构造查询天气的URL,并使用requests库发送GET请求到高德API。

  • 检查请求的响应状态码是否为200,表示请求成功。

  • 将响应内容解析为JSON格式,并检查返回的数据中是否包含有效的天气信息。

  • 如果获取到有效的天气信息,将其中的城市、天气状况和温度以JSON格式返回。

  • 如果天气数据无效或请求失败,返回相应的错误信息。

  • 在脚本的最后,使用if name == '__main__':判断该脚本是否作为主程序运行,如果是,则启动Flask应用,并设置debug=True以开启调试模式。

创建web页面

  1. 在根目录创建static文件夹(app.py 第17行)

  2. 在static文件夹创建index.html

<!DOCTYPE html>  
<html lang="en">  
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>天气查询</title>  
</head>  
<body>
    <h1>天气查询</h1>
    <input type="text" id="city_adcode" placeholder="请输入城市编码">
    <button onclick="getWeather()">查询天气</button>
    <div id="weatherResult"></div>  
    <script>
     // 定义一个函数,用于获取天气信息  
    function getWeather() {  
        // 获取输入框中用户输入的城市编码  
        var city_adcode = document.getElementById('city_adcode').value;  
        // 创建一个新的XMLHttpRequest对象,用于发送HTTP请求  
        var xhr = new XMLHttpRequest();  
        // 设置请求的方式为POST,请求的目标URL为'/get_weather',并设置请求为异步  
        xhr.open('POST', '/get_weather', true);  
        // 设置请求头的Content-Type为'application/x-www-form-urlencoded',这表示请求体中的数据将被编码为URL参数  
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  
        // 绑定onreadystatechange事件处理函数,当请求的状态改变时,该函数将被调用  
        xhr.onreadystatechange = function() {  
            // 检查请求是否完成且响应状态码为200(成功)  
            if (xhr.readyState === 4 && xhr.status === 200) {  
                // 将响应的文本数据解析为JSON对象  
                var data = JSON.parse(xhr.responseText);  
                // 检查返回的数据中是否有error字段  
                if (data.error) {  
                    // 如果有error字段,则将错误信息显示在页面中  
                    document.getElementById('weatherResult').innerText = data.error;  
                } else {  
                    // 如果没有error字段,则显示查询到的天气信息  
                    document.getElementById('weatherResult').innerText = `您查询的城市为${data.city}\n${data.city}的天气为${data.weather}\n${data.city}的气温为${data.temperature}`;  
                }  
            }  
        };  
        // 发送请求,请求体为'city_adcode='后接用户输入的城市编码  
        xhr.send('city_adcode=' + city_adcode);  
    }
    </script>  
</body>  
</html>

运行

  1. 运行app.py

  2. 在5000端口(默认)进入web