覆盖来自Twisted.web的所有默认资源/响应
问题描述:
对于超基本的http扭曲前端。 我怎样才能确保没有HTML写回,除非我告诉它。覆盖来自Twisted.web的所有默认资源/响应
所以,我有我/动物园网址下面。 对于任何回溯,或'没有这样的资源'的回应,我想删除连接或返回一个空的回应。
我想这是一个超级简单的,但无法弄清楚:) 我知道我可以做到这一点,没有我的具体儿童路径,但想要做到这一点高效率,只是想放弃它作为尽可能早..也许不使用资源?
class HttpApi(resource.Resource):
isLeaf = True
def render_POST(self, request):
return "post..."
application = service.Application("serv")
json_api = resource.Resource()
json_api.putChild("zoo", HttpApi())
web_site = server.Site(json_api)
internet.TCPServer(8001, web_site).setServiceParent(application)
答
一些基础知识第一
twisted.web的工作原理是
有一个叫Site类,这是一个HTTP工厂的方式。 这是为每个请求调用的。实际上,调用一个名为getResourceFor的函数来获取将提供此请求的适当资源。 本网站类使用根资源进行初始化。而根资源Site.getResourceFor调用resource.getChildForRequest功能
呼叫流程是:
Site.getResourceFor - > resource.getChildForRequest(根资源)
现在是时候看看在getChildForRequest:
def getChildForRequest(resource, request):
"""
Traverse resource tree to find who will handle the request.
"""
while request.postpath and not resource.isLeaf:
pathElement = request.postpath.pop(0)
request.prepath.append(pathElement)
resource = resource.getChildWithDefault(pathElement, request)
return resource
会发生什么是因为资源注册与putChild(路径),他们成为奇尔该资源的资源。 一个例子:
root_resource
|
|------------ resource r1 (path = 'help')
|----resource r2 (path = 'login') |
| |----- resource r3 (path = 'registeration')
| |----- resource r4 (path = 'deregistration')
的一些思考:
- 现在R1将与路径服务器请求http://../help/
- 现在R3将与路径服务器请求http://../help/registration/
- 现在R4将与路径http://../help/deregistration/服务器请求
但
- R3将与路径服务器请求http://../help/registration/xxx/
- R3将与路径http://../help/registration/yyy/
对于解决服务器的请求:
您需要继承站点到
- 检查如果路径excatly匹配与pathElement资源返回空,然后才处理它或
- 回报,这将是你的处理程序来处理其他方面
您必须创建自己的资源的资源
def render(self, request):
request.setResponseCode(...)
return ""