假设以下路由访问xml文件以使用给定的xpath(?key =)替换特定标记的文本:
@app.route('/resource', methods = ['POST'])
def update_text():
# CODE
然后,我会像这样使用cURL:
curl -X POST http://ip:5000/resource?key=listOfUsers/user1 -d "John"
xpath expreesion listOfUsers/user1
应该访问标记<user1>
,将其当前文本更改为“John”。
我不知道如何实现这个目标,因为我刚刚开始学习Flask和REST,而且我找不到任何关于这个具体案例的好例子。此外,我想使用lxml来操作xml文件,因为我已经知道了。
有人可以帮助并提供一个指导我的例子吗?
答案 0 :(得分:45)
在实际回答您的问题之前:
网址中的参数(例如key=listOfUsers/user1
)是GET
个参数,您不应该将它们用于POST
个请求。可以找到GET和POST之间差异的快速解释here。
在您的情况下,为了使用REST原则,您可能应该:
http://ip:5000/users
http://ip:5000/users/<user_id>
然后,在每个URL上,您可以定义不同HTTP方法的行为(GET
,POST
,PUT
,DELETE
)。例如,在/users/<user_id>
上,您需要以下内容:
GET /users/<user_id> - return the information for <user_id>
POST /users/<user_id> - modify/update the information for <user_id> by providing the data
PUT - I will omit this for now as it is similar enough to `POST` at this level of depth
DELETE /users/<user_id> - delete user with ID <user_id>
因此,在您的示例中,您希望{POST引用数据为POST
/users/user_1
到"John"
。然后,应该向用户隐藏XPath表达式或您想要访问数据的任何其他方式,而不是紧密耦合到URL。这样,如果您决定更改存储和访问数据的方式,而不是更改所有URL,则只需更改服务器端的代码即可。
现在,您的问题的答案: 下面是一个基本的半伪代码,说明如何实现我上面提到的:
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/users/<user_id>', methods = ['GET', 'POST', 'DELETE'])
def user(user_id):
if request.method == 'GET':
"""return the information for <user_id>"""
.
.
.
if request.method == 'POST':
"""modify/update the information for <user_id>"""
# you can use <user_id>, which is a str but could
# changed to be int or whatever you want, along
# with your lxml knowledge to make the required
# changes
data = request.form # a multidict containing POST data
.
.
.
if request.method == 'DELETE':
"""delete user with ID <user_id>"""
.
.
.
else:
# POST Error 405 Method Not Allowed
.
.
.
还有很多其他事情需要考虑,例如POST
请求内容类型,但我认为到目前为止我所说的应该是一个合理的起点。我知道我没有直接回答你问的确切问题,但我希望这对你有帮助。我稍后会做一些编辑/补充。
谢谢,我希望这会有所帮助。如果我出错了,请告诉我。
答案 1 :(得分:0)
在此示例中,您可以轻松找到使用Post,GET方法的方法,并使用相同的方法添加其他凝乳操作。.
#libraries to include
import os
from flask import request, jsonify
from app import app, mongo
import logger
ROOT_PATH = os.environ.get('ROOT_PATH')<br>
@app.route('/get/questions/', methods=['GET', 'POST','DELETE', 'PATCH'])
def question():
# request.args is to get urls arguments
if request.method == 'GET':
start = request.args.get('start', default=0, type=int)
limit_url = request.args.get('limit', default=20, type=int)
questions = mongo.db.questions.find().limit(limit_url).skip(start);
data = [doc for doc in questions]
return jsonify(isError= False,
message= "Success",
statusCode= 200,
data= data), 200
# request.form to get form parameter
if request.method == 'POST':
average_time = request.form.get('average_time')
choices = request.form.get('choices')
created_by = request.form.get('created_by')
difficulty_level = request.form.get('difficulty_level')
question = request.form.get('question')
topics = request.form.get('topics')
##Do something like insert in DB or Render somewhere etc. it's up to you....... :)
答案 2 :(得分:-4)
只需在网址中输入双引号,如下所示:
curl -X POST "http://ip:5000/resource?key=listOfUsers/user1" -d "John"