Flask / JSON ведущий слеш - PullRequest
       3

Flask / JSON ведущий слеш

0 голосов
/ 21 февраля 2019

В следующем приложении Flask есть один HTML-маршрут и один JSON-маршрут.

app.py

from flask import Flask, render_template, request, jsonify

app = Flask(__name__)


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


@app.route('/path/to/json', methods=['POST'])
def path_to_json_fn():
    ret = {'ret_str': 'You sent *{}*'.format(request.json['my_str'])}
    return jsonify(ret)

Приложение отображает следующую HTML-страницу, которая содержитодно поле с id из str_field.

templates / index.html

<!DOCTYPE html>
<body>
    <h2>Ping</h2>
    <form action="javascript:handle_ping()" method="post">
        Enter a string:
        <input type="text" id="str_field">
    </form>
    <br />
    <p id="output_message"></p>

    <script src="https://d3js.org/d3.v5.min.js"></script>

    <script src="{{ url_for('static', filename='client.js')}}"></script>
</body>

Следующий код JS возвращает str_field, конструируетсообщение вокруг него и отправляет запрос к конечной точке JSON по адресу path/to/json.

static / client.js

function handle_ping() {
    var s = d3.select('#str_field').node().value;
    var json_msg = JSON.stringify({'my_str': s});

    var msg_sent = {
        method: "POST",
        headers: {"Content-type": "application/json; charset=UTF-8"},
        body: json_msg,
    };

    d3.json("path/to/json", msg_sent)
      .then(function(json_received) {
          var e = d3.select('#output_message');
          e.text(json_received.ret_str);
      })
      .catch(error => {console.log(error);});
}

Приложение размещено на Apache сmod_wsgi.Через Apache conf/extra/httpd-vhosts.conf приложение размещается не на server/, а на server/foo/ (WSGIScriptAlias /foo "/some/place/web.wsgi").

Следовательно, приложение отображается на server/foo/, а страница, обслуживаемая выше, доступна на server/foo/bar.

Страница HTML остается перемещаемой, несмотря на наличие косой черты в @app.route('/bar).Действительно, если этот ведущий слеш опущен, werkzeug будет жаловаться:

File "....werkzeug/routing.py", line 603, in __init__
    raise ValueError('urls must start with a leading slash')
ValueError: urls must start with a leading slash

То же самое относится к @app.route('/path/to/json', methods=['POST']).Начальная косая черта необходима.

В чем разница между написанием d3.json("path/to/json", msg_sent) и d3.json("/path/to/json", msg_sent)?

Я вижу, что последнее проблематично, потому что тогда сервер связывается с server/path/to/jsonв то время как он обслуживает JSON на server/foo/path/to/json, что приводит к 404.

Является ли первый (без начального слеша) подходящим способом отправки запроса JSON, чтобы приложение оставалось перемещаемым?Кажется, есть и другие проблемы, а именно, что JS-код, который ищет "path/to/json" и который загружен внутри HTML-страницы, обслуживаемой по пути 'server / foo / bar', будет искать 'server / foo / bar / path / to /json ', но я еще не смог выпустить эту проблему в этом MCVE.Это может быть связано с использованием метода фабрики приложений в более крупном приложении или, возможно, с использованием Blueprints, несмотря на то, что JSON API находится вне какой-либо схемы.

Можете ли вы пролить свет на то, чтопроисходит?

Связано:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...