yf_yzl 2 년 전
부모
커밋
a9eb9f3a7f
6개의 변경된 파일146개의 추가작업 그리고 4개의 파일을 삭제
  1. 23 1
      apps/Weather/models.py
  2. 37 1
      apps/Weather/views.py
  3. 6 0
      bigdataAPI/settings.py
  4. 2 1
      bigdataAPI/urls.py
  5. 72 0
      crond_script/weather_history.py
  6. 6 1
      uwsgi.ini

+ 23 - 1
apps/Weather/models.py

@@ -33,4 +33,26 @@ class ServerDayData(models.Model):
     content = models.TextField("天气")
 
     class Meta:
-        db_table = "server_day_data"
+        db_table = "server_day_data"
+
+
+class AddressInfo(models.Model):
+
+    id = models.AutoField("ID", primary_key=True)
+    cityid = models.CharField("城市ID", max_length=64, blank=True, null=True)
+    province = models.CharField("省", max_length=64, blank=True, null=True)
+    city = models.CharField("市", max_length=64, blank=True, null=True)
+    district = models.CharField("区", max_length=64, blank=True, null=True)
+
+    class Meta:
+        db_table = "address_info"
+
+
+class HistoryData(models.Model):
+    id = models.AutoField("ID", primary_key=True)
+    timestamp = models.PositiveIntegerField("时间戳", default=0)
+    cityid = models.PositiveIntegerField("地址ID", default=0)
+    content = models.TextField("天气")
+
+    class Meta:
+        db_table = "history_data"

+ 37 - 1
apps/Weather/views.py

@@ -1,7 +1,7 @@
 from rest_framework.views import APIView
 from rest_framework.response import Response
 from django.contrib.auth import authenticate
-from apps.Weather.models import DayData, ServerDayData
+from apps.Weather.models import DayData, ServerDayData, AddressInfo, HistoryData
 from apps.UserApp.models import MyUser
 
 import logging
@@ -98,6 +98,42 @@ class GetWeather(APIView):
             return Response({"msg": "请联系管理员", "code": "50001"})
         
 
+def HistoryAPIView(APIView):
+
+    def post(self, request):
+        data = request.data
+        timestamp = data.get("timestamp") 
+        province = data.get("province")
+        city = data.get("city")
+        district = data.get("district")
+        district = AddressInfo.objects.filter(province=province, city=city, district=district)
+        if district:
+            cityid = district.first().cityid
+        else:
+            msg = f"地区:{district} 取不到,使用 {province} {city} 取"
+            logging.warning(msg)
+            city = AddressInfo.objects.filter(province=province, city=city)
+            if city:
+                cityid = city.first().cityid
+            else:
+                return Response({"msg": "暂无数据", "code": 500})
+        # 去历史表中查询数据
+        try:
+            history_data = HistoryData.objects.get(cityid=cityid, timestamp=timestamp)
+            content = history_data.content
+            low_heigh = json.loads(content)
+            return Response(
+                {
+                    "data": [low_heigh["yWendu"], low_heigh["bWendu"]],
+                    "province": province,
+                    "city": city,
+                    "district": district
+                }
+            )
+        except Exception as e:
+            return Response({"msg": "暂无指定城市数据", "code": 500})
+        
+
 class TestAPI(APIView):
 
     def post(self, request):

+ 6 - 0
bigdataAPI/settings.py

@@ -173,3 +173,9 @@ REST_FRAMEWORK = {
 JWT_AUTH = {
     'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
 }
+
+
+# 历史天气接口URL
+HISTORY_WEATHER_URL = "https://v0.yiketianqi.com/api?version=history&"
+HISTORY_WEATHER_APPID = "73341114"  # 73341114  69334222
+HISTORY_WEATHER_APPSECRET = "gCneL6mr"  # gCneL6mr  2u4bHXHD

+ 2 - 1
bigdataAPI/urls.py

@@ -15,7 +15,7 @@ Including another URLconf
 """
 from django.contrib import admin
 from django.urls import path, include
-from apps.Weather.views import GetWeather, TestAPI
+from apps.Weather.views import GetWeather, TestAPI, HistoryAPIView
 from apps.DeviceCount.views import CbdPhotoCount
 
 urlpatterns = [
@@ -26,6 +26,7 @@ urlpatterns = [
     path('pestanalysis/', include('apps.PestAnalysis.urls')),
     path('qxzconfig/', include('apps.QxzApp.urls')),
     path("yf_weather", GetWeather.as_view(), name="weather"),
+    path("yf_weather_history", HistoryAPIView.as_view(), name="history_weather"),
     path("test", TestAPI.as_view(), name="test"),
     path("cbd_count/", CbdPhotoCount.as_view(), name="cbd_count")
 ]

+ 72 - 0
crond_script/weather_history.py

@@ -0,0 +1,72 @@
+import requests
+import datetime
+import json
+import os
+import sys
+from weather import all_city
+import logging
+import django
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+sys.path.append(BASE_DIR)
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bigdataAPI.settings')
+django.setup()
+from django.conf import settings
+from apps.Weather.models import HistoryData, AddressInfo, DayData
+
+
+# 配置日志级别和格式
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
+file_handler = logging.FileHandler('/data/weather/history.log')
+file_handler.setLevel(logging.INFO)
+# 创建一个格式化程序,用于定义日志消息的显示方式
+formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
+file_handler.setFormatter(formatter)
+# 将文件处理器添加到根日志记录器中
+logging.getLogger('').addHandler(file_handler)
+
+
+def add_address_info_data():
+    address = AddressInfo.objects.all().count()
+    if not address:
+        day_data = DayData.objects.all()
+        for day in day_data:
+            AddressInfo.objects.get_or_create(
+                cityid = day.cityid,
+                defaults={
+                    "cityid": day.cityid,
+                    "province": day.province,
+                    "city": day.city,
+                    "district": day.district
+                }
+            )
+    else:
+        logging.warning("address_info 已存在数据")
+
+
+def history_data():
+    url = settings.HISTORY_WEATHER_URL
+    appid = settings.HISTORY_WEATHER_APPID
+    appsecret = settings.HISTORY_WEATHER_APPSECRET
+    address = AddressInfo.objects.all().values("cityid")
+    for i in address[:1]:
+        cityid = i.get("cityid")
+        for y in [2022, 2023]:
+            for m in range(1,13):
+                response = requests.get(url=f"{url}appid={appid}&appsecret={appsecret}&cityid={cityid}&year={y}&month={m}")
+                result = json.loads(response.text)
+                for k in result["data"]:
+                    ymd = k["ymd"]
+                    timestamp = datetime.datetime.strptime(ymd, "%Y-%m-%d").timestamp()
+                    HistoryData.objects.get_or_create(
+                        timestamp = timestamp,
+                        cityid = cityid,
+                        defaults={
+                            "timestamp":timestamp,
+                            "cityid": cityid,
+                            "content": str(k)
+                        }
+                    )
+
+
+if __name__ == "__main__":
+    history_data()

+ 6 - 1
uwsgi.ini

@@ -29,7 +29,12 @@ enable-threads=true
 post-buffering=4096
 # 设置日志目录
 daemonize=/data/bigdataAPI/uwsgi/uwsgi.log
-
+# 启用日志按日期分割
+log-date = %Y-%m-%d
+# 设置日志备份文件的名称格式
+log-backupname = /data/bigdataAPI/uwsgi/uwsgi.{date}.log
+# 设置日志保留的时间(7天)
+log-keep = 7
 
 harakiri=3600
 http-timeout=3600