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)
Alex Stone
sumber
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')
falsetru
sumber
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: '*'
qqbenq
sumber
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
Inbar Cheffer
sumber
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)
Suchita Mukherjee
sumber
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)

Manish Sharma
sumber
-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
Tuan bunty
sumber
-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.

RAJAHMAD MULANI
sumber
Jangan pernah memaparkan nama pengguna dan kata sandi seperti itu! Lihat komentar palsh dan DerMike di TS.
Bas van Ommen