【问题标题】:index.html won't be shown as a webpage in Firefox (Python2)index.html 不会在 Firefox (Python2) 中显示为网页
【发布时间】:2014-01-17 00:01:00
【问题描述】:

我是网络服务器的新手。我有一个简单的 Web 服务器,它向客户端显示 index.html。我已经使用 Chrome 对其进行了测试,它显示为实际网页。但是,Firefox 将 index.html 显示为带有标签的 html 文件。这是服务器的python代码:

DataToSend=""
while True:
    data = f.read(4096)
    DataToSend=DataToSend+data
    if not data:
        break        
self.request.sendall(DataToSend)
f.close()

这里是 index.html:

<!DOCTYPE html>
<html>
<head>
    <title>Example Page</title>
        <meta http-equiv="Content-Type"
        content="text/html;charset=utf-8"/>
        <!-- check conformance at http://validator.w3.org/check -->
        <link rel="stylesheet" type="text/css" href="base.css">
</head>

<body>
    <div class="eg">
        <h1>An Example Page</h1>
        <ul>
            <li>It works?
                        <li><a href="deep/index.html">A deeper page</a></li>
        </ul>
    </div>
</body>
</html> 

【问题讨论】:

  • 你使用的是什么网络服务框架?
  • 或者,如果这只是原始套接字代码,请说,或者,更好的是,给我们一个minimal, complete, valid example,这很明显。 (作为旁注,看起来 SO 只是将其重命名为“最小、完整、经过测试、可读示例”,但将 URL 保留为“mcve”,仅在让我们都从 SSCCE 切换后不久……这不可能会再混乱了……)

标签: python web-services google-chrome firefox


【解决方案1】:

您没有告诉我们您使用的是什么框架。但我能猜到问题所在。

HTTP 响应必须由响应行、HTTP 标头、空行和正文组成。有些框架只是给你一个类似文件的对象,你可以写任何你想写的东西,在这种情况下你必须写所有这些位。其他人给你一个 API 来设置响应代码,另一个来添加标题,另一个来设置正文。但无论你使用什么,很明显,你发送到任何地方的唯一东西就是一个身体。


因此,这可能意味着您发送的 HTTP 响应无效。如果这只是原始套接字代码,那么显然这就是正在发生的事情。还有一些框架也是如此。

浏览器通常会尝试容忍甚至严重损坏的服务器,但它们都以不同的方式做到这一点,因此一个猜测正确而另一个失败也就不足为奇了。


或者,这可能意味着您的框架在您的正文之前正确地发送了响应代码和一些空标头,但是这些空标头不足以告诉浏览器它应该处理什么类型的内容,然后再一个猜对了,另一个猜错了。 (特别是,您应该发送 Content-Type: text/html 标头。)

您可以通过使用命令行工具与服务器对话来轻松查看您发送的内容——例如,echo GET / | nc server.host.name 80curl -D- http://server.host.name/ 或其他。这将准确地告诉您您发送错误的内容。

但要弄清楚如何修复它,您需要阅读有关您使用的任何框架的教程。

【讨论】:

  • 感谢您的详细回答。我正在使用套接字服务器。我已阅读 python SocketServer 文档,但找不到任何有用的信息
  • @UlviIbrahimov:嗯,SocketServer 不知道如何做 HTTP。如果你想在原始套接字之上编写一个 HTTP 服务器,你必须阅读RFC 2616。这是很多工作。这就是为什么 Python 带有 BaseHTTPServerSimpleHTTPServer 等作为构建框架的原因,WSGI 作为一种将您的 Web 应用程序插入单独服务器的方式,以及许多第三方框架,如 Tornado、Twisted、gUnicorn、等等
  • @UlviIbrahimov:如果你真的想自己动手,http.server (3.x) / SimpleHTTPServer (2.x) 的源代码是一个不错的示例,可以帮助你入门,但如果您希望完成这项工作,您将需要熟悉 RFC、试验 netcat 等。
  • @ abarnert,然后我可能会尝试不同的框架并将此答案标记为已接受。谢谢
【解决方案2】:

响应类型应设置为text/html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-12
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    相关资源
    最近更新 更多