166 lines
5.7 KiB
Python
166 lines
5.7 KiB
Python
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("/<page_name>")
|
||
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/<path:path>')
|
||
# 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)
|