Flask example with POST

前端 未结 2 1413
盖世英雄少女心
盖世英雄少女心 2020-12-12 22:03

Suppose the following route which accesses an xml file to replace the text of a specific tag with a given xpath (?key=):

@app.route(\'/resource\', methods =          


        
相关标签:
2条回答
  • 2020-12-12 22:18

    Before actually answering your question:

    Parameters in a URL (e.g. key=listOfUsers/user1) are GET parameters and you shouldn't be using them for POST requests. A quick explanation of the difference between GET and POST can be found here.

    In your case, to make use of REST principles, you should probably have:

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

    Then, on each URL, you can define the behaviour of different HTTP methods (GET, POST, PUT, DELETE). For example, on /users/<user_id>, you want the following:

    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> 
    

    So, in your example, you want do a POST to /users/user_1 with the POST data being "John". Then the XPath expression or whatever other way you want to access your data should be hidden from the user and not tightly couple to the URL. This way, if you decide to change the way you store and access data, instead of all your URL's changing, you will simply have to change the code on the server-side.

    Now, the answer to your question: Below is a basic semi-pseudocode of how you can achieve what I mentioned above:

    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
            .
            .
            .
    

    There are a lot of other things to consider like the POST request content-type but I think what I've said so far should be a reasonable starting point. I know I haven't directly answered the exact question you were asking but I hope this helps you. I will make some edits/additions later as well.

    Thanks and I hope this is helpful. Please do let me know if I have gotten something wrong.

    0 讨论(0)
  • 2020-12-12 22:33

    Here is the example in which you can easily find the way to use Post,GET method and use the same way to add other curd operations as well..

    #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....... :)
    
    0 讨论(0)
提交回复
热议问题