2012-12-25 36 views
137

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

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

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

Có điều gì mà có thể cho phép tôi để trực tiếp nói rằng "tên người dùng" là không bắt buộc?

Trả lời

172

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 username như không bắt buộc? Nếu là vậy, tôi không nghĩ là có thể.

+0

Bất kỳ vấn đề sử dụng phương pháp này khi tham khảo các điểm cuối và url_for? –

+0

Không phải là tôi biết. Ngay cả Flask [docs] (http://flask.pocoo.org/docs/api/#url-route-registrations) chứa ví dụ tương tự (bạn cần cuộn xuống một chút để xem nó). –

121

Gần giống như Audrius nấu lên vài tháng trước, nhưng bạn có thể tìm thấy nó dễ đọc hơn một chút với giá trị mặc định trong đầu chức năng - theo 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 
+1

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

-6

Kể từ 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ả mạo

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

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

Cái 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

0

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

Đối với sửa chữa này:

  1. in app.url_map() trong bạn nhổ tận gốc py
  2. bạn nhì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) }}
35

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

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

một sau đó trong lớp Resource của bạn:

class UserAPI(Resource): 

    def get(self, userId, username=None): 
    pass 
9
@app.route('/', defaults={'path': ''}) 
@app.route('/<path:path>') 
def catch_all(path): 
    return 'You want path: %s' % path 

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

+2

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 hợp lệ nữa, câu trả lời của bạn sẽ bị hỏng. – tomab

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

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

dụ:

from flask import Blueprint 

bp = Blueprint(__name__, "example") 

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

Điều này không trả lời được câu hỏi. – meyer9

Các vấn đề liên quan