[英]Redirect a user to url with WSGI (no framework)
我正在嘗試使用python的WSGI開發一個小型Web應用程序。 例如,如果用戶選擇Google,則會將其重定向到google.com,如果他們選擇了Facebook,則會將其重定向到facebook.com等。
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()
但是,當我運行此代碼時,我收到以下錯誤:
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'
你有兩個問題,都在visit()
。 第一個是拼寫錯誤,第二個是未遵守WSGI規范
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]
看看行dest = qs.ge('site')[0]
。 qs
只是一個字典,並沒有方法ge
,只是get
。 此外, cgi.parse_qs
已經過時 -使用urlparse.parse_qs()來代替。 修復會給我們帶來一個新錯誤(我的地址是127.0.0.1,因為我只是從localhost運行它):
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']
。 修復該錯誤使一切正常。 您會發現PEP 333中記錄了此行為
start_response callable必須返回一個write(body_data)callable,它接受一個位置參數:一個字符串,作為HTTP響應體的一部分寫入。
最后,根據這個答案 ,您可能應該使用'302 Found'
狀態而不是'301 Moved Permanently'
來進行重定向,但它可以正常工作。
用此替換函數應該可以解決您的問題:
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']
響應主體必須是字節而不是字符串。 所以你應該返回[b“1”]而不是[1]或[“1”]。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.