2010-07-03 111 views
2

我一直在自學Python和CGI腳本,我知道你的基本的腳本看起來像打印HTML

#!/usr/local/bin/python 
import cgi 
print "Content-type: text/html" 
print 
print "<HTML>" 
print "<BODY>" 
print "HELLO WORLD!" 
print "</BODY>" 
print "</HTML>" 

我的問題是,如果我有一個很大的HTML文件我想顯示在python中(它有行和代碼和sone JS在裏面)是否必須在每行前面手動添加'print'並將其轉換爲\'等等?或者是否有方法或腳本可以將其轉換爲我?

謝謝!

回答

8

Python支持多行字符串,所以你可以在一個大的文件中打印出你的文本。

print '''<html> 
<head><title>My first Python CGI app</title></head> 
<body> 
<p>Hello, 'world'!</p> 
</body> 
</html>''' 

它們支持所有的字符串操作,包括方法(.upper().translate()等)和格式(%),以及原始模式(r前綴)和u Unicode的前綴。

+0

因此,我可以複製並粘貼這樣的HTML?我不需要在每個「?」之前添加/? – Parker 2010-07-03 00:44:09

+0

對於多行字符串,只有打開字符串的相同的三行程序才能關閉它。 – 2010-07-03 00:57:38

+0

Ignacio,您爲我節省了幾小時不必要的「打印」標記和引號。謝謝! – Parker 2010-07-03 13:42:48

9

如果大HTML文件中(例如)'foo.html',住在當前目錄中的CGI腳本,那麼所有你需要爲你的腳本的身體是:

print "Content-type: text/html" 
print 
with open('foo.html') as f: 
    print f.read() 

如果你堅持Python 2.5,添加from __future__ import with_statement作爲模塊正文的開始。如果你堅持一個更老的Python,最後兩行變成

print open('foo.html').read() 

注意,當你使用沒有任何的cgi模塊的功能,這是你不需要import cgi在你的例子和這個答案中都是這樣。

+0

謝謝Alex,非常感謝! – Parker 2010-07-03 00:36:43

+0

那麼foo.html必須在cgi-bin中,如果這是腳本的位置? – Parker 2010-07-03 00:44:45

+0

@皮克:例如,是的。但是,如果打開文件的位置在其他位置,則可以指定路徑。 – 2010-07-03 00:58:31

0

當我第一次嘗試使用裝飾器時,我寫了this little CGI decorator來處理HTML頭部和身體標記樣板文件。所以,你可以這樣寫:

@CGImethod(title="Hello with Decorator") 
def say_hello(): 
    print '<h1>Hello from CGI-Land</h1>' 

,當所謂的回報:

Content-Type: text/html 

<HTML> 
<HEAD><TITLE>Hello with Decorator</TITLE></HEAD> 
<BODY> 
<h1>Hello from CGI-Land</h1> 

</BODY></HTML> 

然後say_hello可以從HTTP服務器的do_GETdo_POST方法被調用。