перенаправить http на https в витой - PullRequest
4 голосов
/ 15 марта 2011

Я запускаю приложение django, используя витую.Теперь я перешел с http на https.Как я могу добавить перенаправления с http на https в витой?

Ответы [ 2 ]

5 голосов
/ 20 мая 2011

Для перенаправления с любого заданного пути по 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()
        # TODO Double check that == gives the correct behaviour here
        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, с которого вы хотите перенаправить, находится на нестандартном порту, вы, вероятно, будете иметь часть :<port> в URLRequest, которую вам также нужно будет переписать.

4 голосов
/ 18 марта 2011

Простой способ создания перенаправлений в Twisted Web - это ресурс Redirect . Создайте его с помощью URL и поместите в иерархию ресурсов. Если он будет обработан, он вернет ответ перенаправления на этот 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/.

Если вы запускаете Django в контейнере WSGI, размещенном на HTTPS-сервере, возможно, у вас есть код, который выглядит примерно так:

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()
...