d4c82768a8
- helpers.py: _extract_lat, _extract_lon, plan index utilities - dashboard.py: dashboard, run_list, run_detail, run_status_api, start_analysis - pipeline.py: _run_pipeline_worker, _background_process - clustering.py: cluster_overview, cluster_detail, _run_clustering_pipeline, _get_globe_flows - entity.py: entity_profile - upload.py: upload_page, upload_csv, upload_csv_batch, finalize_upload, delete_upload - auto.py: auto_page, run_llm_analysis_view - manual.py: manual_page, manual_run_analysis - globe.py: globe_view, _extract_flows_from_df - config.py: config_view, llm_test - log_viewer.py: log_viewer - tools.py: tool_lab, tool_lab_run, tool_plan, apply_filter, reload_run_data, retry_run All function logic preserved exactly. views/__init__.py re-exports all public functions for backward compatibility with urls.py and run_pipeline.py. Original views.py archived as views_backup.py.
37 lines
1.4 KiB
Python
37 lines
1.4 KiB
Python
"""Log viewer view."""
|
|
from django.shortcuts import render
|
|
from django.http import HttpResponse
|
|
|
|
|
|
def log_viewer(request):
|
|
"""Display last 200 lines of the app log (DEBUG only).
|
|
With ?pos=N, returns text: line_count\\nnew_content for AJAX polling.
|
|
"""
|
|
from django.conf import settings
|
|
if not settings.DEBUG:
|
|
return HttpResponse('Log viewer only available in DEBUG mode', status=403)
|
|
log_path = settings.BASE_DIR / 'logs' / 'tianxuan.log'
|
|
pos = request.GET.get('pos')
|
|
if pos is not None:
|
|
# AJAX polling mode: return new content since byte position
|
|
try:
|
|
pos = int(pos)
|
|
except ValueError:
|
|
pos = 0
|
|
if log_path.exists():
|
|
with open(log_path, 'r', encoding='utf-8') as f:
|
|
total = f.seek(0, 2) # seek to end
|
|
if pos >= total:
|
|
return HttpResponse(f'{total}\n', content_type='text/plain')
|
|
f.seek(pos)
|
|
new_content = f.read()
|
|
return HttpResponse(f'{total}\n{new_content}', content_type='text/plain')
|
|
return HttpResponse('0\n', content_type='text/plain')
|
|
|
|
# HTML page mode
|
|
lines = []
|
|
if log_path.exists():
|
|
with open(log_path, 'r', encoding='utf-8') as f:
|
|
lines = f.readlines()[-200:]
|
|
return render(request, 'tianxuan/log_viewer.html', {'lines': lines})
|