2010-10-11 49 views
0

這裏是我的代碼:返回Web服務器的HTML,而不是純文本的python

import socket 
import sys 
import re 
import base64 
import binascii 
import time 
class Serverhttp: 
    def __init__(self): 
     self.GET = re.compile("GET.*?HTTP") 
     self.POST = re.compile("GET.*?HTTP") 
     try : 
      sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
      server_address = ('localhost', 28000) 
      print >>sys.stderr, 'starting up on %s port %s' % server_address 
      sock.bind(server_address) 
     except : 
      time.sleep(2) 
      self.__init__() 
     # Listen for incoming connections 
     sock.listen(1) 
     off = 2 
     self.message = "" 
     while True: 
      # Wait for a connection 
      print >>sys.stderr, 'waiting for a connection' 
      if off == 2 or off == 1: 
       connection, client_address = sock.accept() 
      try: 
       print >>sys.stderr, 'connection from', client_address 

       # Receive the data in small chunks and retransmit it 
       while True: 
        data = connection.recv(1024) 
        print >>sys.stderr, 'received "%s"' % data 
        if data: 
         self.message = self.traitement(data) 
         connection.sendall(self.message) 
         connection.close() 
         connection, client_address = sock.accept() 

        else: 
         print >>sys.stderr, 'no more data from', client_address 
         break 

      finally: 
       # Clean up the connection 
       connection.close() 


    def traitement(self,data): 
     url = self.GET.findall(data) 
     url = self.POST.findall(data) 
     url = url[0].replace("GET","") 
     url = url.replace("POST","") 
     url = url.replace("HTTP","") 
     url = url.replace(" ","") 
     print url 
     if url == "/favicon.ico": 
      return binascii.a2b_base64(
"""AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAA7PT7/3zF6/9Ptu//RbHx/0227/+Tzvb/9vv5/97h0f9JeBz/NHoA/z98Av9AfAD/ 
PHsA/0F6AP8AAAAA/vz7/1+33/8Mp+z/FrHw/xWy8f8bs/T/Hqrx/3zE7v////7/t8qp/zF2A/87 
gwH/P4ID/z59AP8+egD/Q3kA/97s8v8botj/ELn3/wy58f8PtfL/D7Lw/xuz9P8vq+f/8/n///77 
9v9KhR3/OYYA/0GFAv88hgD/QIAC/z17AP/0+/j/N6bM/wC07/8Cxf7/CsP7/wm+9v8Aqur/SrDb 
//7+/v///P7/VZEl/zSJAP87jQD/PYYA/0OBBf8+fQH///3//9Dp8/84sM7/CrDf/wC14/8CruL/ 
KqnW/9ns8f/8/v//4OjX/z+GDf85kAD/PIwD/z2JAv8+hQD/PoEA/9C7pv/97uv////+/9Xw+v+w 
3ej/ls/e/+rz9///////+/z6/22mSf8qjQH/OJMA/zuQAP85iwL/PIgA/zyFAP+OSSL/nV44/7J+ 
Vv/AkG7/7trP//7//f/9//7/6/Lr/2uoRv8tjQH/PJYA/zuTAP87kwD/PY8A/z2KAP89hAD/olkn 
/6RVHP+eSgj/mEgR//Ho3//+/v7/5Ozh/1GaJv8tlAD/OZcC/zuXAv84lAD/O5IC/z2PAf89iwL/ 
OIkA/6hWFf+cTxD/pm9C/76ihP/8/v//+////8nav/8fdwL/NZsA/zeZAP83mgD/PJQB/zyUAf84 
jwD/PYsB/z6HAf+fXif/1r6s//79///58u//3r+g/+3i2v/+//3/mbiF/yyCAP87mgP/OpgD/zeW 
AP85lgD/OpEB/z+TAP9ChwH/7eHb/////v/28ej/tWwo/7tUAP+5XQ7/5M+5/////v+bsZn/IHAd 
/zeVAP89lgP/O5MA/zaJCf8tZTr/DyuK//3////9////0qmC/7lTAP/KZAT/vVgC/8iQWf/+//3/ 
//j//ygpx/8GGcL/ESax/xEgtv8FEMz/AALh/wAB1f///f7///z//758O//GXQL/yGYC/8RaAv/O 
jlf/+/////////9QU93/BAD0/wAB//8DAP3/AAHz/wAA5f8DAtr///////v7+/+2bCT/yGMA/89m 
AP/BWQD/0q+D///+/////P7/Rkbg/wEA+f8AA/z/AQH5/wMA8P8AAev/AADf///7/P////7/uINQ 
/7lXAP/MYwL/vGIO//Lm3P/8/v//1dT2/woM5/8AAP3/AwH+/wAB/f8AAfb/BADs/wAC4P8AAAAA 
//z7/+LbzP+mXyD/oUwE/9Gshv/8//3/7/H5/zo/w/8AAdX/AgL6/wAA/f8CAP3/AAH2/wAA7v8A 
AAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAgAEAAA==""") 
     else : 
      return "Content-type:text/html;charset=utf8\n\n<html><body>test</body></html>" 
if __name__ == "__main__": 
    s = Serverhttp() 

爲什麼行:在瀏覽器中

return "Content-type:text/html;charset=utf8\n\n<html><body>test</body></html>" 

顯示純文本,而不是HTML嗎?

+4

你爲什麼要編寫自己的Web服務器而不是使用其中一個內置的服務器? – 2010-10-11 08:53:26

+3

此外,通過點擊幫助您的答案下方的綠色「打勾」標記表示「謝謝」。說「謝謝」是愉快的,但無關緊要。 – 2010-10-11 11:12:05

回答

4

具有以下

return "HTTP/1.0 200 OK\r\nContent-type:text/html;charset=utf8\r\n\r\n<html><body>test</body></html>" 

注意替換您的return語句:你應該知道如何應對,妥善處理HTTP請求。如果您認真構建自己的Web服務器,則應首先閱讀並理解HTTP RFC

+0

問候並感謝您的回答 – user462794 2010-10-11 10:49:27

+0

-1:正確的答案是「使用現有的Web服務器」。這個答案**應該**說:「作爲一個後退,如果你堅持做兩次必要的工作,替換...」 – 2010-10-11 11:11:26

+0

@S洛特:在許多情況下是的,但如果有人想要學習HTTP?有什麼比建立自己的方式更好的方法? – 2010-10-11 14:39:38

1

我不知道python,但你不應該在HTML中寫頭信息。您可以使用<head>標籤中的<meta>指定Content-type。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title>test</title> 
    </head> 
    <body> 
     test 
    </body> 
</html> 
相關問題