我是 WSGI 和 jQuery 的新手,因此,我正在寻找一个使用这两种设备组合的简单示例。我已经花了几个小时在这个主题中找到一些东西,但没有取得任何重大成功:这个问题是一个很好的起点:如何在 Python 中实现 AJAX 的最小服务器?,但是,目前我不知道如何修改它以便在其中使用 jQuery。
如果您能给我一些提示,我将不胜感激。先感谢您!
我是 WSGI 和 jQuery 的新手,因此,我正在寻找一个使用这两种设备组合的简单示例。我已经花了几个小时在这个主题中找到一些东西,但没有取得任何重大成功:这个问题是一个很好的起点:如何在 Python 中实现 AJAX 的最小服务器?,但是,目前我不知道如何修改它以便在其中使用 jQuery。
如果您能给我一些提示,我将不胜感激。先感谢您!
jQuery 在客户端浏览器中运行,因此您不必修改链接到的代码。但我建议使用它而不是滚动你自己的 python 服务器:
使用其他人的代码的最小版本更容易使用。Plus 直接支持 AJAX 类型的命令,并有文档说明:
http://flask.pocoo.org/docs/patterns/jquery/
所以,简而言之,你最终会得到两个处理程序(可以访问的 URLS)
Mainhandler Ajaxhandler
“前端”将通过转到 Mainhandler 来提供服务。但是当用户点击一个按钮时,比如说,jQuery 会创建一个对“Ajaxhandler”的调用,获取一些新数据并使用这些新数据直接更新网页。并且该处理程序知道返回可用于更新页面的少量数据,而不是替换它。
就是这样。
所以你会有一些 javascript (jQuery) 然后实际上做了 ajaxy 位。
/* Send the data using post and put the results in a div */
$.post( url, { s: term },
function( data ) {
var content = $( data );
$("#result").empty().append( content );
$("#result").fadeIn();
$("#s").attr('value', ''); /* reset search text box */
因此,当用户单击按钮时,会向服务器发出发布请求,检索结果并清空 div,然后使用新值进行更新,并且不会在网页全局更改的情况下进行更新。阿贾克斯!
经过扩展研究,我得出了以下示例。WSGI文件:
import threading
import webbrowser
from wsgiref.simple_server import make_server
from cgi import parse_qs
FILE = 'frontend.html'
PORT = 8080
def test_app(environ, start_response):
path = environ.get('PATH_INFO', '').lstrip('/') #get path
if ("static" in path): #handle query for
status = '200 OK' #files in /static
headers = [('Content-type', 'text/javascript')]
start_response(status, headers)
f2serv=file(path,'r') #read file
return environ['wsgi.file_wrapper'](f2serv) #return file
if environ['REQUEST_METHOD'] == 'POST': #If POST...
try:
request_body_size = int(environ['CONTENT_LENGTH'])
request_body = environ['wsgi.input'].read(request_body_size)
except (TypeError, ValueError):
request_body = "0"
parsed_body = parse_qs(request_body)
value = parsed_body.get('test_text', [''])[0] #Returns the first value
try:
response_body = str(int(value) ** 2)
except:
response_body = 'error'
status = '200 OK'
headers = [('Content-type', 'text/plain')]
start_response(status, headers)
return [response_body]
else: #If not POST, just pass
response_body = open(FILE).read() #the html file itself
status = '200 OK'
headers = [('Content-type', 'text/html'),
('Content-Length', str(len(response_body)))]
start_response(status, headers)
return [response_body]
def open_browser():
# Start a browser after waiting for half a second
def _open_browser():
webbrowser.open('http://localhost:%s/%s' % (PORT, FILE))
thread = threading.Timer(0.5, _open_browser)
thread.start()
def start_server():
httpd = make_server("", PORT, test_app)
httpd.serve_forever()
if __name__ == "__main__":
open_browser()
start_server()
html 文件(名为“frontend.html”):
<html>
<head>
<title>AJAX test</title>
</head>
<body>
<script src="static/jquery-1.8.1.js"
type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
function submit(){
$.post( "?", { test_text : $("#test_text").val() },
function( data ) {
$('#test_result').html(data);});
};
</script>
square(
<input type="text" name="test_text" id="test_text" value="0" size="4">
) =
<span id="test_result">0</span>
<input type="button" value="compute"
title="compute" onclick="submit();"/>
</body>
</html>
重要提示:为了使上面的示例正常工作,必须将 jquery.js 的实际版本复制到 /static 下(在本例中为 static/jquery-1.8.1.js)。