Bagaimana saya bisa mendapatkan parameter bernama dari URL menggunakan Flask?


368

Ketika pengguna mengakses URL ini berjalan di aplikasi labu saya, saya ingin layanan web dapat menangani parameter yang ditentukan setelah tanda tanya:

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
Hanya sedikit petunjuk untuk keamanan: Jangan memasukkan kata sandi dalam permintaan GET. security.stackexchange.com/questions/147188/…
palsch

6
Petunjuk kecil lainnya untuk keamanan: Jangan mengirim kata sandi ke titik akhir HTTP (hanya HTTPS)
DerMike

Jawaban:


593

Gunakan request.argsuntuk mendapatkan konten parsing string kueri:

from flask import request

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

1
Bagaimana hal itu dibandingkan dengan menggunakan parameter dalam app.route('/username=<username>&password=<password>')? Dengan begitu Anda tidak menulis baris request.args.get sama sekali.
multigoodverse

@multigoodverse melihat komentar pertama pada pertanyaan mengapa Anda tidak harus mengirim kata sandi melalui GET (di URL). Secara umum, permintaan GET harus memiliki ?di awal parameter, jadi Anda ingin app.route('/?username=<username>&password=<password>'), tetapi Flask akan membaca semuanya setelah tanda tanya request.argsdan tidak akan menafsirkan variabel dari rute. Jika Anda ingin mendapatkan contoh rute Anda menggunakan formulir HTML, Anda akan memerlukan banyak JavaScript tambahan untuk membuatnya berfungsi. Terakhir, variabel rute wajib, request.argsbisa opsional.
dericke

146

Parameter URL tersedia di request.args, yang merupakan ImmutableMultiDict yang memiliki getmetode, dengan parameter opsional untuk nilai default ( default) dan tipe ( type) - yang merupakan callable yang mengubah nilai input ke format yang diinginkan. (Lihat dokumentasi metode untuk lebih jelasnya.)

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)

Contoh dengan kode di atas:

/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. Ini jawaban luar biasa! Saya tidak tahu apakah saya harus menyukai labu untuk fitur ini atau kode Anda, tetapi ini PERSIS apa yang saya cari untuk menguraikan input URL saya.
frakman1

2
filteradalah kata yang dilindungi undang-undang, jangan digunakan;)
Ivan Camilito Ramirez Verdes

88

Anda juga dapat menggunakan tanda kurung <> pada URL definisi tampilan dan input ini akan masuk ke argumen fungsi tampilan Anda

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

1
Saya pikir ini harus menjadi jawaban karena ini adalah dokumentasi de flask
Nathan Gavenski

31

Jika Anda memiliki satu argumen yang diteruskan dalam URL, Anda dapat melakukannya sebagai berikut

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)

Jika Anda memiliki beberapa parameter:

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

Apa yang Anda coba lakukan berfungsi jika ada permintaan POST di mana parameter dilewatkan sebagai parameter formulir dan tidak muncul di URL. Jika Anda benar-benar mengembangkan API login, disarankan Anda menggunakan permintaan POST daripada MENDAPATKAN dan memaparkan data kepada pengguna.

Dalam hal permintaan pos, itu akan berfungsi sebagai berikut:

#url
http://10.1.1.1:5000/login

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

Rute:

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/

kode:

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

(Edit: spasi yang dihapus dalam format string)


-1

Sangat sederhana. Biarkan saya membagi proses ini menjadi dua langkah sederhana.

  1. Pada template html Anda akan mendeklarasikan tag nama untuk nama pengguna dan kata sandi sebagai

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. Kemudian, ubah kode Anda sebagai:

    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

Gunakan request.args.get(param), misalnya:

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)

Inilah tautan yang dirujuk ke kode.


Jangan pernah memaparkan nama pengguna dan kata sandi seperti itu! Lihat komentar palsh dan DerMike di TS.
Bas van Ommen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.