2011-03-15 10 views
3

나는 꼬인 것을 사용하여 장고 앱을 운영하고 있습니다. 나는 지금 http에서 https로 이사했다. HTTP에서 https로 트위스트 된 리디렉션을 추가하려면 어떻게합니까?HTTP를 https로 트위스트로 리다이렉트

+0

Django 앱을 실행하는 데 Twisted를 어떻게 사용하는지 자세히 설명하십시오. – MattH

답변

3

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

https://stackoverflow.com/에 리디렉션와 http://localhost:8080/에 대한 요청에 응답하는 서버를 실행합니다. 당신이 HTTPS 서버에서 호스팅 WSGI 컨테이너에 장고를 실행하는 경우

, 당신은 다음과 같이 보이는 코드이있을 수 있습니다

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 서버를 실행할 수 있습니다 당신 바로 첫 번째 예에서이 두 번째 예제에 일부 코드를 추가하여 원하는 님의 질문에 답변 장 폴의 제안에 따라 HTTPS (에 동일한 경로에 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() 
+0

맞긴하지만 HTTPS 리디렉션의 경우 고정 URL이 아닌 URL에 a) 사용자가 입력 한 호스트 이름 또는 주소와 b) 사용자가 입력 한 서버의 동일한 경로로 리디렉션합니다. (예 : 아파치 mod_rewrite에서'RewriteRule^var/www-redirect /(.*)$ https : // % {SERVER_NAME}/$ 1 [R, L]'). 리디렉션 리소스 또는 다른 방식으로 트위스트로 가능합니까? – rakslice

+0

어, 내 mod_rewrite 예제는 문서 루트가'/ var/www-redirect' 인 리디렉션 사이트 용입니다. =) – rakslice

+1

예. 'Redirect'는 실제로 매우 간단한 클래스입니다. . 요청에서 호스트 이름을 가져와 리디렉션에 사용하도록 확장 할 수 있습니다. 'ChildRedirector'를 보면 요청 경로를 보존하는 방법을 볼 수 있습니다. –

4

내 코멘트) :

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 

그럼 당신은 당신이에서 리디렉션 할 HTTP 사이트에 대한 귀하의 Site() 대신에, RedirectToScheme("https")를 사용할 수 있습니다.

참고 : 리디렉션하려는 HTTP가 비표준 포트에있는 경우 다시 작성해야하는 URL 요청에 :<port> 부분이있을 것입니다.

+0

redirectTo가 첫 번째 인수 (여기서는'newURLPath')를 사용하고 '% s'이 (가) 문자열에 삽입했기 때문에이 함수가 사용되었습니다. 그러나 Twisted의 최신 버전은 다른 작업을하는 것으로 바뀌 었습니다. 'redirectTo'에'URLPath'를 전달하는 것은 이제 오류입니다. 이것은 Twisted에서 회귀와 같은 느낌이 들지만'redirectTo '는'str'을 앞두고 (지금은'bytes') 취한 것으로 기록되어 있습니다. 그래서 ... 이것은 또한 API의 오용이라고 주장 할 수 있습니다. 어쨌든,이 작업을하기 위해서는'newURLPath'를'redirectTo' -'bytes (newURLPath)'에 전달하기 전에 바이트 문자열에 넣어야합니다. –

관련 문제