Ugrás a lényegre

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"])