确定 URL 的内容类型

在对网络服务器上的内容执行 GET 请求时,网络服务器会返回一些标头,其中一个标头从网络服务器的角度确定了内容的类型。在本示例中,我们将学习如何使用它来确定网络服务器认为的内容类型。

准备工作

我们再次使用 URLUtility 类。代码如下,在 04/03_determine_content_type_from_response.py 中。

如何做

我们按如下方式进行:

  1. 执行示例的脚本。 它包含以下代码:

    util = URLUtility(const.ApodEclipseImage())
    print("The content type is: " + util.contenttype)
  2. 结果如下:

    Reading URL: https://apod.nasa.gov/apod/image/1709/BT5643s.jpg
    Read 171014 bytes
    The content type is: image/jpeg

运行原理

content 类型属性的实现如下:
@property
def contenttype(self):
    self.ensure_response()
    return self._response.headers['content-type']

_response 对象的 .headers 属性是一个类似于字典的标头类。 内容类型键将检索服务器指定的内容类型。 对 Ensure_response() 方法的调用只是确保 .read() 函数已被执行。

还有更多

响应中的标头包含大量信息。 如果我们更仔细地查看响应的 headers 属性,我们可以看到返回了以下标头:

>>> response = urllib.request.urlopen(const.ApodEclipseImage())
>>> for header in response.headers: print(header)
Date
Server
Last-Modified
ETag
Accept-Ranges
Content-Length
Connection
Content-Type
Strict-Transport-Security

我们可以看到每个标头的值。

>>> for header in response.headers: print(header + " ==> " +
response.headers[header])
Date ==> Tue, 26 Sep 2017 19:31:41 GMT
Server ==> WebServer/1.0
Last-Modified ==> Thu, 31 Aug 2017 20:26:32 GMT
ETag ==> "547bb44-29c06-5581275ce2b86"
Accept-Ranges ==> bytes
Content-Length ==> 171014
Connection ==> close
Content-Type ==> image/jpeg
Strict-Transport-Security ==> max-age=31536000; includeSubDomains

其中许多内容我们不会在本书中讨论,但对于不熟悉的人来说,知道它们的存在是件好事。