gpt4 book ai didi

python - 如何将参数传递给 RequestHandler?

转载 作者:IT老高 更新时间:2023-10-28 22:21:43 25 4
gpt4 key购买 nike

Python 文档包括 an example of creating an HTTP server :

def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()

RequestHandler 类被提供给 Server,然后它负责自动实例化处理程序。

假设我想在创建请求处理程序时将自定义参数传递给它。我应该怎么做?

更具体地说,我想从命令行传入参数,并且必须访问请求处理程序类中的 sys.argv 似乎不必要地笨重。

似乎这应该可以通过覆盖 Server 类的某些部分来实现,但我觉得我忽略了一个更简单更好的解决方案。

最佳答案

我使用“部分应用程序”在我的代码中解决了这个问题。

示例是使用 Python 3 编写的,但部分应用程序在 Python 2 中的工作方式相同:

from functools import partial
from http.server import HTTPServer, BaseHTTPRequestHandler

class ExampleHandler(BaseHTTPRequestHandler):
def __init__(self, foo, bar, qux, *args, **kwargs):
self.foo = foo
self.bar = bar
self.qux = qux
# BaseHTTPRequestHandler calls do_GET **inside** __init__ !!!
# So we have to call super().__init__ after setting attributes.
super().__init__(*args, **kwargs)

def do_HEAD(self):
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()

def do_GET(self):
self.do_HEAD()
self.wfile.write('{!r} {!r} {!r}\n'
.format(self.foo, self.bar, self.qux)
.encode('utf8'))

# We "partially apply" the first three arguments to the ExampleHandler
handler = partial(ExampleHandler, sys.argv[1], sys.argv[2], sys.argv[3])
# .. then pass it to HTTPHandler as normal:
server = HTTPServer(('', 8000), handler)
server.serve_forever()

这与类工厂非常相似,但在我看来它有几个微妙的优势:

  • partial 对象比工厂函数定义和返回的嵌套类更容易自省(introspection)。
  • partial 对象可以在现代 Python 中使用 pickle 进行序列化,而工厂函数中的嵌套类定义则不能(至少在不费心编写 __reduce__ 方法使其成为可能)。
  • 根据我有限的经验,将带有 partial 的参数显式“预先附加”到其他 Pythonic 和普通类定义更容易(更少的认知负担)阅读和理解,并验证正确性,而不是嵌套类定义,其中包含隐藏在其中某处的包装函数的参数。

唯一真正的缺点是很多人不熟悉 partial - 但根据我的经验,每个人 最好熟悉 partial 无论如何,因为 partial 有一种在许多地方作为一种简单且可组合的解决方案弹出的方式,有时是出乎意料的,比如这里。

关于python - 如何将参数传递给 RequestHandler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21631799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com