10.5. Upravljački API za kameru¶
Vlasnik treba postaviti osjetljivost detektora pokreta s bilo kojeg mjesta – vjetar više pomiče drveće za vjetrovitog dana. To znači rute s kojih nadzorna ploča može čitati trenutne postavke i na koje može slati promjene.
Mali zajednički rječnik stanja na modulu dovoljan je za držanje regulatora. Kasnije stranice dodaju mu još ključeva; za sada postoji jedan:
state = {
'threshold': 12,
'frame_count': 0,
'trigger_count': 0,
}
10.5.1. GET za čitanje, POST za pisanje¶
Par ruta – jedna get, jedna post – daje nadzornoj ploči pristup čitanju/pisanju u state:
from microdot import abort
@app.get('/config')
async def get_config(request):
return state
@app.post('/config')
async def set_config(request):
body = request.json
if not body or 'threshold' not in body:
abort(400, 'missing threshold')
try:
threshold = int(body['threshold'])
except (TypeError, ValueError):
abort(400, 'threshold must be an integer')
if not 0 <= threshold <= 100:
abort(400, 'threshold out of range')
state['threshold'] = threshold
return {'ok': True, 'threshold': threshold}
microdot.Request.json vraća tijelo raščlanjeno kao JSON ili None ako Content-Type nije bio application/json. post rukovatelj prolazi kroz svaki način otkazivanja – ključ koji nedostaje, pogrešan tip, izvan raspona – i odustaje s microdot.abort(), koji podiže microdot.HTTPException kako bi prekinuo rukovatelja s danim statusom i porukom.
10.5.2. GET, POST, PUT, DELETE¶
get() i post() dvije su koje ćemo najviše koristiti. put() i delete() postoje za slučajeve koji slijede REST konvencije – PUT /events/42 za zamjenu događaja 42, DELETE /events/42 za njegovo uklanjanje. Rukovatelj je inače identičan.
10.5.3. Čitanje upitnih nizova i obrazaca¶
Nadzorna ploča šalje JSON, pa je request.json ono što želimo. Dva druga načina na koja kamera može primiti podatke:
args– upitni niz.?foo=1&bar=2postajemicrodot.MultiDictkoji možete čitati srequest.args.get('foo').form– HTML obrazac poslan kaoapplication/x-www-form-urlencoded. Isti tipMultiDict.
MultiDict je poput rječnika, ali dopušta da jedan ključ nosi više vrijednosti (?tag=cat&tag=dog su dvije tag vrijednosti); pogledajte microdot.MultiDict za potpuno sučelje.
10.5.4. Dinamični segmenti URL-a¶
Putanja rute može deklarirati tipizirane rezervirana mjesta koja microdot prosljeđuje rukovatelju kao dodatne argumente:
@app.get('/events/<int:event_id>')
async def get_event(request, event_id):
return {'id': event_id, 'msg': 'placeholder'}
Podržani pretvarači su <int:>, <re:> za prilagođeni regularni izraz, <path:> za segment koji može sadržavati kose crte i zadani (bez prefiksa) za „podudaranje s bilo čime do sljedeće kose crte”. <int:event_id> prihvaća /events/42 i odbija /events/abc – odbijanje postaje 404 bez pokretanja rukovatelja.
10.5.5. Prilagođeni odgovori na pogreške¶
Zadani 404 koji microdot šalje običan je Not found. Nadzorna ploča očekuje JSON za svaki odgovor; nadjačajte rukovatelja za 404 tako da i on vraća JSON:
@app.errorhandler(404)
async def not_found(request):
return {'error': 'not found', 'path': request.path}, 404
errorhandler() uzima ili statusni kod (hvata svaku pogrešku tog statusa) ili klasu iznimke (hvata svaki rukovatelj koji je podigao tu iznimku). Torka (body, status) prekida odgovor bez konstruiranja Response.
Kamera sada izlaže svoje stanje i prihvaća izmjene.