首页 > 解决方案 > 如何在json中返回传递的变量url参数

问题描述

我有一个烧瓶应用程序。我希望它将通过 URL 端点传递的变量参数写入输出文件。

我尝试将其写入输出文件,但在 URL 端点中传递的名称未打印在输出文件中。请提出方法,以便在传递变量端点时可以动态更改输出文件

from flask import Flask, jsonify
import json
import uuid 


app = Flask(__name__)


@app.route('/<string:name>')
def get_stats(name):
    proceuudi = uuid.uuid4()

    stat = [
        {
            'process_id': str(proceuudi),
            'process_name': 'name' 
        }
    ]

    with open('data.txt', 'w+') as f:  # writing JSON object
        json.dump(stat, f)
    return jsonify({'stats':stat})
app.run(port = 8500)

当点击 url http://127.0.0.1:2700/generate 我在 outfile 中得到的输出是

[{"process_name": "favicon.ico", "process_id": "82daa01c-bb2d-444c-9b44-a8880200cb2a"}]

这里应该生成“process_name”作为在 URL 参数中传递的内容。但我得到了 favicon.ico

标签: pythonflask

解决方案


网络浏览器导致了这种情况。您应该尝试使用pdb并设置跟踪,如下所示:

from flask import Flask, jsonify
import json
import uuid 
import pdb

app = Flask(__name__)


@app.route('/<string:name>')
def get_stats(name):
    proceuudi = uuid.uuid4()

    stat = [
        {
            'process_id': str(proceuudi),
            'process_name': name 
        }
    ]

    with open('data.txt', 'w+') as f:  # writing JSON object
        pdb.set_trace()
        json.dump(stat, f)
    return jsonify({'stats':stat})
app.run(port = 8500)

Web 浏览器正在执行此操作。您正在使用 Web 浏览器向 Flask 开发服务器发出请求。根据您的代码设置方式,文件data.txt确实接收到正确的输出 - 但该输出几乎立即被覆盖,因为 Web 浏览器自动向服务器发送请求以获取网页的 favicon。基于 Webkit / Blink 的网络浏览器执行此操作。

这是我在 Web 浏览器 (Chrome) 中向服务器发出请求时命令行的输出。我所做的只是访问链接:http: //127.0.0.1 :8500/cat

但是,我的网络浏览器也会自动请求网页的图标。

 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8500/ (Press CTRL+C to quit)
127.0.0.1 - - [02/Apr/2019 22:15:14] "GET /cat HTTP/1.1" 200 -
127.0.0.1 - - [02/Apr/2019 22:15:14] "GET /favicon.ico HTTP/1.1" 200 -

看到第二个请求了吗?'favicon.ico' 的第二个 GET 请求?我的网络浏览器自动完成了那个。这是网络浏览器试图自动抓取小图标以显示在该网页的网络浏览器选项卡菜单栏中。尝试使用wget 之类的命令行程序向您的服务器发出 HTTP 请求。您可以在命令行中尝试这样的操作(例如在 Linux 上):

wget http://127.0.0.1:8500/cat

我们使用 wget 之类的命令行程序,因为它只会严格发送您告诉它的 HTTP 请求。它不像一个在幕后做一些事情的网络浏览器。

如果您使用 wget 进行测试,您的data.txt文件如下所示:

[{"process_id": "30423bad-7640-441e-b608-f77f4420d07e", "process_name": "cat"}]

您的 Web 浏览器正在发送对该页面的 favicon 的请求,因为它认为这是一个正常的网页。


推荐阅读