欢迎访问宙启技术站
智能推送

在Python中使用channels.generic.websocket实现实时天气预报展示

发布时间:2023-12-26 19:00:02

在Python中,可以使用channels.generic.websocket模块来实现实时天气预报展示功能。channels.generic.websocket模块是channels库中的一部分,提供了WebSocket的实现,可以用于处理实时通信。

下面是一个使用channels.generic.websocket模块实现实时天气预报展示的示例:

# weather_consumer.py

import json
import asyncio
import websockets

# 创建WebSocket消费者
class WeatherConsumer(websockets.WebSocketConsumer):

    async def connect(self):
        # 和前端建立WebSocket连接
        await self.accept()

    async def disconnect(self, close_code):
        # 断开WebSocket连接
        pass

    async def receive(self, text_data):
        # 处理接收到的消息
        text_data_json = json.loads(text_data)
        city = text_data_json['city']
        
        # 模拟获取天气数据
        # 实际使用时,可以调用天气API获取实时天气数据
        weather_data = {
            'city': city,
            'temperature': 25,
            'humidity': 80,
            'description': 'Cloudy'
        }
        
        # 发送天气数据到前端
        await self.send(text_data=json.dumps(weather_data))

# 启动WebSocket服务
async def weather_server():
    # 创建WebSocket路由
    websocket_urlpatterns = [
        # 定义WebSocket的路径和消费者类
        websockets.route('/ws/weather/', WeatherConsumer.as_asgi()),
    ]
    
    # 创建WebSocket应用
    application = websockets.ProtocolTypeRouter({
        'websocket': websockets.URLRouter(websocket_urlpatterns),
    })
    
    # 运行WebSocket服务
    await websockets.serve(application, 'localhost', 8000)

# 异步运行WebSocket服务
asyncio.get_event_loop().run_until_complete(weather_server())

上面的示例代码定义了一个WeatherConsumer类,继承自websockets.WebSocketConsumer。在connect方法中,建立WebSocket连接;在disconnect方法中,断开WebSocket连接;在receive方法中,处理接收到的消息,并返回相应的天气数据。

weather_server是一个异步函数,用于启动WebSocket服务。在这个函数中,定义了WebSocket的路径和消费者类,并创建了WebSocket应用。最后,调用websockets.serve函数来运行WebSocket服务。

要使用这个示例,首先需要安装channels库和websockets库:

pip install channels websockets

然后,在终端中运行python weather_consumer.py来启动WebSocket服务。

接下来,可以编写一个前端页面来连接WebSocket并展示实时天气数据:

<!-- index.html -->

<!DOCTYPE html>
<html>
<head>
    <title>Real-time Weather</title>
</head>
<body>
    <h1>Real-time Weather</h1>
    <form id="weatherForm">
        <input type="text" id="cityInput" placeholder="Enter city name">
        <input type="submit" value="Get Weather">
    </form>
    <div id="weatherData"></div>

    <script>
        // 创建WebSocket连接
        const socket = new WebSocket('ws://localhost:8000/ws/weather/');

        // 监听WebSocket连接事件
        socket.onopen = function(event) {
            console.log('WebSocket connected');
        };

       // 监听WebSocket消息事件
        socket.onmessage = function(event) {
            const weatherData = JSON.parse(event.data);
            const weatherContainer = document.getElementById('weatherData');

            // 渲染天气数据
            weatherContainer.innerText = City: ${weatherData.city}
Temperature: ${weatherData.temperature}°C
Humidity: ${weatherData.humidity}%
Description: ${weatherData.description};
        };

        // 监听WebSocket关闭事件
        socket.onclose = function(event) {
            console.log('WebSocket disconnected');
        };

        // 监听表单提交事件
        const form = document.getElementById('weatherForm');
        form.addEventListener('submit', function(event) {
            event.preventDefault();
            const cityInput = document.getElementById('cityInput');
            const city = cityInput.value;

            // 发送城市名到WebSocket服务器
            socket.send(JSON.stringify({
                'city': city
            }));
        });
    </script>
</body>
</html>

上面的代码中,通过调用new WebSocket('ws://localhost:8000/ws/weather/')来创建WebSocket连接。通过监听onopen事件可以知道WebSocket连接是否成功建立。通过监听onmessage事件可以接收到从服务器发送过来的天气数据,并将数据展示在页面上。

在表单中输入城市名,并点击Get Weather按钮,前端会将城市名发送到WebSocket服务器,服务器会处理这个消息,并返回天气数据到前端显示。

要使用这个前端页面,可以将上面的代码保存为index.html文件,并在浏览器中打开这个文件。

通过以上示例,可以实现一个简单的实时天气预报展示功能。实际使用时,可以将WeatherConsumer类中的receive方法改为调用天气API获取实时天气数据,并将实时天气数据发送到前端展示。