source_routes.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. from flask import Blueprint, render_template, request, jsonify
  2. from flask_login import login_required
  3. from app import db
  4. from app.models import SpiderSource
  5. bp = Blueprint('source', __name__, url_prefix='/spider-source')
  6. @bp.route('/dashboard')
  7. @login_required
  8. def dashboard():
  9. return render_template('spider_management.html')
  10. @bp.route('/api/list', methods=['GET'])
  11. @login_required
  12. def get_sources():
  13. sources = SpiderSource.query.all()
  14. return jsonify([{
  15. 'id': s.id,
  16. 'name': s.name,
  17. 'code_identifier': s.code_identifier,
  18. 'description': s.description,
  19. 'status': s.status,
  20. 'type': s.type,
  21. 'url': s.url,
  22. 'created_at': s.created_at.strftime('%Y-%m-%d %H:%M:%S')
  23. } for s in sources])
  24. @bp.route('/api/get/<int:source_id>', methods=['GET'])
  25. @login_required
  26. def get_source(source_id):
  27. s = SpiderSource.query.get(source_id)
  28. if not s:
  29. return jsonify({'error': 'Source not found'}), 404
  30. return jsonify({
  31. 'id': s.id,
  32. 'name': s.name,
  33. 'code_identifier': s.code_identifier,
  34. 'description': s.description,
  35. 'status': s.status,
  36. 'type': s.type,
  37. 'url': s.url,
  38. 'method': s.method,
  39. 'headers': s.headers,
  40. 'params': s.params,
  41. 'search_param_key': s.search_param_key,
  42. 'selectors': s.selectors,
  43. 'has_pagination': s.has_pagination,
  44. 'pagination_param': s.pagination_param,
  45. 'pagination_step': s.pagination_step,
  46. 'pagination_start': s.pagination_start
  47. })
  48. @bp.route('/api/save', methods=['POST'])
  49. @login_required
  50. def save_source():
  51. data = request.json
  52. source_id = data.get('id')
  53. if source_id:
  54. source = SpiderSource.query.get(source_id)
  55. if not source:
  56. return jsonify({'error': 'Source not found'}), 404
  57. else:
  58. # Check uniqueness
  59. if SpiderSource.query.filter_by(code_identifier=data.get('code_identifier')).first():
  60. return jsonify({'error': 'Code identifier already exists'}), 400
  61. source = SpiderSource()
  62. db.session.add(source)
  63. try:
  64. source.name = data.get('name')
  65. source.code_identifier = data.get('code_identifier')
  66. source.description = data.get('description')
  67. source.type = data.get('type', 'script')
  68. if source.type == 'generic':
  69. source.url = data.get('url')
  70. source.method = data.get('method', 'GET')
  71. source.headers = data.get('headers')
  72. source.params = data.get('params')
  73. source.search_param_key = data.get('search_param_key', 'q')
  74. source.selectors = data.get('selectors')
  75. source.has_pagination = data.get('has_pagination', False)
  76. source.pagination_param = data.get('pagination_param')
  77. source.pagination_step = int(data.get('pagination_step', 10))
  78. source.pagination_start = int(data.get('pagination_start', 0))
  79. db.session.commit()
  80. return jsonify({'message': 'Source saved successfully'})
  81. except Exception as e:
  82. db.session.rollback()
  83. return jsonify({'error': str(e)}), 500
  84. @bp.route('/api/delete/<int:source_id>', methods=['POST'])
  85. @login_required
  86. def delete_source(source_id):
  87. source = SpiderSource.query.get(source_id)
  88. if not source:
  89. return jsonify({'error': 'Source not found'}), 404
  90. # Check if used by tasks
  91. if source.tasks.count() > 0:
  92. return jsonify({'error': 'Cannot delete source with existing tasks'}), 400
  93. db.session.delete(source)
  94. db.session.commit()
  95. return jsonify({'message': 'Source deleted'})
  96. @bp.route('/api/toggle/<int:source_id>', methods=['POST'])
  97. @login_required
  98. def toggle_source(source_id):
  99. source = SpiderSource.query.get(source_id)
  100. if not source:
  101. return jsonify({'error': 'Source not found'}), 404
  102. source.status = 'disabled' if source.status == 'active' else 'active'
  103. db.session.commit()
  104. return jsonify({'message': 'Status updated', 'status': source.status})