Я пытаюсь передать данные на сервер фляги Python по индексу / корневому URL. Есть ли способ сделать это или что я делаю не так?

Вот мой код:

import json
from flask import Flask
app = Flask(__name__)

@app.route('/<data>', methods=['POST'])
def index(data):
	#test = request.args.get('test')
	return data

Когда я запускаю команду, она терпит неудачу

curl  -d "data=123" http://localhost:9000/

Результат с сервера питона

"POST / HTTP/1.1" 404 -

Ответ от команды curl

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>404 Not Found</title>
<h1>Not Found</h1>
<p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>

РАЗРЕШЕНО С

@app.route('/', methods=['POST'])
def index():
	return request.form.get('data')

С просьбой

curl  -d 'data=test' http://localhost:9000/

Выход был тестовый

0
Jay 22 Фев 2018 в 19:24

3 ответа

Лучший ответ

Ваше определение маршрута ожидает запрос к /<somedata>. Если вы пропустите <somedata>, он не будет проанализирован.

Чтобы POST json to /, сделайте это:

from flask import Flask, request, jsonify
app = Flask(__name__)


@app.route('/', methods=['POST'])
def index():
    data = request.get_json(force=True)
    return jsonify({'res':data})


if __name__ == '__main__':
    app.run(debug=True)

Вы можете проверить это, выполнив это:

$ curl -d '{"foo":"bar"}' localhost:5000/

Для POST данных формы в /, как вы это делали в своем примере, выполните

data = request.form['foo']
return data

Вместо. Тест с

$ curl -d 'foo=bar' localhost:5000/

Чтобы просто передать строку на ваш маршрут через urlquery, вы можете сделать:

@app.route('/<string:data>', methods=['POST'])
def index(data):
    return data

И проверить это с

$ curl -X POST localhost:5000/somestring
0
joppich 22 Фев 2018 в 19:11

Вы, вероятно, хотите сделать:

@app.route('/<data>', methods=['POST'])
def index(data):
    return json.dumps(data)

Хотя, если честно, я использую blueprint.route, а не app.route.

-1
andnik 22 Фев 2018 в 16:32

Для меня это работает нормально.

@api.route('/api/v3/ticket/<string:key>/<int:id>'

Его <type:var> комбинация, я полагаю.

@app.route('/<data>', methods=['POST'])
def index(data):
    #test = request.args.get('test')
    print data

Редактирование с большим количеством объяснений. Когда я справился с твоей проблемой. как это

127.0.0.1 - - [22/Feb/2018 22:17:29] "POST /haha HTTP/1.1" 200 -
 * Running on http://127.0.0.1:7000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 179-733-809
haha
127.0.0.1 - - [22/Feb/2018 22:16:50] "POST /haha HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/home/sworks/flask_application_new/flask-env/lib/python2.7/site-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/sworks/flask_application_new/flask-env/lib/python2.7/site-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/home/sworks/flask_application_new/flask-env/lib/python2.7/site-packages/flask_restplus/api.py", line 557, in error_router
    return original_handler(e)
  File "/home/sworks/flask_application_new/flask-env/lib/python2.7/site-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/sworks/flask_application_new/flask-env/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/sworks/flask_application_new/flask-env/lib/python2.7/site-packages/flask/app.py", line 1615, in full_dispatch_request
    return self.finalize_request(rv)
  File "/home/sworks/flask_application_new/flask-env/lib/python2.7/site-packages/flask/app.py", line 1630, in finalize_request
    response = self.make_response(rv)
  File "/home/sworks/flask_application_new/flask-env/lib/python2.7/site-packages/flask/app.py", line 1725, in make_response
    raise ValueError('View function did not return a response')
ValueError: View function did not return a response

Затем, когда вы возвращаете данные, как это,

@app.route('/<data>', methods=['POST'])
def index(data):
    #test = request.args.get('test')
    return data



* Detected change in '/home/sworks/vms_temp/vms_enhancement/vms_api/smartworks/controllers_v1.py', reloading
     * Restarting with stat
     * Debugger is active!
     * Debugger PIN: 179-733-809
    127.0.0.1 - - [22/Feb/2018 22:17:29] "POST /haha HTTP/1.1" 200 -

Я думаю, попробуйте возврат в конце, и он будет работать для вас.

-1
arundeepak 22 Фев 2018 в 16:51