Python inside HTML
Allows you to be able to embed Python within HTML documents, similiar to mod_Python or PHP.
Summary
By taking advantage of both the Module: digiweb and a slightly modified version of PythonInsideHTML.zip from the BSD licensed project Karrigell Python web server to make it a stand alone library. It is possible to run embed Python within a HTML document that can be executed at run time.
Inside HTML
Syntax
By enclosing Python statements within a <% %> tag the Python interpreter will execute said statements. In the following example a "stored_time" variable will be created and will save the time on the local scope.
<% import time %>
<% stored_time = time.strftime("%d:%m:%y",time.localtime(time.time())) %>
If enclosed with <%= %> it will evaluate the statement and replace the tag with the result of the executed statement. In the following example the HTML created will contain the day:month:year from the devices internal clock.
<% import time %>
<%= time.strftime("%d:%m:%y",time.localtime(time.time())) %>
Indentation
Declared Indentation
A file is converted into Python code, which must be indented according to Python rules ; whereas in normal HTML indentation is used only for readability.
So beware if you mix Python and HTML :
1 <% for i in range(10): %>
2 <%= i %>*<%= i %> : <b> <%= i*i %> </b>
This will work because after a loop or a condition the following HTML is automatically indented by PIH.
To decrement indentation, use <% end %> :
1 <% for i in range(10): %>
2 <%= i %>*<%= i %> : <b> <%= i*i %> </b>
3 <% end %>
4 <h3>done</h3>
in this example, "done" will be written after the for loop is finished.
Another example for an if... else... :
1 <% if i: %>
2 output someting
3 <% end %>
4 <% else: %>
5 output someting else
6 <% end %>
7 <h3>done</h3>
(Don't forget the last <% end %> otherwise "done" would have the same indentation as line 5) But this :
1 <% for i in range(10):
2 data= '%s * %s' %(i,i) %>
3 <b> <%= i*i %> </b>
4 <h3>done</h3>
Won't work, because after the print statement on line 2 indentation goes back to 0 (it begins with plain HTML).
The <INDENT> Tag
If you have complex code where Python and HTML are mixed, embed it between the tags <indent> and </indent> :
1 <indent>
2 <% for i in range(10):
3 data= '%s * %s' %(i,i) %>
4 <b> <%= i*i %> </b>
5 </indent>
6 <h3>Table</h3>
7 <table>
8 <tr>
9 <td>A cell</td>
10 </tr>
11 </table>
<indent> means : from now on, and until the matching </indent> tag, use the indentation in PIH source and leave it as it is to produce Python code In the above example, indentation is used until line 5 and ignored afterwards If the <indent> tag itself is indented, the following code is indented relatively to it :
1 <table border=1>
2 <tr>
3 <th>Number</th>
4 <th>Square</th>
5 </tr>
6 <indent>
7 <% for i in range(10): %>
8 <tr>
9 <td><%= i %></td>
10 <td><%= i**2 %></td>
11 </tr>
12 </indent>
13 </table>
In line 7, <% is aligned on <indent> so the Python code will not be indented.
Ending Script
If you want to exit the script before the end of the document, raise a
SCRIPT_END exception raise SCRIPT_END,message
Writing to HTML output
If you want to write to the HTML output without using the evaluating tags you can write directly to the Python code output via
py_code.write( "<H1> Heading </H1>" )
Working example from the Python
For this example we will create a generic handler for a filetype for the web server by using the Module:digiweb.
# test_pih.py
import sys,time,digiweb
sys.path.append("WEB/Python/PythonInsideHTML.zip")
from PythonInsideHTML import PIH
def http_handler(type, path, headers, args):
exec PIH("WEB/Python%s"%(path)).PythonCode()
return (digiweb.TextHtml,py_code.getvalue())
hnd = digiweb.Callback(http_handler)
while (True):
time.sleep(1000)
Now you can just upload a file ending in a via the Python file management section of the webui, then just navigate to http://device_address/filename.
For example uploading the following (template.pih) will demonstrate displaying information about the HTTP request passed to the http_handler. The Python code generated by this script is run on the same scope as the http_handler function so has access to the arguments (type, path, headers, args).
<html><head><title>Request info</title></head>
<body>
<%= type %> request for path '<%= path %>'
<hr>
Headers:
<table border=1 >
<% for h in headers: %>
<tr>
<td> <%= h %> </td> <td> <%= headers[h] %> </td>
</tr>
<% end %>
</table>
<hr>
Args: <%= args %>
<hr>
<hr>
</body>
</html>
Navigating your browser to "http://device_address/template.pih" will give you a page displaying information about the HTTP request.
GET request for path '/template.pih' ________________________________________ Headers: host device_address referer agent Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.48 Safari/525.19 ________________________________________ Args: None ________________________________________
Source
by importing the following module you can use these features: Media:PythonInsideHTML.zip
PDF
