基于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。设置额外的字典键以提供额外的头信息。
在请求处理类中可用的其他有用属性
self.config:提供对配置的访问
self.url:请求路径的 urlparse 结果(参见 https://docs.pythonlang.cn/2/library/urlparse.html)
self.qs:包含解析查询字符串 urlparse.parse_qs 的参数的字典
self.form:包含解析 POST 请求参数的 cgi.FieldStorage(参见 https://docs.pythonlang.cn/2/library/cgi.html#higher-level-interface)
self.request_xhr:如果请求通过 xhr 发起,则设置为 true 的布尔值
在当前阶段,该库不提供对参数化路由的支持。
钩子
可在您扩展的类中实现的可用的钩子方法
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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3189dec6b52da8dfda15bf97f0fe78616fe35e5f6c4fb07e615a28eb3acfc106 |
|
MD5 | 963df27490420239e38c7d39d139c5f4 |
|
BLAKE2b-256 | f08ff1baa69f4cfe1e1c138bd65896629ba4bd8092f50e8c10abe19ee701ca89 |