Como posso obter os parâmetros nomeados de um URL usando o Flask?

368

Quando o usuário acessa esse URL em execução no meu aplicativo de balão, desejo que o serviço da Web possa manipular os parâmetros especificados após o ponto de interrogação:

http://10.1.1.1:5000/login?username=alex&password=pw1

#I just want to be able to manipulate the parameters
@app.route('/login', methods=['GET', 'POST'])
def login():
    username = request.form['username']
    print(username)
    password = request.form['password']
    print(password)
Alex Stone
fonte
89
Apenas uma pequena dica de segurança: não inclua senhas nas solicitações GET. segurança.stackexchange.com
questions
6
Outra pequena dica de segurança: Não enviado senhas para HTTP endpoints (sempre apenas HTTPS)
DerMike

Respostas:

593

Use request.argspara obter o conteúdo analisado da string de consulta:

from flask import request

@app.route(...)
def login():
    username = request.args.get('username')
    password = request.args.get('password')
falsetru
fonte
11
Como isso se compara ao uso de parâmetros app.route('/username=<username>&password=<password>')? Dessa forma, você não escreve as linhas request.args.get.
multigoodverse 17/04
@multigoodverse, veja o primeiro comentário da pergunta sobre por que você não deve enviar uma senha por meio de um GET (na URL). De maneira mais geral, uma solicitação GET deve ter um ?no início dos parâmetros, como você deseja app.route('/?username=<username>&password=<password>'), mas o Flask lerá tudo após o ponto de interrogação request.argse não interpretará as variáveis ​​da rota. Se você quiser chegar ao seu exemplo de rota usando um formulário HTML, precisará de um monte de JavaScript extra para fazê-lo funcionar. Por fim, as variáveis ​​de rota são obrigatórias, request.argspodem ser opcionais.
dericke 03/06
146

Os parâmetros de URL estão disponíveis em request.args, que é um ImmutableMultiDict que possui um getmétodo, com parâmetros opcionais para o valor padrão ( default) e o tipo ( type) - que é uma chamada que converte o valor de entrada no formato desejado. (Consulte a documentação do método para obter mais detalhes.)

from flask import request

@app.route('/my-route')
def my_route():
  page = request.args.get('page', default = 1, type = int)
  filter = request.args.get('filter', default = '*', type = str)

Exemplos com o código acima:

/my-route?page=34               -> page: 34  filter: '*'
/my-route                       -> page:  1  filter: '*'
/my-route?page=10&filter=test   -> page: 10  filter: 'test'
/my-route?page=10&filter=10     -> page: 10  filter: '10'
/my-route?page=*&filter=*       -> page:  1  filter: '*'
qqbenq
fonte
2
@ qqbenq.Esta é uma resposta excelente! Não sei se devo amar o balão para esse recurso ou seu código, mas é exatamente isso que eu estava procurando para analisar minha entrada de URL.
frakman1
2
filteré uma palavra reservada, não deve usar;)
Ivan Camilito Ramirez Verdes
88

Você também pode usar colchetes <> no URL da definição de visualização e essa entrada será inserida nos argumentos da função de visualização

@app.route('/<name>')
def my_view_func(name):
    return name
Inbar Cheffer
fonte
11
Eu acho que isso deve ser a resposta, uma vez que é o que a documentação de garrafa vai para
Nathan Gavenski
31

Se você tiver um único argumento transmitido na URL, poderá fazê-lo da seguinte maneira

from flask import request
#url
http://10.1.1.1:5000/login/alex

from flask import request
@app.route('/login/<username>', methods=['GET'])
def login(username):
    print(username)

Caso você tenha vários parâmetros:

#url
http://10.1.1.1:5000/login?username=alex&password=pw1

from flask import request
@app.route('/login', methods=['GET'])
    def login():
        username = request.args.get('username')
        print(username)
        password= request.args.get('password')
        print(password)

O que você estava tentando fazer funciona em caso de solicitações POST em que parâmetros são passados ​​como parâmetros de formulário e não aparecem na URL. Caso você esteja realmente desenvolvendo uma API de login, é recomendável usar a solicitação POST em vez de GET e expor os dados ao usuário.

Em caso de solicitação posterior, funcionaria da seguinte maneira:

#url
http://10.1.1.1:5000/login

Fragmento HTML:

<form action="http://10.1.1.1:5000/login" method="POST">
  Username : <input type="text" name="username"><br>
  Password : <input type="password" name="password"><br>
  <input type="submit" value="submit">
</form>

Rota:

from flask import request
@app.route('/login', methods=['POST'])
    def login():
        username = request.form.get('username')
        print(username)
        password= request.form.get('password')
        print(password)
Suchita Mukherjee
fonte
11

url:

http://0.0.0.0:5000/user/name/

código:

@app.route('/user/<string:name>/', methods=['GET', 'POST'])
def user_view(name):
    print(name)

(Editar: espaços removidos na string de formato)

Manish Sharma
fonte
-1

É realmente simples. Deixe-me dividir esse processo em duas etapas simples.

  1. No modelo html, você declarará a etiqueta de nome para nome de usuário e senha como

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. Em seguida, modifique seu código como:

    from flask import request
    
    @app.route('/my-route', methods=['POST']) #you should always parse username and 
    # password in a POST method not GET
    def my_route():
      username = request.form.get("user_name")
      print(username)
      password = request.form.get("password")
      print(password)
    #now manipulate the username and password variables as you wish
    #Tip: define another method instead of methods=['GET','POST'], if you want to  
    # render the same template with a GET request too
Mr.bunty
fonte
-2

Use request.args.get(param), por exemplo:

http://10.1.1.1:5000/login?username=alex&password=pw1
@app.route('/login', methods=['GET', 'POST'])
def login():
    username = request.args.get('username')
    print(username)
    password = request.args.get('password')
    print(password)

Aqui está o link referenciado para o código.

RAJAHMAD MULANI
fonte
Nunca exponha um nome de usuário e senha assim! Veja os comentários de palsh e DerMike 'no TS.
Bas van Ommen