ฉันจะรับพารามิเตอร์ที่กำหนดชื่อจาก URL โดยใช้ Flask ได้อย่างไร


366

เมื่อผู้ใช้เข้าถึง URL นี้ที่ทำงานบนแอพขวดของฉันฉันต้องการให้บริการเว็บสามารถจัดการพารามิเตอร์ที่ระบุหลังเครื่องหมายคำถาม:

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
คำแนะนำเล็ก ๆ เพื่อความปลอดภัย: อย่าใส่รหัสผ่านในคำขอ GET security.stackexchange.com/questions/147188/…
palsch

6
อีกคำแนะนำเล็ก ๆ เพื่อความปลอดภัย: อย่าส่งรหัสผ่านไปยังจุดปลาย HTTP (เฉพาะ HTTPS เท่านั้น)
DerMike

คำตอบ:


591

ใช้request.argsเพื่อแยกวิเคราะห์เนื้อหาของสตริงข้อความค้นหา:

from flask import request

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

1
สิ่งนั้นเปรียบเทียบกับการใช้พารามิเตอร์ได้app.route('/username=<username>&password=<password>')อย่างไร ด้วยวิธีนี้คุณจะไม่เขียน request.args.get บรรทัดเลย
Multigoodverse

@multigoodverse เห็นความคิดเห็นแรกเกี่ยวกับคำถามที่ว่าทำไมคุณไม่ควรส่งรหัสผ่านผ่าน GET (ใน URL) โดยทั่วไปคำขอ GET ควรมี?จุดเริ่มต้นของพารามิเตอร์ดังนั้นคุณจะต้องการapp.route('/?username=<username>&password=<password>')แต่ Flask จะอ่านทุกอย่างหลังจากทำเครื่องหมายคำถามrequest.argsแล้วและจะไม่ตีความตัวแปรจากเส้นทาง หากคุณต้องการไปยังเส้นทางตัวอย่างของคุณโดยใช้แบบฟอร์ม HTML คุณจะต้องใช้ JavaScript พิเศษเพิ่มเติมเพื่อให้สามารถใช้งานได้ สุดท้ายตัวแปรเส้นทางจำเป็นrequest.argsต้องมีก็ได้
dericke

144

พารามิเตอร์ URL มีอยู่ในrequest.argsซึ่งเป็นImmutableMultiDictที่มีgetวิธีการพร้อมด้วยพารามิเตอร์ทางเลือกสำหรับค่าเริ่มต้น ( default) และประเภท ( type) - ซึ่งเป็น callable ที่แปลงค่าอินพุตให้เป็นรูปแบบที่ต้องการ (ดูเอกสารประกอบของวิธีการสำหรับรายละเอียดเพิ่มเติม)

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)

ตัวอย่างที่มีรหัสด้านบน:

/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 นี่คือคำตอบที่โดดเด่น! ฉันไม่รู้ว่าฉันควรจะรัก flask สำหรับคุณลักษณะนี้หรือรหัสของคุณหรือไม่ แต่นี่คือสิ่งที่ฉันต้องการเพื่อแยกวิเคราะห์ URL ที่ป้อน
frakman1

2
filterเป็นคำสงวนไม่ควรใช้;)
Ivan Camilito Ramirez Verdes

88

คุณยังสามารถใช้วงเล็บ <> บน URL ของนิยามมุมมองและอินพุตนี้จะเข้าสู่อาร์กิวเมนต์ฟังก์ชันมุมมองของคุณ

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

1
ผมคิดว่านี่ควรจะเป็นคำตอบเพราะมันเป็นสิ่งที่เอกสาร de ขวดไปสำหรับ
นาธาน Gavenski

31

หากคุณมีอาร์กิวเมนต์เดียวที่ส่งผ่านใน URL คุณสามารถทำได้ดังนี้

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)

ในกรณีที่คุณมีหลายพารามิเตอร์:

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

สิ่งที่คุณพยายามจะทำงานในกรณีที่คำขอ POST ที่พารามิเตอร์ถูกส่งผ่านเป็นพารามิเตอร์แบบฟอร์มและไม่ปรากฏใน URL ในกรณีที่คุณกำลังพัฒนา API การเข้าสู่ระบบขอแนะนำให้คุณใช้คำขอ POST แทน GET และเปิดเผยข้อมูลแก่ผู้ใช้

ในกรณีที่โพสต์คำขอมันจะทำงานดังนี้:

#url
http://10.1.1.1:5000/login

ตัวอย่าง 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>

เส้นทาง:

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/

รหัส:

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

(แก้ไข: ลบช่องว่างในสตริงรูปแบบ)


-1

มันง่ายจริงๆ ขอผมแบ่งกระบวนการนี้เป็นสองขั้นตอนง่ายๆ

  1. ในเทมเพลต html คุณจะประกาศแท็กชื่อสำหรับชื่อผู้ใช้และรหัสผ่านดังนี้

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. จากนั้นแก้ไขรหัสของคุณเป็น:

    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)ตัวอย่างเช่น:

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)

นี่คือลิงค์อ้างอิงไปยังรหัส


อย่าเปิดเผยชื่อผู้ใช้และรหัสผ่านเช่นนั้น! ดูความคิดเห็น palsh และ DerMike ใน TS
Bas van Ommen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.