
利用Flask、requests框架构建Web应用和发送HTTP请求
在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页面
在根目录创建static文件夹(app.py 第17行)
在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>
运行
运行app.py
在5000端口(默认)进入web