Flask kullanarak adlandırılmış parametreleri bir URL'den nasıl alabilirim?


367

Kullanıcı şişe uygulamamda çalışan bu URL'ye eriştiğinde, web hizmetinin soru işaretinden sonra belirtilen parametreleri işleyebilmesini istiyorum:

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
Güvenlik için küçük bir ipucu: GET isteklerine şifre eklemeyin. security.stackexchange.com/questions/147188/…
palsch

6
Güvenlik için başka bir küçük ipucu: HTTP uç noktalarına şifre göndermeyin (yalnızca HTTPS'ye
geçmeyin

Yanıtlar:


592

request.argsSorgu dizesinin ayrıştırılmış içeriğini almak için kullanın :

from flask import request

@app.route(...)
def login():
    username = request.args.get('username')
    password = request.args.get('password')

1
Bu, içindeki parametrelerin kullanımıyla nasıl karşılaştırılır app.route('/username=<username>&password=<password>')? Bu şekilde request.args.get satırlarını hiç yazmazsınız.
multigoodverse

@multigoodverse, neden bir GET aracılığıyla (URL'de) şifre göndermemeniz gerektiğine ilişkin soruyla ilgili ilk yorumu inceleyin. Daha genel olarak, bir GET isteği ?parametrelerin başında bir olmalıdır , bu yüzden istersiniz app.route('/?username=<username>&password=<password>'), ancak Flask soru işaretinden sonra her şeyi okuyacak request.argsve değişkenleri rotadan yorumlamayacaktır. Bir HTML formu kullanarak örnek rotanıza ulaşmak istiyorsanız, çalışmasını sağlamak için bir sürü ekstra JavaScript'e ihtiyacınız olacaktır. Son olarak, rota değişkenleri zorunludur, request.argsisteğe bağlı olabilir.
dericke

144

URL parametreleri, varsayılan değeri ( ) ve type ( ) için isteğe bağlı parametreleri içeren , bir yöntemi request.argsolan bir ImmutableMultiDict seçeneğinde mevcuttur - giriş değerini istenen biçime dönüştüren bir çağrılabilir. (Daha fazla ayrıntı için yöntemin belgelerine bakın.)getdefaulttype

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)

Yukarıdaki koda sahip örnekler:

/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.Bu olağanüstü bir cevap! Bu özellik veya kod için şişesi sevmek gerekir bilmiyorum ama bu tam olarak benim URL girişi ayrıştırmak için aradığını.
frakman1

2
filterkullanılmamalıdır;)
Ivan Camilito Ramirez Verdes

88

Görünüm tanımının URL'sinde <> köşeli ayraç da kullanabilirsiniz; bu giriş görünüm işlevi bağımsız değişkenlerinize girer

@app.route('/<name>')
def my_view_func(name):
    return name

1
Ben de bu şişe cevap belgelerinin ne için gider çünkü bu cevap olmalı
Nathan Gavenski

31

URL'de iletilen tek bir bağımsız değişkeniniz varsa bunu aşağıdaki gibi yapabilirsiniz

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)

Birden fazla parametreniz olması durumunda:

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

Yapmaya çalıştığınız, parametrelerin form parametreleri olarak iletildiği ve URL'de görünmediği POST istekleri durumunda işe yarar. Aslında bir giriş API'si geliştiriyorsanız GET yerine POST isteği kullanmanız ve verileri kullanıcıya göstermeniz önerilir.

Posta talebi durumunda aşağıdaki gibi çalışır:

#url
http://10.1.1.1:5000/login

HTML snippet'i:

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

kod:

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

(Düzenle: biçim dizesindeki boşlukları kaldırdı)


-1

Gerçekten çok basit. Bu süreci iki basit adıma böleyim.

  1. Html şablonunda kullanıcı adı ve şifre için ad etiketini şu şekilde beyan edeceksiniz:

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. Ardından, kodunuzu şu şekilde değiştirin:

    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

request.args.get(param)Örneğin kullanın :

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)

İşte kodun referans verilen bağlantısı.


Asla böyle bir kullanıcı adı ve şifre göstermeyin! Palsh ve DerMike TS'nin yorumlarına bakınız.
Bas van Ommen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.