跳转到主要内容

基于BaseHTTPServer构建的HTTP服务器和请求处理程序,适用于带有Web界面的树莓派项目

项目描述

基于Python标准库的BaseHTTPServer构建的HTTP服务器和请求处理程序。最初是为带有Web界面的树莓派项目设计的,这个小型的Web服务器和相关的请求处理程序向BaseHTTPServer添加了一些有趣的功能,并且可以独立于树莓派使用。

提供的示例展示了如何创建一个简单的Web界面来通过树莓派的GPIO开关LED。

功能

  • json文件配置

  • 可选的多线程服务器

  • 带有缓存的静态文件服务

  • 基本身份验证(非常基本!)

  • POST解析

  • QS解析

  • 基于配置或约定的动态路由

  • 钩子方法,在处理请求前后执行不同的操作

基本用法

如果您熟悉Python标准库的BaseHTTPServer和BaseHTTPRequestHandler,应该非常简单:将一个名为routed_<request>的方法添加到您的处理程序类中,以处理/<request> URL的请求,并将self.content属性设置为要通过HTTP提供的HTML字符串。

class MyHandler(RPiHTTPRequestHandler):
  def routed_whatever:
  # your method definition to serve http://<my_address>:<my_port>/whatever
    # do cool stuff
    self.content = "<html><body>whatever</body></html>"

MyServer = RPiHTTPServer(path_to_config_file, MyHandler)
MyServer.serve_forever()

默认配置

{
  "SERVER_ADDRESS": "0.0.0.0",
  "SERVER_PORT": 8000,
  "SERVER_MULTITHREADED": true,
  "STATIC_URL_PREFIX": "/static",
  "STATIC_FOLDER":  "$CWD/static",
  "STATIC_CACHE": 604800,
  "TEMPLATE_FOLDER": "$CWD/templates",
  "ROUTE": {
    "GET": {
      "": "default_response",
    },
    "POST": {
      "": "default_response",
    }
  }
}

请注意:$CWD代表“当前工作目录”,但如果没有配置文件,则默认为配置文件的目录。

详细说明

配置文件

请按照上述默认配置的格式,以JSON格式准备您的配置文件。任何缺失的键都将被默认值替换(例如:如果您没有指定端口,服务器将尝试在端口80上监听)。

添加您可能需要的任何额外的配置参数,例如"GPIO_PIN": 5

目前请保持"ROUTE"不变(关于路由的更多信息请参阅下文)。

静态文件

如果您想要能够提供静态内容,例如图片、CSS、字体、JavaScript等,请为这些文件准备一个文件夹,并将绝对路径放入配置参数 "STATIC_FOLDER" 中。

您可以直接从名为 "static" 的子目录中提供静态内容,该子目录位于您的Python脚本所在的目录下:在这种情况下,只需在配置文件中省略 "STATIC_FOLDER" 参数。

配置参数 "STATIC_URL_PREFIX" 识别虚拟路径,该路径用于从HTTP中访问静态文件。例如,如果您保留默认的 "STATIC_URL_PREFIX",并且您有一个名为“foo.png”的图像位于配置的 "STATIC_FOLDER" 中,那么它将通过HTTP在以下位置提供:

http://<your_server_address>:<your_port>/static/foo.png

Python 脚本

现在,在您的Python脚本中,您需要通过扩展 RPiHTTPRequestHandler 类来定义逻辑。默认情况下,HTTP服务器的每个请求都映射到扩展类的一个方法,该方法的名称与请求的名称相同,前面加上 routed_

例如,对 http://<your_server_address>:<your_port>/switchon 的请求将查找请求处理类中的 routed_switchon 方法。如果该方法不可用,服务器将简单地返回404错误。

如果您想要为请求指定自定义方法,请在 "ROUTE" 配置参数中定义该方法。您几乎肯定需要定义(或覆盖)的方法之一是 default_response(对 / URL 的请求)。

映射的方法只需要设置 self.content 变量(作为一个字符串),然后将以 text/html; charset=UTF-8(默认MIME类型)的内容类型通过HTTP提供这样的内容。

在这种情况下,您的代码可能如下所示

class MyHandler(RPiHTTPRequestHandler):

  def routed_switchon(self):
    # DO something cool, e.g.: GPIO.output(self.config["GPIO_PIN"], GPIO.HIGH)
    self.content = "<!DOCTYPE html><html><h1>Switch on</h1></html>"

  def routed_switchoff(self):
    # DO something cool, e.g.: GPIO.output(self.config["GPIO_PIN"], GPIO.LOW)
    self.content = "<!DOCTYPE html><html><h1>Switch off</h1></html>"

MyServer = RPiHTTPServer("/path/to/config.json", MyHandler)
MyServer.serve_forever()

从上面示例中的注释中可以看出,您可以通过 self.config["PARAMETER_NAME"] 访问配置参数。您还可以向 RPiHTTPServer 实例的 server 属性中添加额外的属性,从而使它们在请求处理类中通过 self.server.PROPERTY_NAME 可用。例如,根据上面的示例,您可以编写以下代码:

MyServer = RPiHTTPServer("/path/to/config.json", MyHandler)
MyServer.server.switch_status = 0
MyServer.serve_forever()

现在在 MyHandler 中,您可以通过 self.server.switch_status 访问 switch_status

在设置 self.content 之前可以指定/更改的其他属性

  • self.content_type:默认设置为“text/html; charset=UTF-8”

  • self.response_status:整数,默认设置为200

  • self.response_headers:默认为空字典,在发送响应回客户端之前将自动填充 Content-Type 和 Content-Length。设置额外的字典键以提供额外的头信息。

在请求处理类中可用的其他有用属性

在当前阶段,该库不提供对参数化路由的支持。

钩子

可在您扩展的类中实现的可用的钩子方法

  • pre_handle_request:在处理HTTP请求之前执行,即在评估路由和身份验证之前,但在评估GET、POST方法和客户端发送的参数之后。在请求静态文件的情况下不会执行。

  • pre_call_controller:在控制器建立并验证身份验证后执行,但在调用实际控制器方法之前。

  • pre_serve_response:在控制器执行后但在发送任何响应内容回客户端之前执行。在404错误、静态文件或身份验证失败的情况下不会执行。

  • post_serve_response:在响应发送回客户端后执行。在静态文件或身份验证失败的情况下不会执行(但对于404错误会执行)。

HTML模板

该库仅提供非常基本的模板处理。RPiHTTPRequestHandler类的render_template方法期望一个文件名和一个字典,并将内容设置为字符串。它将在self.config["TEMPLATE_FOLDER"](如果配置文件中没有指定,则默认为运行python脚本的目录下的“templates”文件夹)中查找指定名称的文件。然后,它将循环字典的键作为要替换的字符串,相应的值作为替换。最后,它将content属性设置为生成的字符串。

这是一个极其简单且效率低下的模板处理方法:如果您需要更好的模板处理,有很多更好的库(例如Jinja2、Pystache)。最终,您必须将self.content变量设置为将通过HTTP提供的字符串(以提供默认的text/html内容类型)。

请注意,默认情况下将提供UTF-8,目前没有计划支持其他字符集。

待办事项

  • 说明如何配置基本身份验证

  • 支持Python 3k

  • 处理配置文件解析错误

  • 参数化路由

  • 在URL请求中清理路径

  • 处理文件上传

  • 安全处理POST请求中的非UTF-8字符

项目详情


下载文件

下载您平台上的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

RPiHTTPServer-0.4.2.tar.gz (9.3 kB 查看哈希值

上传时间

由以下赞助

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面