views:

117

answers:

3

I've created a Python script that monitors a logfile for changes (like tail -f) and displays it on a console. I would like to access the output of the Python script in a webbrowser. What would I need to create this? I was thinking about using Django and jQuery. Any tips or examples are greatly appreciated.

+2  A: 

I don't have any Python or Django experience but I'd assume you can make a system call like tail in Python and relay the details.

From there, I'd use a jQuery .ajax() call with a javascript setInterval() loop to your Python script and output the results to a div on the web page. Overall a pretty simple solution.

In this instance, you really wouldn't need to use an open tail -f system call because the nature of the JS setInterval() method, the Python script will be called over and over again until the JS clearInterval() method is called. You'll aggregate your script details in either Python or JS depending where you want to do the work. I'd suggestion Python since you'd have more robust features at your fingertips and you would send less data via the AJAX call. Theoretically, there probably shouldn't be too much logic needed in the jQuery code on the front end. Just display the data.

gurun8
A: 

Why don't you output the data to a HTML file? You could run a cron job to run your script which would in turn spurt out a HTML file which could be accesses from the browser.

Ravi Vyas
My script can already output HTML, but I don't want to 'refresh' to complete page every X seconds.
compie
+4  A: 

First create a python script that monitors the log file for changes. If you only need this for debugging - testing purposes, then it is an overkill to use Django or another web framework. It is very easy to implement Http Web server functionality using sockets. Whenever an Http GET request is coming, serve only the difference from the different request. In order to achieve this you need to store in memory the status of every request coming (e.g.number of last line in the file).

The jQuery part is actually quite easy. Set up a timer with setTimeout function. Something like this will do:

function doUpate() {
  $.ajax({type: "GET", url : tailServiceUrl,
          success: function (data) {
             if (data.length > 4)
             {
                // Data are assumed to be in HTML format
                // Return something like <p/> in case of no updates
                $("#logOutoutDiv").append(data);
             }
             setTimeout("doUpdate", 2000);
           }});
}

setTimeout("doUpdate", 2000);

You can also create callbacks for error and timeout to report a problem with the server.

kgiannakakis
Point of clarification, the setTimeout() function will only call doUpdate() once after 2000 milliseconds. It won't create a loop. If you want it to loop, you'll need to move the setTimeout call into the doUpdate() function, most likely at the very end, or change it to setInterval(). Here's a nice little comparison of both JS functions: http://javascript.about.com/library/blstvsi.htm
gurun8
You are correct, setTimeout must be moved into doUpdate.
kgiannakakis