flask ajax回调(flask 12)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask ajax回调(flask 12)相关的知识,希望对你有一定的参考价值。

参考技术A

jquery.ajax()函数参数:
url:
type:GET
data
datatype
complete:请求完成时回调函数
success:请求成功
error:请求失败

return render_tempalte(\'xx.html\')
return jsonify(xxx)
return \'\',204

from flask import Flask,make_response,json
from jinja2.utils import generate_lorem_ipsum

app = Flask( name )

@app.route(\'/post\')
def show_post():
post_body = generate_lorem_ipsum(n=2)
return \'\'\'
<h1>A very long post</h1>
<div class="body">%s</div>
<button id="load">Load More</button>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
(\'#load\').click(function()
(\'.body\').append(data);

)
)
)
</script>\'\'\' % post_body

@app.route(\'/more\')
def load_post():
return generate_lorem_ipsum(n=1)

if name == \' main \':
app.run(
host=\'0.0.0.0\',
port=8888,
debug=True
)

如何在 Flask Server 上的 Google Pubsub 订阅回调中屈服以进行流式传输

【中文标题】如何在 Flask Server 上的 Google Pubsub 订阅回调中屈服以进行流式传输【英文标题】:How to yield in subscription call back of Google Pubsub on Flask Server for streaming 【发布时间】:2022-01-24 01:01:36 【问题描述】:

我想通过 Flask 端点获得流,但事件是在订阅者的回调中发送到主题(Google Cloud PubSub)的。请看下面的代码:

def a_stream():
    topic_name = 'projects/project_id/topics/topic'.format(
        project_id=os.getenv('GOOGLE_CLOUD_PROJECT'),
        topic="topic",  
    )
    subscription_name = 'projects/project_id/subscriptions/sub'.format(
        project_id=os.getenv('GOOGLE_CLOUD_PROJECT'),
        sub="topic", 
    )
    def callback(message):
        print("print")
        yield "yield"
        message.ack()

    with pubsub_v1.SubscriberClient() as subscriber:
        try:
            subscriber.create_subscription(
            name=subscription_name, topic=topic_name)
        except:
            #do nothing as topic exists
            pass
        future = subscriber.subscribe(subscription_name, callback=callback)             
        future.result()

@orders_bp.route("/aStream", methods=['GET'])
def get_order_status():
    return Response(stream_with_context(a_stream()),
                          mimetype="text/event-stream")

如果我按原样运行代码,则不会发生任何事情。如果我删除回调中的产量,那么我可以在控制台中看到“打印”。似乎问题与屈服有关,有没有简单的方法来解决这个问题?

【问题讨论】:

【参考方案1】:

Python 的 yield 语句暂停执行并向调用者返回一个值。在您的情况下,您期望字符串“yield”,但实际上返回了一个生成器。函数中不会创建任何状态,例如 for 或 while 循环(如在生成器中)或多个 yield,因此当函数恢复时,会再次返回包含字符串“yield”的生成器。 message.ack() 行代码永远不会执行。

让我们检查您的代码:

def callback(message):
    print("print")
    yield "yield"
    message.ack()

并翻译成例子:

class message:
        def ack():
                print('ACK')

def callback(message):
    print("print")
    yield "yield"
    message.ack()

val = callback(message)
print(type(val))

for i in val:
        print(i)

如果我们调用 callback 并检查其返回类型:

val = callback(message)
print(type(val))

类型(val)是

要从生成器获取返回值,您必须迭代结果:

for i in val:
        print(i)

您将回调用作普通方法并期望返回一个字符串。

val = callback(message)

调用代码将该方法作为生成器调用。因此,在 callback 中不会保存或恢复任何状态,并且该方法会在每次调用时重新开始。

对于您的用例,将您的代码更改为不使用生成器:

def callback(message):
    message.ack()
    return "yield"

否则,您必须修改 subscriber.subscribe() 以接受生成器而不是函数回调。

【讨论】:

以上是关于flask ajax回调(flask 12)的主要内容,如果未能解决你的问题,请参考以下文章

从rabbitMQ消费时,Flask消费者不执行回调

Flask 异步化

如何在 Flask Server 上的 Google Pubsub 订阅回调中屈服以进行流式传输

使用flask-jwt-extended回调与flask-restful和create_app

在跨域ajax post中的回调函数中获取未定义

重构 Flask 服务端项目对于 SQL 的配置使用和延迟的请求回调巧妙设计运用