›_ebskola.lv
Prog I · 9. tēma · 6 stundas - Flask · Python · Web

Web integrācija //
un bibliotēkas

Pārveido Python programmu par web lietotni ar Flask. Apgūsti pip, venv, requests un Jinja2 templates.

6 stundas Flask · requests Krustiņi un nullītes
# 01 stundu plāns

6 stundas - pip, Flask un pārlūka spēle

noslēguma projekts →
$ pip install flask requestsCollecting flask...Successfully installed flask$ python -m venv venv$ source venv/bin/activate(venv) $pip freeze > requirements.txt// pip + venv
pip · venvbibliotēkas

Ārējo bibliotēku instalēšana

pip install, virtuālā vide venv, requirements.txt - projekta atkarību pārvaldība.

9.1 stundaatvērt ↗
MITbrīva lietošanaGPLdalīties ar koduApache 2.0// licences
licencesatvērtais kods

Atvērtā koda licencēšana

MIT, GPL, Apache 2.0 atšķirības, kā lasīt bibliotēkas dokumentāciju.

9.2 stundaatvērt ↗
PārlūksFlask@app.routerender_templatePython// Flask
Flaskweb

Python pārvēršana web saskarnē

Flask @app.route(), HTTP GET/POST, render_template(), request/response cikls.

9.3 stundaatvērt ↗
index.html (Jinja2)<h1>{{ vārds }}</h1>{% for x in saraksts %} <li>{{ x }}</li>{% endfor %}app.pyrender_template( 'index.html', vārds="Anna")// Jinja2
Jinja2templates

HTML un Python sasaiste

Jinja2 {{ variable }}, {% for %}, {% if %} - Python mainīgie HTML šablonos.

9.4 stundaatvērt ↗
fetch('/api/gajiens', { method: 'POST', body: JSON.stringify(g)}).then(r => r.json()) .then(d => atjaunot(d))JavaScript fetch() → Flask → JSON// fetch() API
fetch · JSONinteraktivitāte

Interaktivitāte pārlūkprogrammā

JS fetch() → Flask POST → jsonify() atbilde → DOM atjaunošana bez lapas pārlādes.

9.5 stundaatvērt ↗
Krustiņi un Nullītes · FlaskXOXO$ flask run
Python · Flaskprojekts

Noslēguma projekts: Krustiņi un nullītes

Flask backend + HTML/JS frontend. Spēles stāvoklis Python serverī, gājieni caur REST API.

9.6 projektsatvērt ↗
# 02 špikeris

9. tēmas špikeris - bibliotēkas un tīmekļa saskarne

pip, virtuālā vide, API, licences un Streamlit. Katrs bloks atbilst vienai stundai.

9.1 Virtuālā vide un pip

# Izveido projektam savu vidi (lai bibliotēkas nesajaucas starp projektiem)
python -m venv venv

# Aktivizē
venv\Scripts\activate          # Windows
source venv/bin/activate       # macOS / Linux
# Rindas sākumā jāparādās (venv)

pip install requests           # uzstāda bibliotēku
pip list                       # ko esmu uzstādījis?
pip freeze > requirements.txt  # saraksts citiem

# Cits cilvēks atkārto tavu vidi ar vienu komandu:
pip install -r requirements.txt

# .gitignore OBLIGĀTI:
venv/          # vide NEKAD nedrīkst nonākt GitHub - tā ir simtiem MB
.env           # paroles arī ne

GitHub sūti requirements.txt, nevis pašu venv/ mapi.

9.2 API izsaukums ar requests

import requests

def laiks_riga():
    try:
        r = requests.get(
            "https://api.open-meteo.com/v1/forecast",
            params={"latitude": 56.95, "longitude": 24.10,
                    "current_weather": True},
            timeout=5                      # bez šī programma var karāties mūžīgi
        )
        if r.status_code != 200:           # 200 = viss kārtībā
            return None
        return r.json()["current_weather"]
    except requests.exceptions.RequestException:
        print("Nav savienojuma ar serveri")
        return None

dati = laiks_riga()
if dati:
    print(dati["temperature"])

# Statusa kodi: 200 OK , 404 nav atrasts , 500 servera kļūda

Vienmēr pārbaudi status_code un liec timeout - internets var arī nestrādāt.

9.3 Streamlit - Python kā tīmekļa lapa

import streamlit as st

st.title("Mans projekts")
st.write("Vienkāršs teksts")
st.markdown("**Trekns** un *slīps*")

vards = st.text_input("Tavs vārds:")
vecums = st.number_input("Vecums", min_value=1, max_value=120)

if st.button("Apstiprināt"):
    if vards:
        st.write(f"Sveiks, {vards}!")
    else:
        st.warning("Lūdzu ievadi vārdu")

st.sidebar.header("Iestatījumi")
diapazons = st.sidebar.slider("Diapazons", 1, 1000, 100)

Palaid ar streamlit run lapa.py, NEVIS python lapa.py. Skripts izpildās no augšas pie katra klikšķa, tāpēc while cikls te neder.

9.4-9.5 HTML/CSS un session_state

import streamlit as st

# Savs HTML - vajag unsafe_allow_html=True, citādi redzēsi tagus kā tekstu
st.markdown("<h1 style='color:#FFB142;'>Virsraksts</h1>",
            unsafe_allow_html=True)

col1, col2 = st.columns([2, 1])       # pirmā kolonna divreiz platāka
with col1:
    st.write("Kreisā puse")

# session_state - BEZ ŠĪ lapa aizmirst visu pie katra klikšķa
if "klikski" not in st.session_state:      # inicializē tikai pirmoreiz
    st.session_state.klikski = 0

if st.button("Klikšķini"):
    st.session_state.klikski += 1
st.write(f"Klikšķi: {st.session_state.klikski}")

# Forma - iztukšojas pēc nosūtīšanas
with st.form("forma", clear_on_submit=True):
    jauns = st.text_input("Jauns uzdevums")
    ok = st.form_submit_button("Pievienot")

# Katrai pogai ciklā vajag SAVU key
for i, u in enumerate(st.session_state.todo):
    st.button("Dzēst", key=f"del_{i}")

Parasts mainīgais Streamlit lapā vienmēr paliek 1 - skaitītājam obligāti vajag session_state.

9.6 Noslēguma projekts un licences

import streamlit as st

if "laukums" not in st.session_state:
    st.session_state.laukums = ["" for _ in range(9)]
    st.session_state.gajiens = "X"

UZVARES = [(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)]

for rinda in range(3):
    cols = st.columns(3)
    for k in range(3):
        i = rinda * 3 + k
        if cols[k].button(st.session_state.laukums[i] or " ", key=f"r{i}"):
            if not st.session_state.laukums[i]:          # neaizņemta rūtiņa
                st.session_state.laukums[i] = st.session_state.gajiens
                st.session_state.gajiens = "O" if st.session_state.gajiens == "X" else "X"

# Licences (9.2): MIT - dari ko gribi, norādi autoru
#                 GPL - tavs projekts arī jāpublicē kā atvērtais kods
#                 bez licences - neviens neko nedrīkst

Pirms publicēšanas pārbaudi savu bibliotēku licences - viena GPL bibliotēka var noteikt tavu projekta licenci.

$ flask run # Python kļūst par web serveri portā 5000