В следующем приложении 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 находится вне какой-либо схемы.
Можете ли вы пролить свет на то, чтопроисходит?
Связано: