Садржај

Везе унутар веб-апликације

У претходној лекцији смо показали примере веб-страница које садрже везе ка другим веб-страницама у оквиру истог веб-сајта. Међутим, тада смо напоменули да те везе нису исправне, с обзиром да су користиле путање до датотека, на сличан начин као што смо навикли то да програмирамо у статичким веб-страницама. Међутим, у библиотеци Flask ово није исправно.

Уместо тога, препоручени начин за креирање веза унутар веб-апликације јесте да користиш функцију url_for којој прослеђујеш назив Python функције која одређује приступну тачку ка којој правиш везу. На пример, ако веб-сајт има страницу за контакт која се добија позивом Python функције kontakt у датотеци main.py, онда ћеш везу ка тој страници направити позивом функције url_for(„kontakt”). Другим речима, ова функција очекује назив Python функције којом се добија жељени ресурс. Библиотека Flask ће за тебе конструисати исправну URL адресу.

Напомена: С обзиром да се ради о позиву функције, у шаблону је обавезно да тај позив наведеш између двоструких витичастих заграда, како би се резултујућа веза исписала на одговарајућем месту у шаблону. На пример, {{ url_for(„kontakt”) }}.

Наредни пример илуструје како можеш креирати везе унутар веб-апликације коришћењем функције url_for.

# Poglavlje5/10/main.py

from flask import Flask, render_template

app = Flask(__name__)


@app.route("/")
def pocetna():
    return render_template("pocetna.html", naslov="Почетна страница")


@app.route("/odeljenja")
def odeljenja():
    return render_template(
        "odeljenja.html",
        naslov="Одељења",
        razredi=["Први", "Други", "Трећи", "Четврти"],
    )
<!-- Poglavlje5/10/templates/osnovni_sablon.html -->

<html lang="sr">
    <head>
        <title>Гимназија "Десанка Максимовић"</title>
    </head>
    <body>
        <header>
        <h1 id="glavni-naslov">Гимназија <q>Десанка Максимовић</q></h1>
        <nav>
            <a href="{{url_for('pocetna')}}">Почетна</a>
            <a href="{{url_for('odeljenja')}}">Одељења</a>
        </nav>
        </header>

        <h2>{{naslov}}</h2>
        {% block sadrzaj %}
    {% endblock %}
    </body>
</html>
<!-- Poglavlje5/10/templates/pocetna.html -->

{% extends "osnovni_sablon.html" %}
{% block sadrzaj %}
<p>Добродошли на веб-сајт гимназије <q>Десанка Максимовић</q>!</p>
{% endblock %}
<!-- Poglavlje5/10/templates/odeljenja.html -->

{% extends "osnovni_sablon.html" %}
{% block sadrzaj %}
<ul>
    {% for razred in razredi %}
        <li>{{razred}} разред</li>
    {% endfor %}
</ul>
{% endblock %}

Покрени овај пример и отвори веб-прегледач на адреси http://127.0.0.1:5000/. Увери се да обе везе у навигацији највишег нивоа раде исправно.

Функцију url_for можеш да користиш и у Python коду, увожењем из модула flask. Она се обично користи за преусмеравање (redirect) захтева на неку другу URL адресу. Преусмеравање се ради позивом функције redirect, која очекује URL aдресу. И функцију redirect је потребно да увезеш из модула flask пре употребе.

# Poglavlje5/11/main.py

from flask import Flask, render_template, url_for, redirect

app = Flask(__name__)


@app.route("/")
def pocetna():
    return render_template("pocetna.html")


@app.route("/stara-pocetna")
def stara_pocetna():
    return redirect(url_for("pocetna"))
<!-- Poglavlje5/11/templates/pocetna.html -->

<html lang="sr">
    <head>
        <title>Почетна страница</title>
    </head>
    <body>
        <h1>Почетна страница</h1>
    </body>
</html>

Покрени овај пример и отвори веб-прегледач на адреси http://127.0.0.1:5000/stara-pocetna. Посматрањем језичка ”Network” увери се да ће веб-прегледач преусмерити захтев на почетну страницу. Осигурај се да је означена опција ”Preserve log” приликом посматрања језичка како би ти веб-прегледач задржао све HTTP захтеве.

../_images/slika_165a.png

Испоручивање статичког садржаја

HTML код веб-страница обично садржи и ресурсе који се клијентима испоручују у неизмењеном облику. За овакве ресурсе кажемо да су статички. Међу њима се налазе: датотеке стилских листова писане у језику CSS, датотеке са клијентским кодом писане у језику JavaScript, мултимедијални садржаји (слике, видео и звучни записи), разне друге датотеке итд.

Све статичке ресурсе у библиотеци Flask смешташ у директоријум static, који има слично значење за статичке ресурсе као што директоријум templates има за шаблоне. Пример структуре директоријума може бити следећи:

.
├── main.py
├── static
│   ├── klijentski_kod.js
│   ├── logo.png
│   └── stil.css
└── templates
    ├── odeljenja.html
    ├── osnovni_sablon.html
    └── pocetna.html

Везе ка статичким ресурсима у шаблонима наводиш помоћу функције url_for, али са једном разликом у односу на приступ који си видео до сада. Приликом конструисања URL адреса за статичке ресурсе, функција url_for очекује два аргумента:

  • Први аргумент је увек ниска „static” која говори да ће ресурс бити испоручен статички.

  • Други аргумент, filename, представља назив датотеке у директоријуму static која се испоручује.

У шаблону osnovni_sablon.html из наредног примера можеш видети примере конструисања URL адреса за сва три статичка ресурса. Наравно, функцију url_for можеш користити на овај начин и у Python коду.

# Poglavlje5/12/main.py

from flask import Flask, render_template

app = Flask(__name__)


@app.route("/")
def pocetna():
    return render_template("pocetna.html", naslov="Почетна страница")


@app.route("/odeljenja")
def odeljenja():
    return render_template(
        "odeljenja.html",
        naslov="Одељења",
        razredi=["Први", "Други", "Трећи", "Четврти"],
    )

Статичке датотеке које су заједничке за све веб-странице, као што су подразумевани стилови или заједнички код који се извршава на страни клијента, можеш навести у оквиру садржаја основног шаблона који ће наследити остали шаблони. Ова техника ти омогућује да, уколико дође до неких промена у увожењу статичких датотека (на пример, једна .css датотека се замени двема), промене можеш да имплементираш само на једном месту, а да све веб-странице аутоматски наследе те измене.

<!-- Poglavlje5/12/templates/osnovni_sablon.html -->

<html lang="sr">
<head>
    <title>Гимназија "Десанка Максимовић"</title>
        <link
            rel="stylesheet"
            type="text/css"
            href="{{url_for('static', filename='stil.css')}}"
        >
</head>
<body>
    <header>
        <img
            src="{{url_for('static', filename='logo.png')}}"
            alt="Логотип гимназије"
        >
        <h1 id="glavni-naslov">Гимназија <q>Десанка Максимовић</q></h1>
        <nav>
            <a href="{{url_for('pocetna')}}">Почетна</a>
            <a href="{{url_for('odeljenja')}}">Одељења</a>
        </nav>
    </header>

    <h2>{{naslov}}</h2>
    {% block sadrzaj %} {% endblock %}

    <script src="{{url_for('static', filename='klijentski_kod.js')}}"></script>
</body>
</html>

Везе ка статичким ресурсима се на исти начин могу наводити и у осталим шаблонима, уколико за тиме има потребе.

<!-- Poglavlje5/12/templates/pocetna.html -->

{% extends "osnovni_sablon.html" %}
{% block sadrzaj %}
<p>Добродошли на веб-сајт гимназије <q>Десанка Максимовић</q>!</p>
{% endblock %}
<!-- Poglavlje5/12/templates/odeljenja.html -->

{% extends "osnovni_sablon.html" %}
{% block sadrzaj %}
<ul>
    {% for razred in razredi %}
    <li>{{razred}} разред</li>
    {% endfor %}
</ul>
{% endblock %}

Статичке датотеке се наводе као и у било којој другој веб-апликацији. Обрати пажњу на директоријум static у оквиру којег су датотеке смештене.

// Poglavlje5/12/static/klijentski_kod.js

console.log("Поздрав из конзоле веб-прегледача!");
/* Poglavlje5/12/static/stil.css */

img {
    width: 40px;
    display: block;
    margin: auto;
}

body {
    font-family: Arial, Helvetica, sans-serif;
    background-color: rgb(241, 252, 255);
}

h1,
nav {
    text-align: center;
}
../_images/slika_165b.png
(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+