Files
hustoj/web/python-docs/library/http.server.html
2025-03-09 17:10:56 +08:00

664 lines
66 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_CN">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<title>http.server --- HTTP 服务器 &#8212; Python 3.8.20 文档</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/language_data.js"></script>
<script src="../_static/translations.js"></script>
<script src="../_static/sidebar.js"></script>
<link rel="search" type="application/opensearchdescription+xml"
title="在 Python 3.8.20 文档 中搜索"
href="../_static/opensearch.xml"/>
<link rel="author" title="关于这些文档" href="../about.html" />
<link rel="index" title="索引" href="../genindex.html" />
<link rel="search" title="搜索" href="../search.html" />
<link rel="copyright" title="版权所有" href="../copyright.html" />
<link rel="next" title="http.cookies --- HTTP状态管理" href="http.cookies.html" />
<link rel="prev" title="socketserver --- 用于网络服务器的框架" href="socketserver.html" />
<link rel="canonical" href="https://docs.python.org/3/library/http.server.html" />
<style>
@media only screen {
table.full-width-table {
width: 100%;
}
}
</style>
<link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
<script type="text/javascript" src="../_static/copybutton.js"></script>
<script type="text/javascript" src="../_static/menu.js"></script>
</head>
<body>
<div class="mobile-nav">
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
<label for="menuToggler" class="toggler__label">
<span></span>
</label>
<nav class="nav-content" role="navigation">
<a href="https://www.python.org/" class="nav-logo">
<img src="../_static/py.svg" alt="Logo"/>
</a>
<div class="version_switcher_placeholder"></div>
<form role="search" class="search" action="../search.html" method="get">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
<path fill-rule="nonzero"
d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" fill="#444"></path>
</svg>
<input type="text" name="q" aria-label="快速搜索"/>
<input type="submit" value="转向"/>
</form>
</nav>
<div class="menu-wrapper">
<nav class="menu" role="navigation" aria-label="main navigation">
<div class="language_switcher_placeholder"></div>
<h3><a href="../contents.html">目录</a></h3>
<ul>
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">http.server</span></code> --- HTTP 服务器</a><ul>
<li><a class="reference internal" href="#security-considerations">安全考量</a></li>
</ul>
</li>
</ul>
<h4>上一个主题</h4>
<p class="topless"><a href="socketserver.html"
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">socketserver</span></code> --- 用于网络服务器的框架</a></p>
<h4>下一个主题</h4>
<p class="topless"><a href="http.cookies.html"
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">http.cookies</span></code> --- HTTP状态管理</a></p>
<div role="note" aria-label="source link">
<h3>本页</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">报告 Bug</a></li>
<li>
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/http.server.rst"
rel="nofollow">显示源代码
</a>
</li>
</ul>
</div>
</nav>
</div>
</div>
<div id="outdated-warning" style="padding: .5em; text-align: center; background-color: #FFBABA; color: #6A0E0E;">
这个文档所针对的是一个已不再受支持的 Python 旧版本。
你应当升级版本,并阅读
<a href="/3/library/http.server.html"> Python 当前稳定版本的文档</a>.
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>导航</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="总目录"
accesskey="I">索引</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python 模块索引"
>模块</a> |</li>
<li class="right" >
<a href="http.cookies.html" title="http.cookies --- HTTP状态管理"
accesskey="N">下一页</a> |</li>
<li class="right" >
<a href="socketserver.html" title="socketserver --- 用于网络服务器的框架"
accesskey="P">上一页</a> |</li>
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> &#187;</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.8.20 Documentation</a> &#187;
</li>
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="internet.html" accesskey="U">互联网协议和支持</a> &#187;</li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
<input type="submit" value="转向" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
|
</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-http.server">
<span id="http-server-http-servers"></span><h1><a class="reference internal" href="#module-http.server" title="http.server: HTTP server and request handlers."><code class="xref py py-mod docutils literal notranslate"><span class="pre">http.server</span></code></a> --- HTTP 服务器<a class="headerlink" href="#module-http.server" title="永久链接至标题"></a></h1>
<p><strong>源代码:</strong> <a class="reference external" href="https://github.com/python/cpython/tree/3.8/Lib/http/server.py">Lib/http/server.py</a></p>
<hr class="docutils" id="index-0" />
<p>这个模块定义了实现 HTTP 服务器( Web 服务器)的类。</p>
<div class="admonition warning">
<p class="admonition-title">警告</p>
<p><a class="reference internal" href="#module-http.server" title="http.server: HTTP server and request handlers."><code class="xref py py-mod docutils literal notranslate"><span class="pre">http.server</span></code></a> 不推荐用于生产环境。它仅仅实现了 <a class="reference internal" href="#http-server-security"><span class="std std-ref">basic security checks</span></a> 的要求。</p>
</div>
<p><a class="reference internal" href="#http.server.HTTPServer" title="http.server.HTTPServer"><code class="xref py py-class docutils literal notranslate"><span class="pre">HTTPServer</span></code></a><a class="reference internal" href="socketserver.html#socketserver.TCPServer" title="socketserver.TCPServer"><code class="xref py py-class docutils literal notranslate"><span class="pre">socketserver.TCPServer</span></code></a> 的一个子类。它会创建和侦听 HTTP 套接字,并将请求分发给处理程序。创建和运行 HTTP 服务器的代码类似如下所示:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="n">server_class</span><span class="o">=</span><span class="n">HTTPServer</span><span class="p">,</span> <span class="n">handler_class</span><span class="o">=</span><span class="n">BaseHTTPRequestHandler</span><span class="p">):</span>
<span class="n">server_address</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="mi">8000</span><span class="p">)</span>
<span class="n">httpd</span> <span class="o">=</span> <span class="n">server_class</span><span class="p">(</span><span class="n">server_address</span><span class="p">,</span> <span class="n">handler_class</span><span class="p">)</span>
<span class="n">httpd</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
</pre></div>
</div>
<dl class="class">
<dt id="http.server.HTTPServer">
<em class="property">class </em><code class="sig-prename descclassname">http.server.</code><code class="sig-name descname">HTTPServer</code><span class="sig-paren">(</span><em class="sig-param">server_address</em>, <em class="sig-param">RequestHandlerClass</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.HTTPServer" title="永久链接至目标"></a></dt>
<dd><p>该类基于 <a class="reference internal" href="socketserver.html#socketserver.TCPServer" title="socketserver.TCPServer"><code class="xref py py-class docutils literal notranslate"><span class="pre">TCPServer</span></code></a> 类,并在实例变量 <code class="xref py py-attr docutils literal notranslate"><span class="pre">server_name</span></code><code class="xref py py-attr docutils literal notranslate"><span class="pre">server_port</span></code> 中保存 HTTP 服务器地址。处理程序可通过实例变量 <code class="xref py py-attr docutils literal notranslate"><span class="pre">server</span></code> 访问 HTTP 服务器。</p>
</dd></dl>
<dl class="class">
<dt id="http.server.ThreadingHTTPServer">
<em class="property">class </em><code class="sig-prename descclassname">http.server.</code><code class="sig-name descname">ThreadingHTTPServer</code><span class="sig-paren">(</span><em class="sig-param">server_address</em>, <em class="sig-param">RequestHandlerClass</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.ThreadingHTTPServer" title="永久链接至目标"></a></dt>
<dd><p>该类相似于 HTTPServer ,只是会利用 <a class="reference internal" href="socketserver.html#socketserver.ThreadingMixIn" title="socketserver.ThreadingMixIn"><code class="xref py py-class docutils literal notranslate"><span class="pre">ThreadingMixIn</span></code></a> 对请求进行多线程处理。当需要对 Web 浏览器预先打开套接字进行处理时,这就很有用,这时 <a class="reference internal" href="#http.server.HTTPServer" title="http.server.HTTPServer"><code class="xref py py-class docutils literal notranslate"><span class="pre">HTTPServer</span></code></a> 会一直等待请求。</p>
<div class="versionadded">
<p><span class="versionmodified added">3.7 新版功能.</span></p>
</div>
</dd></dl>
<p>实例化 <a class="reference internal" href="#http.server.HTTPServer" title="http.server.HTTPServer"><code class="xref py py-class docutils literal notranslate"><span class="pre">HTTPServer</span></code></a><a class="reference internal" href="#http.server.ThreadingHTTPServer" title="http.server.ThreadingHTTPServer"><code class="xref py py-class docutils literal notranslate"><span class="pre">ThreadingHTTPServer</span></code></a> 时,必须给出一个 <em>RequestHandlerClass</em>,本模块提供了该对象的三种变体:</p>
<dl class="class">
<dt id="http.server.BaseHTTPRequestHandler">
<em class="property">class </em><code class="sig-prename descclassname">http.server.</code><code class="sig-name descname">BaseHTTPRequestHandler</code><span class="sig-paren">(</span><em class="sig-param">request</em>, <em class="sig-param">client_address</em>, <em class="sig-param">server</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler" title="永久链接至目标"></a></dt>
<dd><p>这个类用于处理到达服务器的 HTTP 请求。 它本身无法响应任何实际的 HTTP 请求;它必须被子类化以处理每个请求方法(例如 GET 或 POST<a class="reference internal" href="#http.server.BaseHTTPRequestHandler" title="http.server.BaseHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseHTTPRequestHandler</span></code></a> 提供了许多供子类使用的类和实例变量以及方法。</p>
<p>这个处理程序将解析请求和标头,然后调用特定请求类型对应的方法。 方法名称将根据请求来构造。 例如,对于请求方法 <code class="docutils literal notranslate"><span class="pre">SPAM</span></code>,将不带参数地调用 <code class="xref py py-meth docutils literal notranslate"><span class="pre">do_SPAM()</span></code> 方法。 所有相关信息会被保存在该处理程序的实际变量中。 子类不需要重载或扩展 <a class="reference internal" href="../reference/datamodel.html#object.__init__" title="object.__init__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__init__()</span></code></a> 方法。</p>
<p><a class="reference internal" href="#http.server.BaseHTTPRequestHandler" title="http.server.BaseHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseHTTPRequestHandler</span></code></a> 具有下列实例变量:</p>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.client_address">
<code class="sig-name descname">client_address</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.client_address" title="永久链接至目标"></a></dt>
<dd><p>包含 <code class="docutils literal notranslate"><span class="pre">(host,</span> <span class="pre">port)</span></code> 形式的指向客户端地址的元组。</p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.server">
<code class="sig-name descname">server</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.server" title="永久链接至目标"></a></dt>
<dd><p>包含服务器实例。</p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.close_connection">
<code class="sig-name descname">close_connection</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.close_connection" title="永久链接至目标"></a></dt>
<dd><p>应当在 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.handle_one_request" title="http.server.BaseHTTPRequestHandler.handle_one_request"><code class="xref py py-meth docutils literal notranslate"><span class="pre">handle_one_request()</span></code></a> 返回之前设定的布尔值,指明是否要期待另一个请求,还是应当关闭连接。</p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.requestline">
<code class="sig-name descname">requestline</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.requestline" title="永久链接至目标"></a></dt>
<dd><p>包含 HTTP 请求行的字符串表示。 末尾的 CRLF 会被去除。 该属性应当由 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.handle_one_request" title="http.server.BaseHTTPRequestHandler.handle_one_request"><code class="xref py py-meth docutils literal notranslate"><span class="pre">handle_one_request()</span></code></a> 来设定。 如果无有效请求行被处理,则它应当被设为空字符串。</p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.command">
<code class="sig-name descname">command</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.command" title="永久链接至目标"></a></dt>
<dd><p>包含具体的命令(请求类型)。 例如 <code class="docutils literal notranslate"><span class="pre">'GET'</span></code></p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.path">
<code class="sig-name descname">path</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.path" title="永久链接至目标"></a></dt>
<dd><p>包含请求路径。如果URL的查询部分存在 <code class="docutils literal notranslate"><span class="pre">path</span></code> 会包含这个查询部分。使用 <span class="target" id="index-6"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc3986.html"><strong>RFC 3986</strong></a> 的术语来说,在这里, <code class="docutils literal notranslate"><span class="pre">path</span></code> 包含 <code class="docutils literal notranslate"><span class="pre">hier-part</span></code><code class="docutils literal notranslate"><span class="pre">query</span></code></p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.request_version">
<code class="sig-name descname">request_version</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.request_version" title="永久链接至目标"></a></dt>
<dd><p>包含请求的版本字符串。 例如 <code class="docutils literal notranslate"><span class="pre">'HTTP/1.0'</span></code></p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.headers">
<code class="sig-name descname">headers</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.headers" title="永久链接至目标"></a></dt>
<dd><p>存放由 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.MessageClass" title="http.server.BaseHTTPRequestHandler.MessageClass"><code class="xref py py-attr docutils literal notranslate"><span class="pre">MessageClass</span></code></a> 类变量所指定的类的实例。 该实例会解析并管理 HTTP 请求中的标头。 <a class="reference internal" href="http.client.html#module-http.client" title="http.client: HTTP and HTTPS protocol client (requires sockets)."><code class="xref py py-mod docutils literal notranslate"><span class="pre">http.client</span></code></a> 中的 <a class="reference internal" href="http.client.html#http.client.parse_headers" title="http.client.parse_headers"><code class="xref py py-func docutils literal notranslate"><span class="pre">parse_headers()</span></code></a> 函数将被用来解析标头并且它需要 HTTP 请求提供一个有效的 <span class="target" id="index-7"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc2822.html"><strong>RFC 2822</strong></a> 风格的标头。</p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.rfile">
<code class="sig-name descname">rfile</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.rfile" title="永久链接至目标"></a></dt>
<dd><p>一个 <a class="reference internal" href="io.html#io.BufferedIOBase" title="io.BufferedIOBase"><code class="xref py py-class docutils literal notranslate"><span class="pre">io.BufferedIOBase</span></code></a> 输入流,准备从可选的输入数据的开头进行读取。</p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.wfile">
<code class="sig-name descname">wfile</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.wfile" title="永久链接至目标"></a></dt>
<dd><p>包含用于写入响应并发回给客户端的输出流。 在写入流时必须正确遵守 HTTP 协议以便成功地实现与 HTTP 客户端的互操作。</p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.6 版更改: </span>这是一个 <a class="reference internal" href="io.html#io.BufferedIOBase" title="io.BufferedIOBase"><code class="xref py py-class docutils literal notranslate"><span class="pre">io.BufferedIOBase</span></code></a> 流。</p>
</div>
</dd></dl>
<p><a class="reference internal" href="#http.server.BaseHTTPRequestHandler" title="http.server.BaseHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseHTTPRequestHandler</span></code></a> 具有下列属性:</p>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.server_version">
<code class="sig-name descname">server_version</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.server_version" title="永久链接至目标"></a></dt>
<dd><p>指定服务器软件版本。 你可能会想要重写该属性。 该属性的格式为多个以空格分隔的字符串,其中每个字符串的形式为 name[/version]。 例如 <code class="docutils literal notranslate"><span class="pre">'BaseHTTP/0.2'</span></code></p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.sys_version">
<code class="sig-name descname">sys_version</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.sys_version" title="永久链接至目标"></a></dt>
<dd><p>包含 Python 系统版本,采用 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.version_string" title="http.server.BaseHTTPRequestHandler.version_string"><code class="xref py py-attr docutils literal notranslate"><span class="pre">version_string</span></code></a> 方法和 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.server_version" title="http.server.BaseHTTPRequestHandler.server_version"><code class="xref py py-attr docutils literal notranslate"><span class="pre">server_version</span></code></a> 类变量所支持的形式。 例如 <code class="docutils literal notranslate"><span class="pre">'Python/1.4'</span></code></p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.error_message_format">
<code class="sig-name descname">error_message_format</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.error_message_format" title="永久链接至目标"></a></dt>
<dd><p>指定应当被 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.send_error" title="http.server.BaseHTTPRequestHandler.send_error"><code class="xref py py-meth docutils literal notranslate"><span class="pre">send_error()</span></code></a> 方法用来构建发给客户端的错误响应的格式字符串。 该字符串应使用来自 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.responses" title="http.server.BaseHTTPRequestHandler.responses"><code class="xref py py-attr docutils literal notranslate"><span class="pre">responses</span></code></a> 的变量根据传给 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.send_error" title="http.server.BaseHTTPRequestHandler.send_error"><code class="xref py py-meth docutils literal notranslate"><span class="pre">send_error()</span></code></a> 的状态码来填充默认值。</p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.error_content_type">
<code class="sig-name descname">error_content_type</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.error_content_type" title="永久链接至目标"></a></dt>
<dd><p>指定发送给客户端的错误响应的 Content-Type HTTP 标头。 默认值为 <code class="docutils literal notranslate"><span class="pre">'text/html'</span></code></p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.protocol_version">
<code class="sig-name descname">protocol_version</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.protocol_version" title="永久链接至目标"></a></dt>
<dd><p>该属性指定在响应中使用的 HTTP 协议版本。 如果设为 <code class="docutils literal notranslate"><span class="pre">'HTTP/1.1'</span></code>,服务器将允许 HTTP 永久连接;但是,这样你的服务器 <em>必须</em> 在发给客户端的所有响应中包括一个准确的 <code class="docutils literal notranslate"><span class="pre">Content-Length</span></code> 标头 (使用 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.send_header" title="http.server.BaseHTTPRequestHandler.send_header"><code class="xref py py-meth docutils literal notranslate"><span class="pre">send_header()</span></code></a>)。 为了向下兼容,该设置默认为 <code class="docutils literal notranslate"><span class="pre">'HTTP/1.0'</span></code></p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.MessageClass">
<code class="sig-name descname">MessageClass</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.MessageClass" title="永久链接至目标"></a></dt>
<dd><p>指定一个 <a class="reference internal" href="email.compat32-message.html#email.message.Message" title="email.message.Message"><code class="xref py py-class docutils literal notranslate"><span class="pre">email.message.Message</span></code></a> 这样的类来解析 HTTP 标头。 通常该属性不会被重写,其默认值为 <code class="xref py py-class docutils literal notranslate"><span class="pre">http.client.HTTPMessage</span></code></p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.BaseHTTPRequestHandler.responses">
<code class="sig-name descname">responses</code><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.responses" title="永久链接至目标"></a></dt>
<dd><p>该属性包含一个整数错误代码与由短消息和长消息组成的二元组的映射。 例如,<code class="docutils literal notranslate"><span class="pre">{code:</span> <span class="pre">(shortmessage,</span> <span class="pre">longmessage)}</span></code><em>shortmessage</em> 通常是作为消息响应中的 <em>message</em> 键,而 <em>longmessage</em> 则是作为 <em>explain</em> 键。 该属性会被 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.send_response_only" title="http.server.BaseHTTPRequestHandler.send_response_only"><code class="xref py py-meth docutils literal notranslate"><span class="pre">send_response_only()</span></code></a><a class="reference internal" href="#http.server.BaseHTTPRequestHandler.send_error" title="http.server.BaseHTTPRequestHandler.send_error"><code class="xref py py-meth docutils literal notranslate"><span class="pre">send_error()</span></code></a> 方法所使用。</p>
</dd></dl>
<p><a class="reference internal" href="#http.server.BaseHTTPRequestHandler" title="http.server.BaseHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseHTTPRequestHandler</span></code></a> 实例具有下列方法:</p>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.handle">
<code class="sig-name descname">handle</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.handle" title="永久链接至目标"></a></dt>
<dd><p>调用 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.handle_one_request" title="http.server.BaseHTTPRequestHandler.handle_one_request"><code class="xref py py-meth docutils literal notranslate"><span class="pre">handle_one_request()</span></code></a> 一次(或者如果启用了永久连接则为多次)来处理传入的 HTTP 请求。 你应该完全不需要重载它;而是要实现适当的 <code class="xref py py-meth docutils literal notranslate"><span class="pre">do_*()</span></code> 方法。</p>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.handle_one_request">
<code class="sig-name descname">handle_one_request</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.handle_one_request" title="永久链接至目标"></a></dt>
<dd><p>此方法将解析并将请求分配给适当的 <code class="xref py py-meth docutils literal notranslate"><span class="pre">do_*()</span></code> 方法。 你应该完全不需要重载它。</p>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.handle_expect_100">
<code class="sig-name descname">handle_expect_100</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.handle_expect_100" title="永久链接至目标"></a></dt>
<dd><p>When a HTTP/1.1 compliant server receives an <code class="docutils literal notranslate"><span class="pre">Expect:</span> <span class="pre">100-continue</span></code>
request header it responds back with a <code class="docutils literal notranslate"><span class="pre">100</span> <span class="pre">Continue</span></code> followed by <code class="docutils literal notranslate"><span class="pre">200</span>
<span class="pre">OK</span></code> headers.
This method can be overridden to raise an error if the server does not
want the client to continue. For e.g. server can chose to send <code class="docutils literal notranslate"><span class="pre">417</span>
<span class="pre">Expectation</span> <span class="pre">Failed</span></code> as a response header and <code class="docutils literal notranslate"><span class="pre">return</span> <span class="pre">False</span></code>.</p>
<div class="versionadded">
<p><span class="versionmodified added">3.2 新版功能.</span></p>
</div>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.send_error">
<code class="sig-name descname">send_error</code><span class="sig-paren">(</span><em class="sig-param">code</em>, <em class="sig-param">message=None</em>, <em class="sig-param">explain=None</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.send_error" title="永久链接至目标"></a></dt>
<dd><p>发送并记录回复给客户端的完整错误信息。 数字形式的 <em>code</em> 指明 HTTP 错误代码,可选的 <em>message</em> 为简短的易于人类阅读的错误描述。 <em>explain</em> 参数可被用于提供更详细的错误信息;它将使用 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.error_message_format" title="http.server.BaseHTTPRequestHandler.error_message_format"><code class="xref py py-attr docutils literal notranslate"><span class="pre">error_message_format</span></code></a> 属性来进行格式化并在一组完整的标头之后作为响应体被发送。 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.responses" title="http.server.BaseHTTPRequestHandler.responses"><code class="xref py py-attr docutils literal notranslate"><span class="pre">responses</span></code></a> 属性存放了 <em>message</em><em>explain</em> 的默认值,它们将在未提供时被使用;对于未知代码两者的默认值均为字符串 <code class="docutils literal notranslate"><span class="pre">???</span></code>。 如果方法为 HEAD 或响应代码是下列值之一则响应体将为空: <code class="docutils literal notranslate"><span class="pre">1xx</span></code>, <code class="docutils literal notranslate"><span class="pre">204</span> <span class="pre">No</span> <span class="pre">Content</span></code>, <code class="docutils literal notranslate"><span class="pre">205</span> <span class="pre">Reset</span> <span class="pre">Content</span></code>, <code class="docutils literal notranslate"><span class="pre">304</span> <span class="pre">Not</span> <span class="pre">Modified</span></code></p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.4 版更改: </span>错误响应包括一个 Content-Length 标头。 增加了 <em>explain</em> 参数。</p>
</div>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.send_response">
<code class="sig-name descname">send_response</code><span class="sig-paren">(</span><em class="sig-param">code</em>, <em class="sig-param">message=None</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.send_response" title="永久链接至目标"></a></dt>
<dd><p>将一个响应标头添加到标头缓冲区并记录被接受的请求。 HTTP 响应行会被写入到内部缓冲区,后面是 <em>Server</em><em>Date</em> 标头。 这两个标头的值将分别通过 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.version_string" title="http.server.BaseHTTPRequestHandler.version_string"><code class="xref py py-meth docutils literal notranslate"><span class="pre">version_string()</span></code></a><a class="reference internal" href="#http.server.BaseHTTPRequestHandler.date_time_string" title="http.server.BaseHTTPRequestHandler.date_time_string"><code class="xref py py-meth docutils literal notranslate"><span class="pre">date_time_string()</span></code></a> 方法获取。 如果服务器不打算使用 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.send_header" title="http.server.BaseHTTPRequestHandler.send_header"><code class="xref py py-meth docutils literal notranslate"><span class="pre">send_header()</span></code></a> 方法发送任何其他标头,则 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.send_response" title="http.server.BaseHTTPRequestHandler.send_response"><code class="xref py py-meth docutils literal notranslate"><span class="pre">send_response()</span></code></a> 后面应该跟一个 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.end_headers" title="http.server.BaseHTTPRequestHandler.end_headers"><code class="xref py py-meth docutils literal notranslate"><span class="pre">end_headers()</span></code></a> 调用。</p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.3 版更改: </span>标头会被存储到内部缓冲区并且需要显式地调用 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.end_headers" title="http.server.BaseHTTPRequestHandler.end_headers"><code class="xref py py-meth docutils literal notranslate"><span class="pre">end_headers()</span></code></a></p>
</div>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.send_header">
<code class="sig-name descname">send_header</code><span class="sig-paren">(</span><em class="sig-param">keyword</em>, <em class="sig-param">value</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.send_header" title="永久链接至目标"></a></dt>
<dd><p>将 HTTP 标头添加到内部缓冲区,它将在 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.end_headers" title="http.server.BaseHTTPRequestHandler.end_headers"><code class="xref py py-meth docutils literal notranslate"><span class="pre">end_headers()</span></code></a><a class="reference internal" href="#http.server.BaseHTTPRequestHandler.flush_headers" title="http.server.BaseHTTPRequestHandler.flush_headers"><code class="xref py py-meth docutils literal notranslate"><span class="pre">flush_headers()</span></code></a> 被发起调用时写入输出流。 <em>keyword</em> 应当指定标头关键字,并以 <em>value</em> 指定其值。 请注意,在 send_header 调用结束之后,必须调用 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.end_headers" title="http.server.BaseHTTPRequestHandler.end_headers"><code class="xref py py-meth docutils literal notranslate"><span class="pre">end_headers()</span></code></a> 以便完成操作。</p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.2 版更改: </span>标头将被存入内部缓冲区。</p>
</div>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.send_response_only">
<code class="sig-name descname">send_response_only</code><span class="sig-paren">(</span><em class="sig-param">code</em>, <em class="sig-param">message=None</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.send_response_only" title="永久链接至目标"></a></dt>
<dd><p>只发送响应标头,用于当 <code class="docutils literal notranslate"><span class="pre">100</span> <span class="pre">Continue</span></code> 响应被服务器发送给客户端的场合。 标头不会被缓冲而是直接发送到输出流。 如果未指定 <em>message</em>,则会发送与响应 <em>code</em> 相对应的 HTTP 消息。</p>
<div class="versionadded">
<p><span class="versionmodified added">3.2 新版功能.</span></p>
</div>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.end_headers">
<code class="sig-name descname">end_headers</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.end_headers" title="永久链接至目标"></a></dt>
<dd><p>将一个空行(指明响应中 HTTP 标头的结束)添加到标头缓冲区并调用 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.flush_headers" title="http.server.BaseHTTPRequestHandler.flush_headers"><code class="xref py py-meth docutils literal notranslate"><span class="pre">flush_headers()</span></code></a></p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.2 版更改: </span>已缓冲的标头会被写入到输出流。</p>
</div>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.flush_headers">
<code class="sig-name descname">flush_headers</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.flush_headers" title="永久链接至目标"></a></dt>
<dd><p>最终将标头发送到输出流并清空内部标头缓冲区。</p>
<div class="versionadded">
<p><span class="versionmodified added">3.3 新版功能.</span></p>
</div>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.log_request">
<code class="sig-name descname">log_request</code><span class="sig-paren">(</span><em class="sig-param">code='-'</em>, <em class="sig-param">size='-'</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.log_request" title="永久链接至目标"></a></dt>
<dd><p>记录一次被接受(成功)的请求。 <em>code</em> 应当指定与请求相关联的 HTTP 代码。 如果请求的大小可用,则它应当作为 <em>size</em> 形参传入。</p>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.log_error">
<code class="sig-name descname">log_error</code><span class="sig-paren">(</span><em class="sig-param">...</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.log_error" title="永久链接至目标"></a></dt>
<dd><p>当请求无法完成时记录一次错误。 默认情况下,它会将消息传给 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.log_message" title="http.server.BaseHTTPRequestHandler.log_message"><code class="xref py py-meth docutils literal notranslate"><span class="pre">log_message()</span></code></a>,因此它接受同样的参数 (<em>format</em> 和一些额外的值)。</p>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.log_message">
<code class="sig-name descname">log_message</code><span class="sig-paren">(</span><em class="sig-param">format</em>, <em class="sig-param">...</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.log_message" title="永久链接至目标"></a></dt>
<dd><p>将任意一条消息记录到 <code class="docutils literal notranslate"><span class="pre">sys.stderr</span></code>。 此方法通常会被重写以创建自定义的错误日志记录机制。 <em>format</em> 参数是标准 printf 风格的格式字符串,其中会将传给 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.log_message" title="http.server.BaseHTTPRequestHandler.log_message"><code class="xref py py-meth docutils literal notranslate"><span class="pre">log_message()</span></code></a> 的额外参数用作格式化操作的输入。 每条消息日志记录的开头都会加上客户端 IP 地址和当前日期时间。</p>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.version_string">
<code class="sig-name descname">version_string</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.version_string" title="永久链接至目标"></a></dt>
<dd><p>返回服务器软件的版本字符串。 该值为 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler.server_version" title="http.server.BaseHTTPRequestHandler.server_version"><code class="xref py py-attr docutils literal notranslate"><span class="pre">server_version</span></code></a><a class="reference internal" href="#http.server.BaseHTTPRequestHandler.sys_version" title="http.server.BaseHTTPRequestHandler.sys_version"><code class="xref py py-attr docutils literal notranslate"><span class="pre">sys_version</span></code></a> 属性的组合。</p>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.date_time_string">
<code class="sig-name descname">date_time_string</code><span class="sig-paren">(</span><em class="sig-param">timestamp=None</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.date_time_string" title="永久链接至目标"></a></dt>
<dd><p>返回由 <em>timestamp</em> 所给定的日期和时间(参数应为 <code class="docutils literal notranslate"><span class="pre">None</span></code> 或为 <a class="reference internal" href="time.html#time.time" title="time.time"><code class="xref py py-func docutils literal notranslate"><span class="pre">time.time()</span></code></a> 所返回的格式),格式化为一个消息标头。 如果省略 <em>timestamp</em>,则会使用当前日期和时间。</p>
<p>结果看起来像 <code class="docutils literal notranslate"><span class="pre">'Sun,</span> <span class="pre">06</span> <span class="pre">Nov</span> <span class="pre">1994</span> <span class="pre">08:49:37</span> <span class="pre">GMT'</span></code></p>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.log_date_time_string">
<code class="sig-name descname">log_date_time_string</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.log_date_time_string" title="永久链接至目标"></a></dt>
<dd><p>返回当前的日期和时间,为日志格式化</p>
</dd></dl>
<dl class="method">
<dt id="http.server.BaseHTTPRequestHandler.address_string">
<code class="sig-name descname">address_string</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#http.server.BaseHTTPRequestHandler.address_string" title="永久链接至目标"></a></dt>
<dd><p>返回客户端的地址</p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.3 版更改: </span>在之前版本中,会执行一次名称查找。 为了避免名称解析的时延,现在将总是返回 IP 地址。</p>
</div>
</dd></dl>
</dd></dl>
<dl class="class">
<dt id="http.server.SimpleHTTPRequestHandler">
<em class="property">class </em><code class="sig-prename descclassname">http.server.</code><code class="sig-name descname">SimpleHTTPRequestHandler</code><span class="sig-paren">(</span><em class="sig-param">request</em>, <em class="sig-param">client_address</em>, <em class="sig-param">server</em>, <em class="sig-param">directory=None</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.SimpleHTTPRequestHandler" title="永久链接至目标"></a></dt>
<dd><p>这个类为当前目录及以下的文件提供服务直接映射目录结构到HTTP请求</p>
<p>诸如解析请求之类的大量工作都是由基类 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler" title="http.server.BaseHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseHTTPRequestHandler</span></code></a> 完成的。本类实现了 <a class="reference internal" href="#http.server.SimpleHTTPRequestHandler.do_GET" title="http.server.SimpleHTTPRequestHandler.do_GET"><code class="xref py py-func docutils literal notranslate"><span class="pre">do_GET()</span></code></a><a class="reference internal" href="#http.server.SimpleHTTPRequestHandler.do_HEAD" title="http.server.SimpleHTTPRequestHandler.do_HEAD"><code class="xref py py-func docutils literal notranslate"><span class="pre">do_HEAD()</span></code></a> 函数。</p>
<p>以下是 <a class="reference internal" href="#http.server.SimpleHTTPRequestHandler" title="http.server.SimpleHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">SimpleHTTPRequestHandler</span></code></a> 的类属性。</p>
<dl class="attribute">
<dt id="http.server.SimpleHTTPRequestHandler.server_version">
<code class="sig-name descname">server_version</code><a class="headerlink" href="#http.server.SimpleHTTPRequestHandler.server_version" title="永久链接至目标"></a></dt>
<dd><p>这会是 <code class="docutils literal notranslate"><span class="pre">&quot;SimpleHTTP/&quot;</span> <span class="pre">+</span> <span class="pre">__version__</span></code>,其中 <code class="docutils literal notranslate"><span class="pre">__version__</span></code> 定义于模块级别。</p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.SimpleHTTPRequestHandler.extensions_map">
<code class="sig-name descname">extensions_map</code><a class="headerlink" href="#http.server.SimpleHTTPRequestHandler.extensions_map" title="永久链接至目标"></a></dt>
<dd><p>A dictionary mapping suffixes into MIME types. The default is
signified by an empty string, and is considered to be
<code class="docutils literal notranslate"><span class="pre">application/octet-stream</span></code>. The mapping is used case-insensitively,
and so should contain only lower-cased keys.</p>
</dd></dl>
<dl class="attribute">
<dt id="http.server.SimpleHTTPRequestHandler.directory">
<code class="sig-name descname">directory</code><a class="headerlink" href="#http.server.SimpleHTTPRequestHandler.directory" title="永久链接至目标"></a></dt>
<dd><p>如果没有指定,要服务 目录是当前工作目录</p>
</dd></dl>
<p><a class="reference internal" href="#http.server.SimpleHTTPRequestHandler" title="http.server.SimpleHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">SimpleHTTPRequestHandler</span></code></a> 类定义了以下方法:</p>
<dl class="method">
<dt id="http.server.SimpleHTTPRequestHandler.do_HEAD">
<code class="sig-name descname">do_HEAD</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#http.server.SimpleHTTPRequestHandler.do_HEAD" title="永久链接至目标"></a></dt>
<dd><p>本方法为 <code class="docutils literal notranslate"><span class="pre">'HEAD'</span></code> 请求提供服务:它将发送等同于 <code class="docutils literal notranslate"><span class="pre">GET</span></code> 请求的头文件。关于合法头部信息的更完整解释,请参阅 <a class="reference internal" href="#http.server.SimpleHTTPRequestHandler.do_GET" title="http.server.SimpleHTTPRequestHandler.do_GET"><code class="xref py py-meth docutils literal notranslate"><span class="pre">do_GET()</span></code></a> 方法。</p>
</dd></dl>
<dl class="method">
<dt id="http.server.SimpleHTTPRequestHandler.do_GET">
<code class="sig-name descname">do_GET</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#http.server.SimpleHTTPRequestHandler.do_GET" title="永久链接至目标"></a></dt>
<dd><p>通过将请求解释为相对于当前工作目录的路径,将请求映射到某个本地文件。</p>
<p>如果请求被映射到目录,则会依次检查该目录是否存在 <code class="docutils literal notranslate"><span class="pre">index.html</span></code><code class="docutils literal notranslate"><span class="pre">index.htm</span></code> 文件。若存在则返回文件内容;否则会调用 <code class="xref py py-meth docutils literal notranslate"><span class="pre">list_directory()</span></code> 方法生成目录列表。本方法将利用 <a class="reference internal" href="os.html#os.listdir" title="os.listdir"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.listdir()</span></code></a> 扫描目录,如果 <a class="reference internal" href="os.html#os.listdir" title="os.listdir"><code class="xref py py-func docutils literal notranslate"><span class="pre">listdir()</span></code></a> 失败,则返回 <code class="docutils literal notranslate"><span class="pre">404</span></code> 出错应答。</p>
<p>如果请求被映射到文件,则会打开该文件。 打开文件时的任何 <a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">OSError</span></code></a> 异常都会被映射为 <code class="docutils literal notranslate"><span class="pre">404</span></code>, <code class="docutils literal notranslate"><span class="pre">'File</span> <span class="pre">not</span> <span class="pre">found'</span></code> 错误。 如果请求中带有 <code class="docutils literal notranslate"><span class="pre">'If-Modified-Since'</span></code> 标头,而在此时间点之后文件未作修改,则会发送 <code class="docutils literal notranslate"><span class="pre">304</span></code>, <code class="docutils literal notranslate"><span class="pre">'Not</span> <span class="pre">Modified'</span></code> 的响应。 否则会调用 <code class="xref py py-meth docutils literal notranslate"><span class="pre">guess_type()</span></code> 方法猜测内容的类型,该方法会反过来用到 <em>extensions_map</em> 变量,并返回文件内容。</p>
<p>将会输出 <code class="docutils literal notranslate"><span class="pre">'Content-type:'</span></code> 头部信息,带上猜出的内容类型,然后是 <code class="docutils literal notranslate"><span class="pre">'Content-Length:'</span></code> 头部信息,带有文件的大小,以及 <code class="docutils literal notranslate"><span class="pre">'Last-Modified:'</span></code> 头部信息,带有文件的修改时间。</p>
<p>后面是一个空行,标志着头部信息的结束,然后输出文件的内容。如果文件的 MIME 类型以 <code class="docutils literal notranslate"><span class="pre">text/</span></code> 开头,文件将以文本模式打开;否则将使用二进制模式。</p>
<p>用法示例请参阅 <a class="reference internal" href="#module-http.server" title="http.server: HTTP server and request handlers."><code class="xref py py-mod docutils literal notranslate"><span class="pre">http.server</span></code></a> 模块中的 <a class="reference internal" href="test.html#module-test" title="test: Regression tests package containing the testing suite for Python."><code class="xref py py-func docutils literal notranslate"><span class="pre">test()</span></code></a> 函数的实现。</p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.7 版更改: </span><code class="docutils literal notranslate"><span class="pre">'If-Modified-Since'</span></code> 头部信息提供支持。</p>
</div>
</dd></dl>
</dd></dl>
<p><a class="reference internal" href="#http.server.SimpleHTTPRequestHandler" title="http.server.SimpleHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">SimpleHTTPRequestHandler</span></code></a> 类的用法可如下所示,以便创建一个非常简单的 Web 服务,为相对于当前目录的文件提供服务:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">http.server</span>
<span class="kn">import</span> <span class="nn">socketserver</span>
<span class="n">PORT</span> <span class="o">=</span> <span class="mi">8000</span>
<span class="n">Handler</span> <span class="o">=</span> <span class="n">http</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">SimpleHTTPRequestHandler</span>
<span class="k">with</span> <span class="n">socketserver</span><span class="o">.</span><span class="n">TCPServer</span><span class="p">((</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">PORT</span><span class="p">),</span> <span class="n">Handler</span><span class="p">)</span> <span class="k">as</span> <span class="n">httpd</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;serving at port&quot;</span><span class="p">,</span> <span class="n">PORT</span><span class="p">)</span>
<span class="n">httpd</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
</pre></div>
</div>
<p id="http-server-cli"><a class="reference internal" href="#module-http.server" title="http.server: HTTP server and request handlers."><code class="xref py py-mod docutils literal notranslate"><span class="pre">http.server</span></code></a> 也可使用解释器的 <a class="reference internal" href="../using/cmdline.html#cmdoption-m"><code class="xref std std-option docutils literal notranslate"><span class="pre">-m</span></code></a> 开关加上 <code class="docutils literal notranslate"><span class="pre">port</span> <span class="pre">number</span></code> 参数直接发起调用。 与前面的例子类似,可支持相对于当前目录的文件:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">http</span><span class="o">.</span><span class="n">server</span> <span class="mi">8000</span>
</pre></div>
</div>
<p>默认情况下HTTP 服务器将绑定所有的网络接口。参数 <code class="docutils literal notranslate"><span class="pre">-b/--bind</span></code> 可指定需绑定的地址。IPv4 和 IPv6 均可。比如以下命令可让 HTTP 服务器只与 localhost 绑定:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">http</span><span class="o">.</span><span class="n">server</span> <span class="mi">8000</span> <span class="o">--</span><span class="n">bind</span> <span class="mf">127.0.0.1</span>
</pre></div>
</div>
<div class="versionadded">
<p><span class="versionmodified added">3.4 新版功能: </span>引入了 <code class="docutils literal notranslate"><span class="pre">--bind</span></code> 参数。</p>
</div>
<div class="versionadded">
<p><span class="versionmodified added">3.8 新版功能: </span>为了支持 IPv6 改进了 <code class="docutils literal notranslate"><span class="pre">--bind</span></code> 参数。</p>
</div>
<p>HTTP 服务器默认使用当前目录。参数 <code class="docutils literal notranslate"><span class="pre">-d/--directory</span></code> 可指定文件所在的目录。比如以下命令就指定了一个目录:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">http</span><span class="o">.</span><span class="n">server</span> <span class="o">--</span><span class="n">directory</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span>
</pre></div>
</div>
<div class="versionadded">
<p><span class="versionmodified added">3.7 新版功能: </span><code class="docutils literal notranslate"><span class="pre">--directory</span></code> 指定备用目录</p>
</div>
<dl class="class">
<dt id="http.server.CGIHTTPRequestHandler">
<em class="property">class </em><code class="sig-prename descclassname">http.server.</code><code class="sig-name descname">CGIHTTPRequestHandler</code><span class="sig-paren">(</span><em class="sig-param">request</em>, <em class="sig-param">client_address</em>, <em class="sig-param">server</em><span class="sig-paren">)</span><a class="headerlink" href="#http.server.CGIHTTPRequestHandler" title="永久链接至目标"></a></dt>
<dd><p>该类可为当前及以下目录中的文件或输出 CGI 脚本提供服务。注意,把 HTTP 分层结构映射到本地目录结构,这与 <a class="reference internal" href="#http.server.SimpleHTTPRequestHandler" title="http.server.SimpleHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">SimpleHTTPRequestHandler</span></code></a> 完全一样。</p>
<div class="admonition note">
<p class="admonition-title">注解</p>
<p><a class="reference internal" href="#http.server.CGIHTTPRequestHandler" title="http.server.CGIHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">CGIHTTPRequestHandler</span></code></a> 类运行的 CGI 脚本不能进行重定向操作HTTP 代码302因为在执行 CGI 脚本之前会发送代码 200接下来就输出脚本。这样状态码就冲突了。</p>
</div>
<p>然而,如果这个类猜测它是一个 CGI 脚本,那么就会运行该 CGI 脚本,而不是作为文件提供出去。 只会识别基于目录的 CGI —— 另有一种常用的服务器设置,即标识 CGI 脚本是通过特殊的扩展名。</p>
<p>如果请求指向 <code class="docutils literal notranslate"><span class="pre">cgi_directories</span></code> 以下的路径,<code class="xref py py-func docutils literal notranslate"><span class="pre">do_GET()</span></code><code class="xref py py-func docutils literal notranslate"><span class="pre">do_HEAD()</span></code> 函数已作修改,不是给出文件,而是运行 CGI 脚本并输出结果。</p>
<p><a class="reference internal" href="#http.server.CGIHTTPRequestHandler" title="http.server.CGIHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">CGIHTTPRequestHandler</span></code></a> 定义了以下数据成员:</p>
<dl class="attribute">
<dt id="http.server.CGIHTTPRequestHandler.cgi_directories">
<code class="sig-name descname">cgi_directories</code><a class="headerlink" href="#http.server.CGIHTTPRequestHandler.cgi_directories" title="永久链接至目标"></a></dt>
<dd><p>默认为 <code class="docutils literal notranslate"><span class="pre">['/cgi-bin',</span> <span class="pre">'/htbin']</span></code>,视作 CGI 脚本所在目录。</p>
</dd></dl>
<p><a class="reference internal" href="#http.server.CGIHTTPRequestHandler" title="http.server.CGIHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">CGIHTTPRequestHandler</span></code></a> 定义了以下方法:</p>
<dl class="method">
<dt id="http.server.CGIHTTPRequestHandler.do_POST">
<code class="sig-name descname">do_POST</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#http.server.CGIHTTPRequestHandler.do_POST" title="永久链接至目标"></a></dt>
<dd><p>本方法服务于 <code class="docutils literal notranslate"><span class="pre">'POST'</span></code> 请求,仅用于 CGI 脚本。如果试图向非 CGI 网址发送 POST 请求,则会输出错误 501Can only POST to CGI scripts&quot;</p>
</dd></dl>
<p>请注意为了保证安全性CGI 脚本将以用户 nobody 的 UID 运行。CGI 脚本运行错误将被转换为错误 403。</p>
</dd></dl>
<p>通过在命令行传入 <code class="docutils literal notranslate"><span class="pre">--cgi</span></code> 参数,可以启用 <a class="reference internal" href="#http.server.CGIHTTPRequestHandler" title="http.server.CGIHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">CGIHTTPRequestHandler</span></code></a> </p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">http</span><span class="o">.</span><span class="n">server</span> <span class="o">--</span><span class="n">cgi</span> <span class="mi">8000</span>
</pre></div>
</div>
<section id="security-considerations">
<span id="http-server-security"></span><h2>安全考量<a class="headerlink" href="#security-considerations" title="永久链接至标题"></a></h2>
<p id="index-3">当处理请求时,<a class="reference internal" href="#http.server.SimpleHTTPRequestHandler" title="http.server.SimpleHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">SimpleHTTPRequestHandler</span></code></a> 会解析符号链接,这有可能使得指定文件夹以外的文件被暴露。</p>
<p>较早版本的 Python 不会擦除从 <code class="docutils literal notranslate"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">http.server</span></code> 或默认的 <a class="reference internal" href="#http.server.BaseHTTPRequestHandler" title="http.server.BaseHTTPRequestHandler"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseHTTPRequestHandler</span></code></a> <code class="docutils literal notranslate"><span class="pre">.log_message</span></code> 实现发送到 stderr 的日志消息中的控制字符。 这可以允许连接到你的服务器的远程客户端向你的终端发送邪恶的控制代码。</p>
<div class="versionadded">
<p><span class="versionmodified added">3.8.16 新版功能: </span>scrubbing control characters from log messages</p>
</div>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h3><a href="../contents.html">目录</a></h3>
<ul>
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">http.server</span></code> --- HTTP 服务器</a><ul>
<li><a class="reference internal" href="#security-considerations">安全考量</a></li>
</ul>
</li>
</ul>
<h4>上一个主题</h4>
<p class="topless"><a href="socketserver.html"
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">socketserver</span></code> --- 用于网络服务器的框架</a></p>
<h4>下一个主题</h4>
<p class="topless"><a href="http.cookies.html"
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">http.cookies</span></code> --- HTTP状态管理</a></p>
<div role="note" aria-label="source link">
<h3>本页</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">报告 Bug</a></li>
<li>
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/http.server.rst"
rel="nofollow">显示源代码
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>导航</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="总目录"
>索引</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python 模块索引"
>模块</a> |</li>
<li class="right" >
<a href="http.cookies.html" title="http.cookies --- HTTP状态管理"
>下一页</a> |</li>
<li class="right" >
<a href="socketserver.html" title="socketserver --- 用于网络服务器的框架"
>上一页</a> |</li>
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> &#187;</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.8.20 Documentation</a> &#187;
</li>
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="internet.html" >互联网协议和支持</a> &#187;</li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
<input type="submit" value="转向" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
|
</li>
</ul>
</div>
<div class="footer">
&copy; <a href="../copyright.html">版权所有</a> 2001-2024, Python Software Foundation.
<br />
This page is licensed under the Python Software Foundation License Version 2.
<br />
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
<br />
<br />
The Python Software Foundation is a non-profit corporation.
<a href="https://www.python.org/psf/donations/">Please donate.</a>
<br />
<br />
最后更新于 12月 09, 2024.
<a href="https://docs.python.org/3/bugs.html">Found a bug</a>?
<br />
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 2.4.4.
</div>
</body>
</html>