from datetime import datetime import json import os import requests from flask import Flask, render_template, abort, jsonify, request, send_from_directory # 设置 Flask 应用 app = Flask(__name__, static_url_path="", static_folder="static") app.template_folder = "templates" # Strapi API 基础 URL 和 API 令牌 STRAPI_BASE_URL = "http://116.204.119.171:8099" # 请替换为您的 Strapi API 地址 STRAPI_API_TOKEN = "156ac348bb6f633eb2b6ebf58757dceae9b949a2a03fae6ad7ea9a5f49b61cc355bb3447533c0488044cb46f2612a22d15781c0eca1028756637d108cd42d039960ad12bf811642c8491d2c198708fe0ea014d793974b64e1d62c76356950f5546dc24653776f144b5a0c47682bd76a7dfd97cfc7e255ad1d6b10b13f7ffc154" # 请替换为您的实际 API 令牌 # 通用数据请求方法 def fetch_data(endpoint, params=None): """ 从 Strapi 获取数据,使用通用函数来简化请求。 添加异常处理,捕获 JSONDecodeError 并返回 None。 """ headers = {"Authorization": f"Bearer {STRAPI_API_TOKEN}"} try: # 发起 GET 请求 response = requests.get( f"{STRAPI_BASE_URL}/api/{endpoint}", headers=headers, params=params ) # 检查响应是否成功 if response.status_code == 200: try: # 尝试解析 JSON 数据 return response.json() except json.JSONDecodeError: # 如果解析失败,打印错误并返回 None print(f"Error decoding JSON from {endpoint}: {response.text}") return None else: # 如果请求失败,打印错误状态码 print(f"Error fetching {endpoint}: {response.status_code}") return None except requests.exceptions.RequestException as e: # 捕获请求异常,如连接问题等 print(f"Request error: {e}") return None # 动态页面路由 @app.route("/") def render_page(page_name): html_template = page_name htm_template = page_name if os.path.exists(os.path.join(app.template_folder, html_template)): return render_template(html_template) elif os.path.exists(os.path.join(app.template_folder, htm_template)): return render_template(htm_template) else: abort(404) # 动态页面路由 # @app.route('/m/') # def render_page_m(path): # page_path = path # html_template = f"{page_path}" # htm_template = f"{page_path}" # # 检查是否在 templates 目录中存在对应的 HTML 模板文件 # if os.path.exists(os.path.join(app.template_folder, html_template)): # return render_template(html_template) # elif os.path.exists(os.path.join(app.template_folder, htm_template)): # return render_template(htm_template) # # 直接转发到 static 目录中的静态资源文件 # return send_from_directory(app.static_folder, page_path) # 首页路由 - 获取轮播图和新闻内容以渲染首页 @app.route("/info.php-9.html") def info(): type = request.args.get("type") # 通过 fetch_data 获取前 3 条 hxkjnewss 数据,使用 populate 参数来加载关联数据 params = { "pagination[page]": 1, "pagination[pageSize]": 100, "populate": "*", } # 如果获取到的存在就这么做 if type: params["filters[type][$eq]"] = type examples = fetch_data("examples", params=params) if not examples: examples = [] else: examples = examples["data"] # 为每个 data 对象拼接图片属性 for item in examples: # 拼接主要图片的 URL,假设 `img` 是包含图片的字段 item["image_url"] = ( STRAPI_BASE_URL + item["img"][0]["url"] if item.get("img") and item["img"][0].get("url") else None ) # 将提取的数据传递给模板 return render_template("info.php-9.html", examples=examples) # 详情页路由 @app.route("/info_detail") def info_detail(): id = request.args.get("id") # 获取特定 ID 的详细信息 detail = fetch_data(f"examples/{id}", params={"populate": "*"}) if not detail: detail = {} else: detail = detail["data"] detail["image_url"] = ( STRAPI_BASE_URL + detail["img"][0]["url"] if detail.get("img") and detail["img"][0].get("url") else None ) return render_template("info_detail.html", detail=detail) # 首页路由 - 获取轮播图和新闻内容以渲染首页 @app.route("/") def home(): # 通过 fetch_data 获取前 3 条 hxkjnewss 数据,使用 populate 参数来加载关联数据 data = fetch_data( "hnewss", params={"pagination[page]": 1, "pagination[pageSize]": 3, "populate": "*"}, ) # 提取新闻条目的重要字段 news_items = [] if data and "data" in data: for item in data["data"]: created_at = item["createdAt"] created_at_formatted = datetime.strptime( created_at, "%Y-%m-%dT%H:%M:%S.%fZ" ).strftime("%Y-%m-%d") news_item = { "id": item["id"], "title": item["title"], "content": item["content"], "detail": item["detail"], "createdAt": created_at_formatted, # 拼接完整的图片 URL "image_url": ( STRAPI_BASE_URL + item["image"]["url"] if item.get("image") else None ), } news_items.append(news_item) # 将提取的数据传递给模板 return render_template("index.html", news_items=news_items) if __name__ == "__main__": app.run(debug=True)