Flask có thể có các tham số URL tùy chọn không?


258

Có thể khai báo trực tiếp một tham số tùy chọn URL bình không?

Hiện tại tôi đang tiến hành theo cách sau:

@user.route('/<userId>')
@user.route('/<userId>/<username>')
def show(userId, username=None):
    pass

Làm thế nào tôi có thể trực tiếp nói rằng đó usernamelà tùy chọn?

Câu trả lời:


341

Một cách khác là viết

@user.route('/<user_id>', defaults={'username': None})
@user.route('/<user_id>/<username>')
def show(user_id, username):
    pass

Nhưng tôi đoán rằng bạn muốn viết một tuyến đường duy nhất và đánh dấu usernamelà tùy chọn? Nếu đó là trường hợp, tôi không nghĩ rằng nó có thể.


Bất kỳ vấn đề sử dụng phương pháp này khi tham chiếu điểm cuối và url_for?

2
Không phải là tôi biết. Ngay cả các tài liệu Flask cũng chứa ví dụ tương tự (bạn cần cuộn xuống một chút để xem nó).
Audrius Kažukauskas

1
Bạn có thể thử cài đặt pip_optional_routes. Tôi đã tạo một pip cho chức năng bạn đang yêu cầu b / c Tôi cũng cần nó. Mã được đặt tại: github.com/sudouser2010/flask_optional_routes .
sudouser2010

nâng cao tinh thần! nếu bạn có nhiều tab trên trang chủ của mình, trong đó mỗi tab kích hoạt một cái gì đó như / một / hai / ba / bốn và bạn muốn tải các nội dung khác nhau trên cùng một trang mà không cần tải lại trang, bạn nên sử dụng một tuyến hoặc nhiều tuyến?
PirateApp

@PirateApp không thể đạt được chỉ với Flask và hoàn toàn là một tính năng frontend
qaisjp

183

Gần giống như Audrius đã nấu chín vài tháng trước, nhưng bạn có thể thấy nó dễ đọc hơn một chút với các mặc định trong phần đầu chức năng - cách bạn đã quen với python:

@app.route('/<user_id>')
@app.route('/<user_id>/<username>')
def show(user_id, username='Anonymous'):
    return user_id + ':' + username

3
Ngoài ra, điều này hoạt động nếu usernamekhông phải là hằng số. defaults=đóng băng giá trị mặc định trong từ điển
kasperhj

2
Tôi thích cái này Chúng ta nên giữ mã sạch nhất có thể.
Light.G

Hãy nhớ rằng có một sự cảnh báo lớn ở đây: nếu bạn có nhiều đối số vị trí và không phải tất cả chúng đều tùy chọn, thì sẽ không hiểu cách xây dựng URL đúng cách. Bạn có thể nhận được một cái gì đó như / page? Arg = foo nơi nó nên là / foo / page. Câu trả lời @Audrius Kažukauskas hoạt động trong trường hợp đó, nhưng điều này không
rgargente

73

Nếu bạn đang sử dụng Flask-Restful như tôi, thì cũng có thể theo cách này:

api.add_resource(UserAPI, '/<userId>', '/<userId>/<username>', endpoint = 'user')

sau đó trong lớp Tài nguyên của bạn:

class UserAPI(Resource):

  def get(self, userId, username=None):
    pass


11
@app.route('/', defaults={'path': ''})
@app.route('/< path:path >')
def catch_all(path):
    return 'You want path: %s' % path

http://flask.pocoo.org/snippets/57/


3
Bạn nên thêm vào đây thông tin từ liên kết bên ngoài vì nếu liên kết đó sẽ không còn hiệu lực, câu trả lời của bạn sẽ bị hỏng.
tomab

9
@user.route('/<user_id>', defaults={'username': default_value})
@user.route('/<user_id>/<username>')
def show(user_id, username):
   #
   pass

5

Gần giống như skornos, nhưng với khai báo thay đổi cho câu trả lời rõ ràng hơn. Nó có thể hoạt động với phần mở rộng Flask-RESTful :

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

class UserAPI(Resource):
    def show(userId, username=None):
    pass

api.add_resource(UserAPI, '/<userId>', '/<userId>/<username>', endpoint='user')

if __name__ == '__main__':
    app.run()

Các add_resourcephương pháp cho phép vượt qua bội số URL. Mỗi cái sẽ được chuyển đến Tài nguyên của bạn .


1

Tôi biết bài đăng này thực sự cũ nhưng tôi đã làm việc trên một gói có tên là jar_optional_routes. Mã được đặt tại: https://github.com/sudouser2010/flask_optional_routes .

from flask import Flask

from flask_optional_routes import OptionalRoutes


app = Flask(__name__)
optional = OptionalRoutes(app)

@optional.routes('/<user_id>/<user_name>?/')
def foobar(user_id, user_name=None):
    return 'it worked!'

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000)

0

Bạn có thể viết như bạn hiển thị trong ví dụ, nhưng hơn là bạn gặp lỗi xây dựng.

Để sửa lỗi này:

  1. in app.url_map () trong root của bạn .py
  2. bạn thấy một cái gì đó như:

<Rule '/<userId>/<username>' (HEAD, POST, OPTIONS, GET) -> user.show_0>

<Rule '/<userId>' (HEAD, POST, OPTIONS, GET) -> .show_1>

  1. hơn trong mẫu bạn có thể {{ url_for('.show_0', args) }}{{ url_for('.show_1', args) }}

-6

Vì Flask 0.10, bạn không thể thêm nhiều tuyến đường vào một điểm cuối. Nhưng bạn có thể thêm điểm cuối giả

@user.route('/<userId>')
def show(userId):
   return show_with_username(userId)

@user.route('/<userId>/<username>')
def show_with_username(userId,username=None):
   pass

5
Gì? Sử dụng bình 0.10.1 ở đây và tôi có thể thêm nhiều tuyến vào một điểm cuối tốt.
jaapz

-8

Tôi nghĩ rằng bạn có thể sử dụng Blueprint và điều đó sẽ làm cho mã ur của bạn trông đẹp hơn và gọn gàng hơn.

thí dụ:

from flask import Blueprint

bp = Blueprint(__name__, "example")

@bp.route("/example", methods=["POST"])
def example(self):
   print("example")

Điều này không trả lời câu hỏi.
meyer9
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.