4

有一段时间我正在尝试学习如何将 Ajax 与 Flask 一起使用。在flask的官网上有一个例子:

from flask import Flask, jsonify, render_template, request
app = Flask(__name__)

@app.route('/_add_numbers')
def add_numbers():
    a = request.args.get('a', 0, type=int)
    b = request.args.get('b', 0, type=int)
    return jsonify(result=a + b)

@app.route('/')
def index():
    return render_template('index.html')

它对我很有效。但我正在寻找以下程序:

  1. 一个 jQuery 代码向 python 应用程序发送一个初始数字
  2. python 应用程序存储号码并响应“收到:[号码]”
  3. while true:python 应用程序等待请求“增加”,它会将数字加 1 并返回

jQuery部分无关紧要,我可以做到,但我不确定如何实现python部分:

@app.route('/_inc_number')
def inc_number():
    n = request.args.get('n', 0, type=int)
    while true:
        req = request.args.get('req', 0, type=string)
        if req == 'increase':
            n = n + 1
            return n #It exits the function. how respond without quit?

请解释我如何才能恢复数据?我也是 Ajax 和 Flask 的新手,我怀疑它不是“真正的”ajax ......对吗?您将如何在烧瓶中实现具有相同功能的简单功能?

4

2 回答 2

4

我认为您缺少的是,每次客户请求增加数量时,都会有一个独立的请求。您的inc_number处理程序将编码如下:

@app.route('/_inc_number')
def inc_number():
    n = request.args.get('n', 0, type=int)
    n = n + 1
    return n

然后在 jQuery 方面,每次您想增加数量时,您都必须调用一个独立的 Ajax 请求。

请注意,使用这种类型的解决方案,jQuery 应用程序会跟踪计数器的当前值,并且它必须在每次请求时将其发送到 Flask。另一种可能性是让 Flask 端记住用户会话中的数字。对于这种类型的解决方案,您的 Flask 应用程序将具有两个视图功能:

from flask import session
# you need to set a SECRET_KEY in configuration, used to sign the user session

@app.route('/set_number')
def set_number():
    # store n in the user session
    session['n'] = request.args.get('n', 0, type=int)

@app.route('/inc_number')
def inc_number():
    session['n'] = session['n'] + 1
    return session['n']

有了这个解决方案,现在 jQuery 可以设置数字,而不必每次调用inc_number.

我希望这有帮助。

于 2013-08-26T18:43:25.030 回答
1

HTTP 请求没有内存,它们是相互独立的。这意味着当您的 Python 应用程序收到请求时,它会执行某些操作,立即发送响应并退出。这就是 HTTP 的本质。

如果您想要在更多请求中存在的持久性(例如您的号码),您需要:

  • 服务器上的持久存储。它可以是一个文件、一个数据库,或者在 Flask 的情况下只是一个内存中的对象(变量)。
  • 在不同的请求之间识别用户。这就是会话处理和 cookie 的用途。

一种非常原始的方法(不应在生产系统上使用):

  • 持久存储:nummain()
  • index()
    • 创建一个随机会话标识符 ( si)
    • num[si] = 0
    • si作为 cookie发送
  • inc_number()使用si从cookie(由浏览器发回)来增加相应的num[si]
于 2013-08-26T14:44:15.783 回答