Làm cách nào tôi có thể nhận được các tham số được đặt tên từ một URL bằng Flask?


367

Khi người dùng truy cập URL này đang chạy trên ứng dụng bình của tôi, tôi muốn dịch vụ web có thể xử lý các tham số được chỉ định sau dấu chấm hỏi:

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
Chỉ là một gợi ý nhỏ để bảo mật: Không bao gồm mật khẩu trong các yêu cầu GET. security.stackexchange.com/questions/147188/
Mạnh

6
Một gợi ý nhỏ khác về bảo mật: Không gửi mật khẩu đến các điểm cuối HTTP (chỉ bao giờ HTTPS)
DerMike

Câu trả lời:


593

Sử dụng request.argsđể có được nội dung được phân tích cú pháp của chuỗi truy vấn:

from flask import request

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

1
Làm thế nào mà so sánh với việc sử dụng các tham số trong app.route('/username=<username>&password=<password>')? Bằng cách đó, bạn không viết các dòng request.args.get.
đa cấp

@multigoodverse xem bình luận đầu tiên về câu hỏi tại sao bạn không nên gửi mật khẩu qua GET (trong URL). Tổng quát hơn, một yêu cầu GET nên có ?ở đầu các tham số, vì vậy bạn muốn app.route('/?username=<username>&password=<password>'), nhưng Flask sẽ đọc mọi thứ sau dấu chấm hỏi request.argsvà sẽ không diễn giải các biến từ tuyến. Nếu bạn muốn truy cập tuyến đường mẫu của mình bằng biểu mẫu HTML, bạn sẽ cần một loạt JavaScript bổ sung để làm cho nó hoạt động. Cuối cùng, các biến tuyến là bắt buộc, request.argscó thể là tùy chọn.
dericke

144

Các tham số URL có sẵn trong request.argsđó là một ImmutableMultiDict có một getphương thức, với các tham số tùy chọn cho giá trị mặc định ( default) và loại ( type) - có thể gọi được để chuyển đổi giá trị đầu vào thành định dạng mong muốn. (Xem tài liệu của phương pháp để biết thêm chi tiết.)

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)

Ví dụ với mã ở trên:

/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. Đây là một câu trả lời nổi bật! Tôi không biết liệu tôi nên yêu thích tính năng này hay mã của bạn nhưng đây chính xác là những gì tôi đang tìm kiếm để phân tích cú pháp nhập URL của tôi.
frakman1

2
filterlà một từ dành riêng, không nên sử dụng;)
Ivan Camilito Ramirez Verdes

88

Bạn cũng có thể sử dụng dấu ngoặc <> trên URL của định nghĩa chế độ xem và đầu vào này sẽ đi vào đối số chức năng xem của bạn

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

1
Tôi nghĩ rằng đây sẽ là câu trả lời vì đó là những gì tài liệu de
jar

31

Nếu bạn có một đối số được truyền trong URL, bạn có thể thực hiện như sau

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)

Trong trường hợp bạn có nhiều tham số:

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

Những gì bạn đã cố gắng thực hiện công việc trong trường hợp các yêu cầu POST trong đó các tham số được truyền dưới dạng tham số biểu mẫu và không xuất hiện trong URL. Trong trường hợp bạn đang thực sự phát triển API đăng nhập, bạn nên sử dụng yêu cầu POST thay vì GET và hiển thị dữ liệu cho người dùng.

Trong trường hợp yêu cầu bài viết, nó sẽ hoạt động như sau:

#url
http://10.1.1.1:5000/login

Đoạn mã 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>

Tuyến đường:

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/

mã:

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

(Chỉnh sửa: xóa khoảng trắng trong chuỗi định dạng)


-1

Nó thực sự đơn giản. Hãy để tôi chia quá trình này thành hai bước đơn giản.

  1. Trên mẫu html, bạn sẽ khai báo thẻ tên cho tên người dùng và mật khẩu là

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. Sau đó, sửa đổi mã của bạn là:

    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

Sử dụng request.args.get(param), ví dụ:

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)

Đây là liên kết tham chiếu đến mã.


Không bao giờ để lộ tên người dùng và mật khẩu như vậy! Xem bình luận của palsh và DerMike 'trên TS.
Bas van Ommen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.