If you just want to display text on a webpage from a Python script, a simple way to print to a web page is shown in the script below:
#!/usr/bin/python print "Content-type: text/plain\n" print "Hello world"
If you want to display HTML code, you can use Python code like the following:
#!/usr/bin/python print "Content-type: text/html" print print """<!DOCTYPE HTML> <html lang="en"> <body> <h1>Hello World!</h1> </body> </html> """
In Python, Triple quotes, i.e.
can be used to have
string literals span multiple lines,
so, in the example above, all of the text following the three double quotes
after the third print statement up until the next set of three double quotes
will be printed, i.e., displayed on the web page.
You can put the Python code to display the HTML code that appears at the top and bottom of webpages in functions that you can reuse in other scripts as shown below:
#!/usr/bin/python def htmlTop(): print "Content-type: text/html" print print """<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Testing</title> </head> <body>""" def htmlBottom(): print '''</body>\n </html>''' htmlTop() print "Hello world" htmlBottom()
You can have single quotes that are part of the HTML code appear within the triple quotes.
Some simple oversights can cause a "500 Internal Server Error" and result in a web server displaying an error message similar to the following one when a Python script is run that should produce a page to be displayed on a website.
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator at email@example.com to inform them of the time this error occurred, and the actions you performed just before this error.
More information about this error may be available in the server error log.
The error message displayed by the web server will be accompanied by an entry in the web server's log file similar to the one below for an Apache web server:
[Fri Sep 08 16:15:29.149109 2017] [cgi:error] [pid 38686] [client ::1:50621] End of script output before headers: test.py
Some simple things to check include the following:
Check to be sure you have indicated the script is a Python script by placing
a line similar to the one below in the script (adjust the line to match
the location of the Python executable on the system, which you can determine
by issuing the command
Check to be sure that the file permissions are set on the script file so that
it will be executable by the web server software, i.e., by the apache account,
if you are using Apache as the web server account. You can change the
permissions so that all accounts on the system have "execute" privilege for
the script with the command
chmod +x filename where
filename is the name of the script file. E.g., in the case below the
script test.py would produce the error message above until execute permission
is assigned to the file.
$ ls -lg test.py -rw-r--r-- 1 ABC\Domain Users 293 Sep 8 16:20 test.py $ chmod +x test.py $ ls -lg test.py -rwxr-xr-x 1 ABC\Domain Users 293 Sep 8 16:20 test.py $
If you get the "Internal Server Error" message rather than seeing the expected web page displayed, you can include the lines below in the Python code to help you debug the problem.
# enable debugging import cgitb cgitb.enable()
They will result in additional details being recorded in the web server's error log or details on the error being displayed on the webpage presented to the browser. E.g., I might see something like the following displayed rather than just the "Internal Server Error" message:
<type 'exceptions.NameError'>: name 'total' is not defined args = ("name 'total' is not defined",) message = "name 'total' is not defined"
E.g., if I omitted the second
def htmlTop(): print "Content-type: text/html" # print print """<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Testing</title> </head> <body>"""
But I could then look in the webserver's error log file and see an entry like the following one:
[Fri Sep 08 21:37:37.175531 2017] [cgi:error] [pid 83371] [client ::1:53523] malformed header from script 'test.py': Bad header: <!DOCTYPE html>
The coding error may still not be immediately obvious, but in
this case it points to exactly where in the code the problem occurs
and I can tell that I've omitted printing the blank line after the
print "Content-type: text/html" statement.