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)

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')

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: '*'

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

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)

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)


-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

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


Nunca exponha um nome de usuário e senha assim! Veja os comentários de palsh e DerMike 'no TS.
Bas van Ommen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.