【问题标题】:python-flask example for ajaxajax 的 python-flask 示例
【发布时间】:2013-08-26 13:29:06
【问题描述】:

现在我正在尝试学习如何将 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 ......对吗?你如何在flask中实现一个具有相同功能的简单函数?

【问题讨论】:

    标签: python ajax flask


    【解决方案1】:

    我认为您缺少的是,每次客户请求增加数量时,都会有一个独立的请求。您的 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 时都发送它。

    我希望这会有所帮助。

    【讨论】:

    • 是的,这很有帮助,谢谢,但是我还有一些问题:这个程序要运行多长时间?它还能为其他客户服务吗?我需要用 SECRET_KEY 做什么?
    • 这是一个网络服务器,它会一直运行直到你停止它。 Web 服务器侦听来自任何客户端的连接,而不是特定客户端。请求是短暂的,一旦服务器处理了一个请求,它就会忘记它并准备好接收来自相同或不同客户端的另一个请求。你可以有一个或一百个客户端,都要求服务器增加数字,服务器将独立处理每个客户端。当然,每个客户都有自己的柜台。
    • SECRET_KEY 只是配置,Flask 使用它为用户会话添加加密签名,使内容不能被篡改。这是因为通常用户会话包含身份验证信息,您不希望攻击者能够伪造这些信息。您需要做的就是在配置中定义您的 SECRET_KEY,其余的由 Flask 完成。每个应用程序都应该有一个不同的密钥,并且您选择的密钥永远不应该公开。
    【解决方案2】:

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

    如果你想要一些持久的东西(比如你的号码),可以通过更多的请求,你需要:

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

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

    • 持久化存储:在main()中创建一个全局字典(称为num
    • index():
      • 创建一个随机会话标识符 (si)
      • 设置num[si] = 0
      • si 作为 cookie 发送
    • inc_number()中使用si from cookie(由浏览器发回)增加相应的num[si]

    【讨论】:

    • szepnapot,但是有各种使用 Ajax 的聊天应用程序;这个 HTTP 请求有什么不同吗?如何在 python 中实现 >real
    • Ajax 使用 HTTP。 “通常”您的浏览器通过输入 url 并按 Enter 或单击链接来发送 HTTP 请求。 Ajax 做同样的事情,但在后台。这两种情况没有区别:都发送 HTTP 请求。我所说的“原始方法”可以在有或没有 Ajax 的情况下使用,这是您的选择。一些聊天应用程序使用long polling,这会使连接打开更长时间。但是你不能让它无限期地打开,所以最终你需要持久性和会话处理。
    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2016-09-30
    • 2012-12-02
    相关资源
    最近更新 更多