将http重定向到https以扭曲
在Twisted Web中生成重定向的简单方法是使用Redirect资源。使用URL实例化它并将其放入资源层次结构中。如果它被渲染,它会返回一个重定向响应于网址:
from twisted.web.util import Redirect
from twisted.web.resource import Resource
from twisted.web.server import Site
from twisted.internet import reactor
root = Resource()
root.putChild("foo", Redirect("https://stackoverflow.com/"))
reactor.listenTCP(8080, Site(root))
reactor.run()
这将运行它响应了http://localhost:8080/一个重定向至https://stackoverflow.com/请求的服务器。
如果你在主持的HTTPS服务器上的WSGI容器中运行的Django,那么你可能有一些代码看起来是这样的:
from twisted.internet import reactor
from twisted.web.wsgi import WSGIResource
from twisted.web.server import Site
from django import some_wsgi_application_object # Not exactly
root = WSGIResource(reactor, reactor.getThreadPool(), some_wsgi_application_object)
reactor.listenSSL(8443, Site(root), contextFactory)
reactor.run()
您可以运行它产生的重定向额外的HTTP服务器,你只需添加一些代码从第一个例子,第二个例子想:
from twisted.internet import reactor
from twisted.web.wsgi import WSGIResource
from twisted.web.util import Redirect
from twisted.web.server import Site
from django import some_wsgi_application_object # Not exactly
root = WSGIResource(reactor, reactor.getThreadPool(), some_wsgi_application_object)
reactor.listenSSL(8443, Site(root), contextFactory)
old = Redirect("https://localhost:8443/")
reactor.listenTCP(8080, Site(old))
reactor.run()
正确,但对于HTTPS重定向,您希望不重定向到固定URL,而是重定向到URL a)用户输入的任何主机名或地址,以及b)用户输入的服务器上的相同路径。 (例如,我会在apache mod_rewrite中使用'RewriteRule^var/www-redirect /(.*)$ https://%{SERVER_NAME}/$ 1 [R,L]')来执行此操作。这是可能的重定向资源或其他方式扭曲? – rakslice 2011-05-19 04:05:28
呃,我的mod_rewrite例子是用于文档根目录'/ var/www-redirect'的重定向站点。 =) – rakslice 2011-05-19 04:11:52
当然。 'Redirect'实际上是一个非常简单的类,
从任何给定的路径上HTTP重定向到同一路径上的HTTPS (基于让 - 保罗的建议响应我的评论):
from twisted.python import urlpath
from twisted.web import resource, util
class RedirectToScheme(resource.Resource):
"""
I redirect to the same path at a given URL scheme
@param newScheme: scheme to redirect to (e.g. https)
"""
isLeaf = 0
def __init__(self, newScheme):
resource.Resource.__init__(self)
self.newScheme = newScheme
def render(self, request):
newURLPath = request.URLPath()
if newURLPath.scheme != self.newScheme:
raise ValueError("Redirect loop: we're trying to redirect to the same URL scheme in the request")
newURLPath.scheme = self.newScheme
return util.redirectTo(newURLPath, request)
def getChild(self, name, request):
return self
然后你可以使用RedirectToScheme("https")
,代替你的Site()
为您希望从重定向HTTP站点。
注意:如果您想要从其重定向的HTTP位于非标准端口上,那么URLRequest中可能还有一个:<port>
部分,您还需要重写该部分。
这用于工作,因为redirectTo用于取其第一个参数(此处为'newURLPath')并将其插入到具有'%s'的字符串中。然而,更新版本的Twisted已经改变为做其他事情。现在将一个'URLPath'传递给'redirectTo'是一个错误。这种感觉就像Twisted中的一种回归 - 但'redirectTo'被记录为在之前(现在是'bytes')采用'str'。所以......人们也可以说这是对API的错误使用。无论如何,为了实现这个目标,你应该在将'newURLPath'传递给'redirectTo'''bytes(newURLPath)'之前将它砸成一个字节字符串。 – 2016-11-21 14:38:03
请详细说明您如何使用Twisted运行您的Django应用程序。 – MattH 2011-03-15 15:45:07