Tạo URL động trong Flask với url_for ()


183

Một nửa các tuyến Flask của tôi yêu cầu một biến nói, /<variable>/addhoặc /<variable>/remove. Làm cách nào để tạo liên kết đến các vị trí đó?

url_for() mất một đối số cho hàm để định tuyến đến nhưng tôi không thể thêm đối số?

Câu trả lời:


282

Nó nhận các đối số từ khóa cho các biến:

url_for('add', variable=foo)

12
nghĩa là hàm số là def add(variable)gì?
endolith

5
@endolith, vâng. ** kwargs được chuyển đến url_forsẽ chuyển dưới dạng tham số hàm cho các tuyến quy tắc biến đổi trong Flask
highvolt

3
Nhưng vấn đề là làm thế nào 'foo' vượt quá phạm vi nếu đó là một biến từ Python. Sau đó, làm thế nào để bạn giải quyết nó?

1
Để nó rõ ràng hơn, nếu bạn có @app.route("/<a>/<b>")def function(a,b): ...là chức năng của nó, thì bạn nên sử dụng url_forvà chỉ định các đối số từ khóa của nó như thế này:url_for('function', a='somevalue', b='anothervalue')
jarrettyeo

120

url_fortrong Flask được sử dụng để tạo URL để ngăn chặn chi phí phải thay đổi URL trong toàn bộ ứng dụng (bao gồm trong các mẫu). Nếu không url_for, nếu có một thay đổi trong URL gốc của ứng dụng thì bạn phải thay đổi nó trong mỗi trang có liên kết.

Cú pháp: url_for('name of the function of the route','parameters (if required)')

Nó có thể được sử dụng như:

@app.route('/index')
@app.route('/')
def index():
    return 'you are in the index page'

Bây giờ nếu bạn có một liên kết trang chỉ mục: bạn có thể sử dụng:

<a href={{ url_for('index') }}>Index</a>

Bạn có thể làm rất nhiều thứ với nó, ví dụ:

@app.route('/questions/<int:question_id>'):    #int has been used as a filter that only integer will be passed in the url otherwise it will give a 404 error
def find_question(question_id):  
    return ('you asked for question{0}'.format(question_id))

Đối với ở trên, chúng ta có thể sử dụng:

<a href = {{ url_for('find_question' ,question_id=1) }}>Question 1</a>

Như thế này, bạn có thể chỉ cần vượt qua các tham số!


1
Tôi có một câu hỏi, trong ví dụ đầu tiên, phương thức index được truyền dưới dạng một chuỗi trong khi ở phương thức thứ hai, find_question đang được truyền dưới dạng biến. Tại sao?
आनंद

1
@AnandTyagi Đây có phải ý bạn không? Định tuyến URL
Tony Chou

3
@ आनंद nếu biến bạn làm: {{ url_for('find_question' ,question_id=question.id) }}và không{{ url_for('find_question' ,question_id={{question.id}}) }}
Abdur-Rahmaan Janhangeer


1

Mẫu:

Truyền tên hàm và đối số.

<a href="{{ url_for('get_blog_post',id = blog.id)}}">{{blog.title}}</a>

Xem, chức năng

@app.route('/blog/post/<string:id>',methods=['GET'])
def get_blog_post(id):
    return id
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.