2015-02-05 1 views
4

파이썬의 WSGI를 사용하여 소규모 웹 응용 프로그램을 개발하려고합니다. 사용자가 구글을 선택하는 경우 예를 들어, 그들은이 코드를 실행할 때 등WSGI (프레임 워크 없음)로 URL 리디렉션

from wsgiref.simple_server import make_server 
from cgi import parse_qs, escape 

main_html = """ 
<html> 
<head><title> Welcome to redirection test page </title> </head> 
<body> 
    <form method="get" action='/visit'> 
     <input type=radio name='site' value=google> Google 
     <input type=radio name='site' value=facebook> Facebook 
     <input type=submit value=submit> 
    </form> 
</body> 
</html> 
""" 


def main(environ, start_response): 

    response_body = main_html 
    print type(response_body) 
    status = '200 OK' 

    response_headers = [ 
         ('Content-Type','text/html'), 
         ('Content-Length', str(len(response_body))) 
         ] 


    start_response(status, response_headers) 
    return [response_body] 


def visit(environ, start_response): 
    qs = parse_qs(environ['QUERY_STRING']) 
    dest = qs.ge('site')[0] 
    if dest == 'google': 
     start_response('301 Moved Permanently', [('Location','http://google.com')]) 
    else: 
     start_response('301 Moved Permanently', [('Location','http://facebook.com')]) 

    return [1] 


def app(environ, start_response): 
    if environ['PATH_INFO'] == '/': 
     return main(environ, start_response) 
    elif environ['PATH_INFO'] == '/visit': 
     return visit(environ, start_response) 

httpd = make_server('192.168.48.128',8052, app) 
print 'Serving on port 8052' 
httpd.serve_forever() 

그러나, 내가 얻을, 그들은 페이스 북을 선택한 경우 그들이 facebook.com로 리디렉션 것, google.com로 리디렉션 될 것이다 다음 오류 :

Traceback (most recent call last): 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 86, in run 
    self.finish_response() 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 131, in finish_response 
    self.close() 
    File "/usr/lib/python2.7/wsgiref/simple_server.py", line 33, in close 
    self.status.split(' ',1)[0], self.bytes_sent 
AttributeError: 'NoneType' object has no attribute 'split' 
+0

. 완전한 [SSCCE] (http://sscce.org/)는 도움이 될 것입니다 – Dannnno

+0

이것은 완전한 SSCCE로 작동하는 유일한 파일입니다. 1. 서버를 시작합니다. 2. 색인 페이지를 엽니 다. 3. Oauth를 사용하여 Google 인증. 누락 된 부분에 대해 자세히 설명해주십시오. – logicalgeek

+0

그러면 SSCCE – Dannnno

답변

5

visit() 두 가지 문제가 있습니다. 첫 번째는 오타이고, 두 번째는 라인 dest = qs.ge('site')[0]에서 WSGI specification

def visit(environ, start_response): 
    qs = parse_qs(environ['QUERY_STRING']) 
    dest = qs.ge('site')[0] 
    if dest == 'google': 
     start_response('301 Moved Permanently', [('Location','http://google.com')]) 
    else: 
     start_response('301 Moved Permanently', [('Location','http://facebook.com')]) 

    return [1] 

룩을 준수하기 위해 실패합니다. qs은 사전 일 뿐이며 ge이라는 메서드가 없습니다. 단지 get입니다. 또한 cgi.parse_qs is deprecated - urlparse.parse_qs()을 대신 사용하십시오. 그 고정은 (난 그냥 로컬 호스트의 해제를 실행하기 때문에 내 주소는 127.0.0.1입니다) 우리에게 새로운 오류를 가져옵니다이 뭔가 문자열 수 있지만없는 것을 우리에게 알려줍니다

127.0.0.1 - - [05/Feb/2015 16:45:17] "GET /visit?site=facebook HTTP/1.1" 302 0 
Traceback (most recent call last): 
    File "C:\Python27\lib\wsgiref\handlers.py", line 86, in run 
    self.finish_response() 
    File "C:\Python27\lib\wsgiref\handlers.py", line 128, in finish_response 
    self.write(data) 
    File "C:\Python27\lib\wsgiref\handlers.py", line 204, in write 
    assert type(data) is StringType, "write() argument must be string" 
AssertionError: write() argument must be string 

합니다. 반환 라인에서 visit()을 다시 보면 문제가 드러납니다. ['1'] 대신 [1]을 반환합니다. 그 오류를 수정하면 모든 것이 잘 작동합니다. 이 동작은 this answer에 따라, 당신은 아마 리디렉션에 대한 '302 Found' 상태 대신 '301 Moved Permanently'를 사용한다 PEP 333

The start_response callable must return a write(body_data) callable that takes one positional parameter: a string to be written as part of the HTTP response body.

마지막에 설명되어 있음을 확인할 수 있지만, 어느 방식으로 작동합니다.

문제를 해결해야이 가진 기능을 교체 : 우리는보다 더 많은 정보를 필요로하기 위하여려고하고있다

def visit(environ, start_response): 
    qs = parse_qs(environ['QUERY_STRING']) 
    dest = qs.get('site')[0] 
    if dest == 'google': 
     start_response('302 Found', [('Location','http://google.com')]) 
    else: 
     start_response('302 Found', [('Location','http://facebook.com')]) 

    return ['1'] 
+0

깊은 대답에 감사드립니다. 이 문제가 해결되었습니다. – logicalgeek

관련 문제