Câu trả lời:
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
là tùy chọn? Nếu đó là trường hợp, tôi không nghĩ rằng nó có thể.
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
username
không phải là hằng số. defaults=
đóng băng giá trị mặc định trong từ điển
@user.route('/<userId>/') # NEED '/' AFTER LINK
@user.route('/<userId>/<username>')
def show(userId, username=None):
pass
https://flask.palletsprojects.com/en/1.1.x/quickstart/#unique-urls-redirection-behavior
@app.route('/', defaults={'path': ''})
@app.route('/< path:path >')
def catch_all(path):
return 'You want path: %s' % path
@user.route('/<user_id>', defaults={'username': default_value})
@user.route('/<user_id>/<username>')
def show(user_id, username):
#
pass
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_resource
phươ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 .
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)
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:
<Rule '/<userId>/<username>' (HEAD, POST, OPTIONS, GET) -> user.show_0>
và
<Rule '/<userId>' (HEAD, POST, OPTIONS, GET) -> .show_1>
{{ url_for('.show_0', args) }}
và{{ url_for('.show_1', args) }}
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
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")