功能说明
- A网站:用户可以通过表单输入嫌疑人信息,这些信息会被存储在内存中,并通过API接口返回。
- B网站:通过API接口接收从A网站同步过来的嫌疑人数据,并显示这些数据。
- 主应用:使用
APScheduler
每隔1分钟从A网站获取嫌疑人数据,并更新到B网站。
技术原理
1. Flask 框架
Flask 是一个轻量级的Web应用框架,基于Python语言。它提供了简单的API和强大的扩展机制,适合快速开发小型到中型的Web应用。
路由:Flask使用装饰器(如@app.route)来定义URL路由和对应的处理函数。
模板渲染:使用Jinja2模板引擎来动态生成HTML页面。
请求处理:通过request对象获取HTTP请求的数据,通过jsonify函数返回JSON响应。
2. APScheduler
APScheduler(Advanced Python Scheduler)是一个Python的定时任务调度库,支持多种调度方式,如定时任务、间隔任务等。
BackgroundScheduler:在后台运行的调度器,不会阻塞主线程。
Job:定义具体的任务,可以设置触发器(如间隔、定时等)。
3. Requests 库
Requests 是一个用于发送HTTP请求的Python库,简单易用,支持多种HTTP方法(GET、POST等)。
GET 请求:用于从服务器获取数据。
POST 请求:用于向服务器发送数据。
4. HTML 和 Jinja2 模板
HTML 是标准的网页标记语言,用于构建网页结构。
Jinja2 是Flask默认的模板引擎,用于动态生成HTML页面。
模板变量:在HTML模板中使用{{ variable }}来插入变量值。
条件语句和循环:使用{% if %}和{% for %}等语法来控制模板的逻辑。
用到的工具
1. Python
Python 是一种高级编程语言,广泛用于Web开发、数据分析、人工智能等领域。项目中使用Python编写所有的后端逻辑和定时任务。
2. Flask
Flask 是一个轻量级的Web框架,用于构建A网站和B网站。
3. APScheduler
APScheduler 是一个定时任务调度库,用于管理从A网站获取数据并更新B网站的定时任务。
4. Requests
Requests 是一个HTTP请求库,用于从A网站获取数据和向B网站发送数据。
5. Jinja2
Jinja2 是Flask默认的模板引擎,用于动态生成HTML页面。
具体实现
1. A网站
Flask应用:使用Flask创建一个Web应用,提供用户输入嫌疑人信息的表单和显示当前嫌疑人列表的页面。
API接口:提供一个API接口(/api/suspects),返回当前的嫌疑人数据。
2. B网站
Flask应用:使用Flask创建一个Web应用,接收从A网站同步过来的嫌疑人数据并显示。
API接口:提供一个API接口(/api/suspects),接收从A网站发送的嫌疑人数据。
3. 定时任务
APScheduler:使用APScheduler创建一个定时任务,每隔1分钟从A网站获取嫌疑人数据并更新到B网站。
Requests:使用Requests库发送HTTP请求,从A网站获取数据并发送到B网站。
通过这种方式,用户可以在A网站输入嫌疑人信息,这些信息将通过定时任务同步到B网站并在B网站上显示。
创建一个完整的项目,其中包括A网站和B网站的简单实现,以及一个定时任务来从A网站获取数据并更新B网站。我们将使用Flask框架来构建这两个网站,并使用APScheduler
来管理定时任务
使用Flask框架来构建这两个网站,并使用APScheduler
来管理定时任务。
A网站和B网站都具有输入信息的文本框和接收文本信息的显示功能。这样用户可以在A网站输入嫌疑人信息,并通过定时任务将这些信息同步到B网站,B网站则显示这些信息。
项目的完整目录结构,包括A网站和B网站的HTML模板文件:
my_project/
│
├── app.py # 主应用文件
├── config.py # 配置文件
├── tasks.py # 定时任务脚本
├── site_a/ # A网站的目录
│ ├── __init__.py # 空文件,使site_a成为一个包
│ ├── app.py # A网站的Flask应用
│ └── templates/ # A网站的HTML模板
│ └── index.html
├── site_b/ # B网站的目录
│ ├── __init__.py # 空文件,使site_b成为一个包
│ ├── app.py # B网站的Flask应用
│ └── templates/ # B网站的HTML模板
│ └── index.html
└── requirements.txt# 依赖包列表
文件内容
config.py
# config.py
class Config:A_SITE_URL = 'http://localhost:5000/api/suspects'B_SITE_URL = 'http://localhost:5001/api/suspects'UPDATE_INTERVAL = 60 * 1 # 每1分钟更新一次
site_a/app.py
# site_a/app.py
from flask import Flask, render_template, request, jsonifyapp = Flask(__name__)suspects = []@app.route('/', methods=['GET', 'POST'])
def index():if request.method == 'POST':name = request.form['name']id_card = request.form['id_card']suspects.append({"name": name, "id_card": id_card})return render_template('index.html', suspects=suspects)@app.route('/api/suspects', methods=['GET'])
def get_suspects():return jsonify(suspects)if __name__ == '__main__':app.run(port=5000)
site_a/templates/index.html
<!-- site_a/templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>A Website</title>
</head>
<body><h1>Input Suspect Information</h1><form method="post"><label for="name">Name:</label><input type="text" id="name" name="name" required><br><br><label for="id_card">ID Card:</label><input type="text" id="id_card" name="id_card" required><br><br><button type="submit">Submit</button></form><h2>Suspect List</h2><ul>{% for suspect in suspects %}<li>Name: {{ suspect.name }}, ID Card: {{ suspect.id_card }}</li>{% endfor %}</ul>
</body>
</html>
site_b/app.py
# site_b/app.py
from flask import Flask, request, jsonify, render_templateapp = Flask(__name__)suspects = []@app.route('/api/suspects', methods=['POST'])
def post_suspects():global suspectsdata = request.jsonsuspects.extend(data)return jsonify({"status": "success", "message": "Suspects data received"})@app.route('/', methods=['GET'])
def index():return render_template('index.html', suspects=suspects)if __name__ == '__main__':app.run(port=5001)
site_b/templates/index.html
<!-- site_b/templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>B Website</title>
</head>
<body><h1>Suspect List</h1><ul>{% for suspect in suspects %}<li>Name: {{ suspect.name }}, ID Card: {{ suspect.id_card }}</li>{% endfor %}</ul>
</body>
</html>
tasks.py
# tasks.py
import requests
from config import Configdef fetch_suspects_from_a():response = requests.get(Config.A_SITE_URL)if response.status_code == 200:return response.json()else:raise Exception(f'Failed to fetch suspects from A site: {response.status_code}')def send_suspects_to_b(suspects):response = requests.post(Config.B_SITE_URL, json=suspects)if response.status_code != 200:raise Exception(f'Failed to send suspects to B site: {response.status_code}')def update_suspects():try:suspects = fetch_suspects_from_a()send_suspects_to_b(suspects)print("Suspects data updated successfully.")except Exception as e:print(f"Error updating suspects data: {e}")
app.py
# app.py
from flask import Flask
from apscheduler.schedulers.background import BackgroundScheduler
from config import Config
from tasks import update_suspectsapp = Flask(__name__)# 初始化调度器
scheduler = BackgroundScheduler()# 添加定时任务
scheduler.add_job(func=update_suspects, trigger="interval", seconds=Config.UPDATE_INTERVAL)@app.route('/')
def index():return "Hello, this is the data synchronization service."if __name__ == '__main__':# 启动调度器scheduler.start()try:app.run(debug=True, port=5002)except (KeyboardInterrupt, SystemExit):# 关闭调度器scheduler.shutdown()
requirements.txt
Flask==2.3.2
requests==2.31.0
apscheduler==3.9.1
运行你的应用
确保你的虚拟环境已激活,然后在命令行中分别启动A网站、B网站和主应用:
-
启动A网站:
cd site_a python app.py
-
启动B网站:
cd site_b python app.py
-
启动主应用:
python app.py
现在,应用正在运行,并且每1分钟会自动执行一次从A网站获取嫌疑人数据并更新B网站的任务。用户可以在A网站输入嫌疑人信息,这些信息将通过定时任务同步到B网站并在B网站上显示。
弊端:会一直在传送,后续进行代码修改
网站数据自动交换,flask框架