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