【问题标题】:Mixing mime types with HTTPServer in python在 python 中将 mime 类型与 HTTPServer 混合
【发布时间】:2014-02-19 06:39:49
【问题描述】:

现在我有这个文件结构

server-
      |
      |css-
      |   |bad.css
      |
      |html-
      |    |bad.html
      |
      |jpg-
      |      |bad.jpg
      |
      |server.py

这很糟糕。css:

body
{
    background-image:url('bad.jpg');
    background-repeat:no-repeat;
    background-position:right top;
    margin-right:200px;
}

这很糟糕。html:

<html>
<head>
<link rel="stylesheet" type="text/css" href="bad.css">
</head>
<body>
    <h1>This isn't a thing!</h1>
    <p>You must be mistaken. But <a href="/index">here</a> is where you can find your way again.</p>
</body>
</html>

这是 server.py 的相关部分

from BaseHTTPServer import BaseHTTPRequestHandler as Handler
from mime types import guess_type

class MyHandler(Handler):
    def do_GET(self):
        print self.path
        print self.headers
        extensions = ['html', 'css', 'jpg']
        fname = self.path
        for ext in extensions:
            if fname.endswith(ext):
                fname = ext + fname
                break
        if fname.split('/')[0] == '':
            fname = 'html/bad.html'
        mimetype = guess_type(fname)[0]
        print fname
        data = open(fname, 'rb')
            self.send_response(200)
        self.send_header('Content-type', mimetype)
        self.end_headers()
        self.wfile.write(data.read())
        data.close()

我更新的代码应该已经修复了它,但现在我的浏览器根本不呈现它,它只是显示 html 代码。

【问题讨论】:

  • 首先,问题是什么,你说From what I've gathered via google, the problem is with ...,你在谷歌上研究什么“问题”?
  • @vikki stackoverflow.com/questions/947372/… 问题是没有 css 渲染。当我将浏览器指向我的服务器时,我看不到图像,只有 html。

标签: python html css mime-types


【解决方案1】:

您的 CSS 和图像无法加载的原因是您的处理程序不知道如何处理这些文件的请求。这是从您链接到的问题中 nosklo 的答案中复制(并稍作调整)的一个简单示例。

def do_GET(self):
    try:
        if self.path in ("", "/"):
            filepath = "html/bad.html"
        else:
            filepath = self.path.lstrip("/")

        f = open(os.path.join('.', filepath), "rb")

    except IOError:
        self.send_error(404,'File Not Found: %s ' % filepath)

    else:
        self.send_response(200)

        #this part handles the mimetypes for you.
        mimetype, _ = mimetypes.guess_type(filepath)
        self.send_header('Content-type', mimetype)
        self.end_headers()
        for s in f:
            self.wfile.write(s)

注意:您必须将 html 中的 css 链接从

<link rel="stylesheet" type="text/css" href="../css/bad.css">

<link rel="stylesheet" type="text/css" href="/css/bad.css">

【讨论】:

  • @Broseph 查看我的更新。注意我们是如何打开文件的,我添加了rb 标志以二进制模式打开文件,否则任何图像都不会显示。
  • 我进行了更改,但仍然没有骰子。 css 链接应该是 href="bad.css" 吗?
  • 不应该fname = ext + fname实际上是fname = fname + ext
  • 另外,保持css中的链接原样,即background-image:url('../images/bad.jpg')
  • 文件位于基于其扩展名的文件夹中。我没有改变他们的组织。
猜你喜欢
  • 2019-07-21
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2015-06-05
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
相关资源
最近更新 更多