带有 POST 的烧瓶示例

Posted

技术标签:

【中文标题】带有 POST 的烧瓶示例【英文标题】:Flask example with POST 【发布时间】:2014-05-21 18:58:43 【问题描述】:

假设以下路径访问一个 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 表达式listOfUsers/user1 应该访问标签<user1> 以将其当前文本更改为“John”。

我不知道如何实现这一点,因为我刚刚开始学习 Flask 和 REST,我找不到任何适合这种特定情况的好例子。另外,我想使用 lxml 来操作 xml 文件,因为我已经知道了。

有人可以帮助并提供一个例子来指导我吗?

【问题讨论】:

【参考方案1】:

在实际回答您的问题之前:

URL 中的参数(例如key=listOfUsers/user1)是GET 参数,您不应该将它们用于POST 请求。可以在here 找到有关 GET 和 POST 之间区别的快速说明。

在您的情况下,要利用 REST 原则,您可能应该:

http://ip:5000/users
http://ip:5000/users/<user_id>

然后,在每个 URL 上,您可以定义不同 HTTP 方法的行为(GETPOSTPUTDELETE)。例如,在 /users/&lt;user_id&gt; 上,您需要以下内容:

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/users/user_1,POST 数据为"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 请求内容类型,但我认为到目前为止我所说的应该是一个合理的起点。我知道我没有直接回答您提出的确切问题,但我希望这对您有所帮助。稍后我也会进行一些编辑/添加。

谢谢,我希望这会有所帮助。如果我做错了什么,请告诉我。

【讨论】:

您是否必须做一些特殊的事情才能让 POST 正确路由回来?我设置了 /competitions/ 但是当 POST 发生时,它会发布到 /competitions ,所以我的帖子处理逻辑永远不会达到。【参考方案2】:

这是一个示例,您可以在其中轻松找到使用 Post、GET 方法的方法,也可以使用相同的方法添加其他 curd 操作..

#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....... :)

【讨论】:

以上是关于带有 POST 的烧瓶示例的主要内容,如果未能解决你的问题,请参考以下文章

markdown 烧瓶蓝图示例

python python日志示例(烧瓶)

记录烧瓶应用程序

Gunicorn 多个烧瓶工人和绑定任务 celery

带有请求的烧瓶损坏的管道

带有斜杠的 Flask POST