from flask import Flask, jsonify, request, send_from_directory
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
app = Flask(__name__)
# 设置静态文件目录为 static 文件夹
app.static_folder = 'static'
# 允许所有路由进行跨域请求
CORS(app)
# 数据库配置,使用 SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost/test'
db = SQLAlchemy(app)
# 定义数据库模型类 AmsAttraction
class AmsAttraction(db.Model):
id = db.Column(db.Integer, primary_key=True)
attraction_name = db.Column(db.String(255))
province_city = db.Column(db.String(255))
location = db.Column(db.String(255))
phone = db.Column(db.String(255))
open_hour = db.Column(db.String(255))
introduction = db.Column(db.String(255))
images = db.Column(db.String(255))
add_time = db.Column(db.String(255))
quality_grade = db.Column(db.Integer)
# 路由,用于提供静态文件服务
@app.route('/static/<path:filename>')
def static_files(filename):
return send_from_directory(app.static_folder, filename)
# 路由,获取所有景点数据
@app.route('/')
def get_data():
data = AmsAttraction.query.all()
json_data = [
{
'id': item.id,
'attraction_name': item.attraction_name,
'province_city': item.province_city,
'location': item.location,
'phone': item.phone,
'introduction': item.introduction,
'images': item.images,
'add_time': item.add_time,
'open_hour': item.open_hour,
'quality_grade': item.quality_grade
}
for item in data
]
return jsonify(json_data)
# 路由,向数据库中添加一条新景点数据
@app.route('/addItem', methods=['POST'])
def add_item():
data = request.json
if not data:
return jsonify({'error': '未提供输入数据'}), 400
attraction = AmsAttraction(
attraction_name=data.get('attraction_name'),
province_city=data.get('province_city'),
location=data.get('location'),
phone=data.get('phone'),
open_hour=data.get('open_hour'),
introduction=data.get('introduction'),
images=data.get('images'),
add_time=data.get('add_time'),
quality_grade=data.get('quality_grade')
)
db.session.add(attraction)
db.session.commit()
return jsonify({'message': '数据添加成功'}), 200
# 路由,根据 ID 删除一条景点数据
@app.route('/deleteItem', methods=['GET'])
def delete_item():
id = request.args.get('id')
if not id:
return jsonify({'error': '缺少 ID 参数'}), 400
item = AmsAttraction.query.get(id)
if not item:
return jsonify({'error': '未找到指定 ID 的项目'}), 404
db.session.delete(item)
db.session.commit()
return jsonify({'message': '数据删除成功'}), 200
# 路由,根据 ID 获取一条景点数据
@app.route('/getItem', methods=['GET'])
def get_item():
id = request.args.get('id')
if not id:
return jsonify({'error': '缺少 ID 参数'}), 400
item = AmsAttraction.query.get(id)
if not item:
return jsonify({'error': '未找到指定 ID 的项目'}), 404
json_data = {
'id': item.id,
'attraction_name': item.attraction_name,
'province_city': item.province_city,
'location': item.location,
'phone': item.phone,
'introduction': item.introduction,
'images': item.images,
'add_time': item.add_time,
'open_hour': item.open_hour,
'quality_grade': item.quality_grade
}
return jsonify(json_data), 200
# 路由,修改一条景点数据
@app.route('/modifyItem', methods=['POST'])
def modify_item():
data = request.json
if 'id' not in data or not isinstance(data['id'], int):
return jsonify({'error': '缺少 ID 参数或 ID 参数无效'}), 400
item = AmsAttraction.query.get(data['id'])
if not item:
return jsonify({'error': '未找到指定 ID 的项目'}), 404
if 'attraction_name' in data:
item.attraction_name = data['attraction_name']
if 'province_city' in data:
item.province_city = data['province_city']
if 'location' in data:
item.location = data['location']
if 'phone' in data:
item.phone = data['phone']
if 'open_hour' in data:
item.open_hour = data['open_hour']
if 'introduction' in data:
item.introduction = data['introduction']
if 'images' in data:
item.images = data['images']
if 'add_time' in data:
item.add_time = data['add_time']
if 'quality_grade' in data:
item.quality_grade = data['quality_grade']
db.session.commit()
return jsonify({'message': '数据更新成功'}), 200
# 启动服务
if __name__ == '__main__':
app.run(debug=True)
这段代码是一个基于Flask框架的Python web应用程序,它实现了一个简单的API来管理景点信息。下面是代码的解读:
### 主要功能解读:
1. **应用配置与初始化**:
- 使用`Flask`框架创建应用实例。
- 配置静态文件目录。
- 启用CORS以允许跨域请求。
- 配置SQLAlchemy来连接MySQL数据库。
2. **数据库模型**:
- 定义了`AmsAttraction`类作为数据库模型,包含景点的各种信息字段。
3. **路由定义**:
- `@app.route('/static/<path:filename>')`:提供静态文件服务。
- `@app.route('/')`:获取所有景点数据,并以JSON格式返回。
- `@app.route('/addItem', methods=['POST'])`:接收POST请求,添加新的景点数据。
- `@app.route('/deleteItem', methods=['GET'])`:接收GET请求,通过ID删除指定的景点数据。
- `@app.route('/getItem', methods=['GET'])`:接收GET请求,通过ID获取指定的景点数据。
- `@app.route('/modifyItem', methods=['POST'])`:接收POST请求,修改指定ID的景点数据。
4. **辅助函数**:
- `startService`:启动Flask服务。
- `_addItem`:内部函数,用于添加景点数据到数据库。
该代码提供了一个简单的RESTful API,可以进行基本的CRUD(创建、读取、更新、删除)操作,管理景点信息。