web-dev-qa-db-fra.com

Manipulation GET et POST dans la même vue

Lorsque je tape request.form["name"], par exemple, pour récupérer le nom d'un formulaire envoyé par POST, dois-je également écrire une branche distincte ressemblant à request.form.get["name"]? Si je veux prendre en charge les deux méthodes, dois-je écrire des instructions séparées pour toutes les POST et toutes les demandes GET?

@app.route("/register", methods=["GET", "POST"])
def register():
    """Register user."""

Ma question est liée de manière tangentielle à Obtention des valeurs des variables de demande à l’aide de python et Flask .

9
Ryan

Vous pouvez distinguer la méthode actuelle en utilisant request.method, comme indiqué ci-après: http://flask.pocoo.org/docs/0.10/quickstart/#http-methods

Je suppose que vous voulez:

  • Rendre un modèle lorsque la route est déclenchée avec la méthode GET
  • Lire les entrées de formulaire et enregistrer un utilisateur si la route est déclenchée avec POST

Votre cas est donc similaire à celui décrit dans la documentation (lien ci-dessus):

import flask
app = flask.Flask('your_flask_env')

@app.route('/register', methods=['GET', 'POST'])
def register():
    if flask.request.method == 'POST':
        username = flask.request.values.get('user') # Your form's
        password = flask.request.values.get('pass') # input names
        your_register_routine(username, password)
    else:
        # You probably don't have args at this route with GET
        # method, but if you do, you can access them like so:
        yourarg = flask.request.args.get('argname')
        your_register_template_rendering(yourarg)
25
jbndlr

Voici l'exemple dans lequel vous pouvez facilement trouver le moyen d'utiliser la méthode Post, GET et utiliser le même moyen pour ajouter d'autres opérations de caillé.

#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'])<br>
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....... :)
1
Shahzaib Ali

Vous pouvez traiter la méthode "POST" en appelant validate_on_submit () pour vérifier si le formulaire est soumis avec des données valides, sinon votre fonction répondra à la requête GET par défaut. Votre fonction sera comme ça: 

@app.route("/register", methods=["GET", "POST"])
def register():
    """Register user."""
    form = SomeForm() 
    # treat POST request 
    if form.validate_on_submit():
       # do something ... 
       # return redirect ... 


    # else response to GET request
    # return render_template... 
1
thangtn