2

从in的render_GET方法,是否可以完全重定向到不同的 url(托管在其他地方)Resourcetwisted

request.redirect(url)似乎没有做任何事情,也没有twisted.web.util.Redirect

php中的等价物是,

header('location:'.$url);

编辑

这是我正在运行的代码

from twisted.web import server, resource
from twisted.internet import reactor

class Simple(resource.Resource):
    isLeaf = True
    def render_GET(self, request):
        request.redirect("www.google.com")
        request.finish()

site = server.Site(Simple())
reactor.listenTCP(8080, site)
reactor.run()
4

3 回答 3

4

最后我在另一张海报的帮助下解决了这个问题request.finish(),重定向包括http://并返回NOT_DONE_YET

from twisted.web import server, resource
from twisted.internet import reactor

class Simple(resource.Resource):
    isLeaf = True
    def render_GET(self, request):
        request.redirect("http://www.google.com")
        request.finish()
        return server.NOT_DONE_YET

site = server.Site(Simple())
reactor.listenTCP(8080, site)
reactor.run()
于 2012-10-25T21:18:07.973 回答
3

Location标头需要绝对网址,例如http://example.com.

302 Found响应代码表明我们应该提供一个简短的超文本注释,其中包含指向新 URI 的超链接。redirectTo()正是这样做的:

from twisted.web import server, resource
from twisted.web.util import redirectTo
from twisted.internet import reactor

class HelloResource(resource.Resource):
    isLeaf = True
    
    def render_GET(self, request):
        return redirectTo('http://example.com', request)

reactor.listenTCP(8080, server.Site(HelloResource()))
reactor.run()

或使用Redirect

from twisted.web import server
from twisted.web.util import Redirect
from twisted.internet import reactor

reactor.listenTCP(8080, server.Site(Redirect("http://example.com")))
reactor.run()

或者只是使用webtwistd插件,放入redirect.rpy文件:

from twisted.web.util import Redirect

resource = Redirect("http://example.com")

跑:

$ twistd -n web --port tcp:8080:localhost --resource-script redirect.rpy

只是为了演示,下面是实现的redirectTo()样子:

def redirect_to(url, request):
    request.setResponseCode(302) # Found
    request.setHeader("Location", url)
    request.setHeader("Content-Type", "text/html; charset=UTF-8")
    return """put html with a link to %(url)s here""" % dict(url=url) # body
于 2012-10-26T02:50:31.520 回答
1

您应该能够通过使用request.redirect(url)然后调用来重定向request.finish()。请确认您正在呼叫request.finish()

于 2012-10-25T20:25:41.253 回答