| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- from flask import Blueprint, render_template, request, jsonify
- from flask_login import login_required
- from app import db
- from app.models import SpiderSource
- bp = Blueprint('source', __name__, url_prefix='/spider-source')
- @bp.route('/dashboard')
- @login_required
- def dashboard():
- return render_template('spider_management.html')
- @bp.route('/api/list', methods=['GET'])
- @login_required
- def get_sources():
- sources = SpiderSource.query.all()
- return jsonify([{
- 'id': s.id,
- 'name': s.name,
- 'code_identifier': s.code_identifier,
- 'description': s.description,
- 'status': s.status,
- 'type': s.type,
- 'url': s.url,
- 'created_at': s.created_at.strftime('%Y-%m-%d %H:%M:%S')
- } for s in sources])
- @bp.route('/api/get/<int:source_id>', methods=['GET'])
- @login_required
- def get_source(source_id):
- s = SpiderSource.query.get(source_id)
- if not s:
- return jsonify({'error': 'Source not found'}), 404
- return jsonify({
- 'id': s.id,
- 'name': s.name,
- 'code_identifier': s.code_identifier,
- 'description': s.description,
- 'status': s.status,
- 'type': s.type,
- 'url': s.url,
- 'method': s.method,
- 'headers': s.headers,
- 'params': s.params,
- 'search_param_key': s.search_param_key,
- 'selectors': s.selectors,
- 'has_pagination': s.has_pagination,
- 'pagination_param': s.pagination_param,
- 'pagination_step': s.pagination_step,
- 'pagination_start': s.pagination_start
- })
- @bp.route('/api/save', methods=['POST'])
- @login_required
- def save_source():
- data = request.json
- source_id = data.get('id')
-
- if source_id:
- source = SpiderSource.query.get(source_id)
- if not source:
- return jsonify({'error': 'Source not found'}), 404
- else:
- # Check uniqueness
- if SpiderSource.query.filter_by(code_identifier=data.get('code_identifier')).first():
- return jsonify({'error': 'Code identifier already exists'}), 400
- source = SpiderSource()
- db.session.add(source)
- try:
- source.name = data.get('name')
- source.code_identifier = data.get('code_identifier')
- source.description = data.get('description')
- source.type = data.get('type', 'script')
-
- if source.type == 'generic':
- source.url = data.get('url')
- source.method = data.get('method', 'GET')
- source.headers = data.get('headers')
- source.params = data.get('params')
- source.search_param_key = data.get('search_param_key', 'q')
- source.selectors = data.get('selectors')
-
- source.has_pagination = data.get('has_pagination', False)
- source.pagination_param = data.get('pagination_param')
- source.pagination_step = int(data.get('pagination_step', 10))
- source.pagination_start = int(data.get('pagination_start', 0))
-
- db.session.commit()
- return jsonify({'message': 'Source saved successfully'})
- except Exception as e:
- db.session.rollback()
- return jsonify({'error': str(e)}), 500
- @bp.route('/api/delete/<int:source_id>', methods=['POST'])
- @login_required
- def delete_source(source_id):
- source = SpiderSource.query.get(source_id)
- if not source:
- return jsonify({'error': 'Source not found'}), 404
-
- # Check if used by tasks
- if source.tasks.count() > 0:
- return jsonify({'error': 'Cannot delete source with existing tasks'}), 400
-
- db.session.delete(source)
- db.session.commit()
- return jsonify({'message': 'Source deleted'})
- @bp.route('/api/toggle/<int:source_id>', methods=['POST'])
- @login_required
- def toggle_source(source_id):
- source = SpiderSource.query.get(source_id)
- if not source:
- return jsonify({'error': 'Source not found'}), 404
-
- source.status = 'disabled' if source.status == 'active' else 'active'
- db.session.commit()
- return jsonify({'message': 'Status updated', 'status': source.status})
|