Twórz dynamiczne adresy URL w Flask za pomocą url_for ()

183

Połowa moich tras Flask wymaga zmiennej powiedzmy, /<variable>/addlub /<variable>/remove. Jak utworzyć linki do tych lokalizacji?

url_for() pobiera jeden argument, aby funkcja mogła kierować, ale nie mogę dodać argumentów?

Gio Borje
źródło

Odpowiedzi:

280

Bierze argumenty słów kluczowych dla zmiennych:

url_for('add', variable=foo)
FogleBird
źródło
12
co oznacza, że ​​funkcja jest def add(variable)?
endolith,
5
@endolith, Tak. ** przekazane kwargs url_forprzejdą jako parametry funkcji dla zmiennych tras reguł w Flask
highvolt
3
Problem polega jednak na tym, że „foo” jest poza zakresem, jeśli jest to zmienna z Python. Jak to rozwiązać?
1
Żeby było jaśniej, jeśli masz @app.route("/<a>/<b>")i def function(a,b): ...jako funkcję, powinieneś użyć url_fori podać argumenty tego słowa kluczowego w następujący sposób:url_for('function', a='somevalue', b='anothervalue')
jarrettyeo
118

url_forin Flask służy do tworzenia adresu URL, aby uniknąć konieczności zmiany adresów URL w całej aplikacji (w tym w szablonach). Bez tego url_for, jeśli nastąpi zmiana w głównym adresie URL Twojej aplikacji, musisz ją zmienić na każdej stronie, na której znajduje się link.

Składnia: url_for('name of the function of the route','parameters (if required)')

Może być używany jako:

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

Teraz, jeśli masz link do strony indeksu: możesz użyć tego:

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

Możesz z nim zrobić wiele rzeczy, na przykład:

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

Do powyższego możemy użyć:

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

W ten sposób możesz po prostu przekazać parametry!

Hiro
źródło
1
Mam pytanie, w pierwszym przykładzie metoda indeksu została przekazana jako ciąg, podczas gdy w drugiej metodzie find_question jest przekazywana jako zmienna. Czemu?
नंद
1
@AnandTyagi Czy to masz na myśli? Trasowanie adresów URL
Tony Chou
3
@ ंदनंद jeśli zmienne wykonujesz: {{ url_for('find_question' ,question_id=question.id) }}a nie{{ url_for('find_question' ,question_id={{question.id}}) }}
Abdur-Rahmaan Janhangeer
38

Zobacz dokument Flask API dlaflask.url_for()

Inne przykładowe fragmenty użycia do łączenia js lub css z szablonem znajdują się poniżej.

<script src="{{ url_for('static', filename='jquery.min.js') }}"></script>

<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
thirumalaa srinivas
źródło
1

Szablony:

Podaj nazwę funkcji i argument.

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

Widok, funkcja

@app.route('/blog/post/<string:id>',methods=['GET'])
def get_blog_post(id):
    return id
Muhammad Faizan Fareed
źródło