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 - pip, Flask un pārlūka spēle
Ārējo bibliotēku instalēšana
pip install, virtuālā vide venv, requirements.txt - projekta atkarību pārvaldība.
Atvērtā koda licencēšana
MIT, GPL, Apache 2.0 atšķirības, kā lasīt bibliotēkas dokumentāciju.
Python pārvēršana web saskarnē
Flask @app.route(), HTTP GET/POST, render_template(), request/response cikls.
HTML un Python sasaiste
Jinja2 {{ variable }}, {% for %}, {% if %} - Python mainīgie HTML šablonos.
Interaktivitāte pārlūkprogrammā
JS fetch() → Flask POST → jsonify() atbilde → DOM atjaunošana bez lapas pārlādes.
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. 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.