Gyakorlat
0. Virtuális környezet és Modulok bemutatása
Beépített fájlkezelő modul
Alapból a Python a rendszerünkre feltelepített csomagokat fogja használni, melyeket be is tudunk importálni a fájlunkba. Alapértelmezetten rengeteg beépített modullal rendelkezünk, például tudunk fájlokat kezelni, melyet próbáljunk ki!
# Beolvasás
#
# builtins.py fájlból jön ez az "open" függvény
# első paramétere a fájl neve és mindig onnan értékelődik ki
# ahonnan indítottuk a pythont.
# utána jövő paraméter, hogy hogyan nyitjuk meg a fájlt.
# r - read
# w - write: felülírja az egészet
# a - append: fájl végére ír hozzá
# x - Create: Létrehozza a fájlt.
# r,w,a,x -et próbálják ki
# Készítsenek egy 01_file.txt -t vagy hasonlót
# Read:
fajl = open("01_file.txt", "r")
print(fajl.read())
fajl.close() # Mindig zárják be
# Write
fajl = open("01_file.txt", "w")
fajl.write("Okay. ")
# Mi történt a fájlal? - Felülírta teljesen
fajl.close()
# Append
fajl = open("01_file.txt", "a")
fajl.write("Okay?")
# Mi történt? - Végére írta
fajl.close()
# Create
fajl = open("something_new.txt", "x")
# Mi történt? - Létrehozta
# Ha újra lefutatják mi történik? - Errort kaptunk, ezt kezeljük is le!
fajl.close()
Hibakezelés
# Előző példában fájl újra létrehozáskor kaptunk
# egy hibát!
# Python ezeket az úgynevezett "objektumokat" szokta
# dobni, mikor hiba keletkezik és különféle
# adatokkal rendelkeznek, mint üzenet.
# Előzőben volt egy: FileExistsError: [Errno 17] File exists: 'something_new.txt'
try: # Ezen a blokkon belüli dolgokat majd elkapja
fajl = open("something_new.txt", "x")
fajl.close() # Ha errort kap, akkor nem nyitja meg a fájlt,
# szóval nem kell a finally blokkba tenni
except FileExistsError as fe: # Itt feltudjuk típus szerint sorolni, hogy mit kapjon el.
print(fe) # Ha oda írjuk, hogy "as ...", akkor abba bele menti.
# Első körben as nélkül. "Hogyan tudnánk kiírni a hibát?"
# Ezután írjuk ki, hogy "kész a fájl" hibától független
try:
fajl = open("something_new.txt", "x")
fajl.close() # Ha errort kap, akkor nem nyitja meg a fájlt,
# szóval nem kell a finally blokkba tenni
except FileExistsError as fe:
print(fe)
finally:
print("Fájl elkészítve! (Vagy már el volt)")
Virtuális környezet
Láttuk, hogy hogyan tudunk beépített modullal fájlt kezelni, de mi van akkor ha
egy külső csomagot szeretnénk használni?
Feltelepíthetjük, viszont feleslegesen terhelnénk vele a rendszerünket.
Ennek megoldására tudunk virtuális környezeteket
készíteni magunknak egy-egy
mappában.
$ python3 -m venv awesome-env
Ezután aktiválhatjuk az environmentet.
Windows : $ awesome-env\Scripts\activate.bat
Linux / Mac : $ source awesome-env/bin/activate
Ebben a virtuális környzetben kapunk egy saját csomagkezelőt, a pip-et.
$ python -m pip --version
Na és akkor a requests library-t fogjuk használni.
$ pip show requests
Telepítsük is fel!
$ pip install requests
Na de hogyan látjuk mi van feltelepítve?
$ pip list
Akár ezt a listát ki is tudjuk exportálni és megosztani másokkal, hogy aztán a saját virtuális környezetükben feltelepítsék.
$ pip freeze > requirements.txt
$ cat requirements.txt
certifi==2020.12.5
chardet==4.0.0
idna==2.10
requests==2.25.1
urllib3==1.26.3
Nyissanak egy új terminált, menjenek egy másik mappába, készítsenek ott egy virtual env-et és telepítsék fel a dolgokat.
$ python -m pip install -r requirements.txt
1. Hanyadik hét van?
Készítsetek egy Python szkriptet, ami a https://hanyadikhetvan.attiss.eu/api -ról leszedett információ alapján kiírja, hogy hanyadik hét van.
# https://hanyadikhetvan.attiss.eu/api
import requests
# Mi az az API?
# Application Programming Interface, a lényeg, hogy
# ez az interfész, amin 1-1 alkalmazást elérünk és valamilyen
# formában tudunk vele kommunikálni.
#
# Nézzék meg, hogy mi van a https://hanyadikhetvan.attiss.eu/api oldalon.
# Ez egy JSON, mely egy sztenderd adatközlési mód a weben,
# a lényeg, hogy kulcs érték párosokat tudunk az oldalon lévőhöz hasonlóképp
# leírni.
# Na és használjuk!
r = requests.get('https://hanyadikhetvan.attiss.eu/api')
print(r) # <Response [200]> - Különböző státuszkódokkal térhet vissza
# egy API, pl 200 - OK, vagy 404 - Not Found
# Vannak beépített függvényeink
print(r.status_code) # Státuszkód számként
print(r.ok) # Státuszkód 200 és 400 közé esik
# Na de olvassuk ki az adatunkat végre
print(r.content) # hmm ez így nem lesz tökéletes nekünk. Látható, hogy b'', azaz
# ezek bájtok, továbbá egy új sor is van benne
print(r.json()) # Újabb beépített függvény, mely készít nekünk egy Dictionary-t!!
print(type(r.json())) # <class 'dict'>
print(r.json()["week"]) # 5
# Végleges kód:
import requests
r = requests.get('https://hanyadikhetvan.attiss.eu/api')
print(r.json()["week"])
2. Írjátok meg a saját "hanyadikhétvan" apitokat.
# Ehhez a flask könyvtárat fogjuk használni,
# mellyel képesek vagyunk nagyon könnyedén
# webszervereket készíteni.
import flask
import requests
# Inicializáció. Ez az objektum fő amin
# keresztül mindent elérünk Flask-ben.
# Kosntruktorban átadtuk a jelenlegi App nevét,
# emlékeztek ha ez = "__main__" akkor ezt a fájlt
# indítottuk el.
app = flask.Flask(__name__)
# Engedélyezzük, hogy logoljon mindent
app.config["DEBUG"] = True
# Megmondjuk, hogy a /-re GET-el ezt a függvényt hívja meg.
# Hogy ez hogyan működik a háttérben?
# - Nézzenek utánna a különböző Python dekorátoroknak :)
@app.route('/', methods=['GET'])
def home():
# Lekérjük az előző oldalról :D Laziness 100
# Ha szeretnének saját json-el visszatérni, akkor készítsetek
# egy Dict objektumot és azzal térjetek vissza. Ezt majd a library
# megfelelő mód küldi le.
r = requests.get('https://hanyadikhetvan.attiss.eu/api')
# Visszatérünk vele
return r.json()
app.run()
3. Kössétek össze az első szkriptetekkel
import requests
r = requests.get('http://127.0.0.1:5000')
print(r.json()["week"])