10.5. API kontrol untuk kamera¶
Pemilik perlu mengatur sensitivitas detektor gerakan dari mana saja -- angin menggerakkan pohon lebih banyak pada hari berangin. Itu berarti rute yang dapat dibaca oleh dasbor untuk pengaturan saat ini dan memposting perubahan.
Dict status bersama kecil di modul cukup untuk menampung pengaturan. Halaman selanjutnya menambahkan lebih banyak kunci ke dalamnya; untuk sekarang ada satu:
state = {
'threshold': 12,
'frame_count': 0,
'trigger_count': 0,
}
10.5.1. GET untuk membaca, POST untuk menulis¶
Sepasang rute -- satu get, satu post -- memberi dasbor akses baca/tulis ke 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 mengembalikan isi yang diuraikan sebagai JSON, atau None jika Content-Type bukan application/json. Handler post menangani setiap mode kegagalan -- kunci hilang, tipe salah, di luar rentang -- dan berhenti dengan microdot.abort(), yang memunculkan microdot.HTTPException untuk mempersingkat handler dengan status dan pesan yang diberikan.
10.5.2. GET, POST, PUT, DELETE¶
get() dan post() adalah dua yang paling sering kita gunakan. put() dan delete() ada untuk kasus yang mengikuti konvensi REST -- PUT /events/42 untuk mengganti event 42, DELETE /events/42 untuk menghapusnya. Handler selainnya identik.
10.5.3. Membaca string kueri dan form¶
Dasbor memposting JSON, jadi request.json adalah yang kita inginkan. Dua cara lain kamera mungkin menerima data:
args-- string kueri.?foo=1&bar=2menjadimicrodot.MultiDictyang dapat dibaca denganrequest.args.get('foo').form-- form HTML yang diposting sebagaiapplication/x-www-form-urlencoded. TipeMultiDictyang sama.
MultiDict mirip dict tetapi memungkinkan satu kunci membawa beberapa nilai (?tag=cat&tag=dog adalah dua nilai tag); lihat microdot.MultiDict untuk antarmuka lengkapnya.
10.5.4. Segmen URL dinamis¶
Path rute dapat mendeklarasikan placeholder bertipe yang dilewatkan microdot ke handler sebagai argumen tambahan:
@app.get('/events/<int:event_id>')
async def get_event(request, event_id):
return {'id': event_id, 'msg': 'placeholder'}
Converter yang didukung adalah <int:>, <re:> untuk regex kustom, <path:> untuk segmen yang dapat berisi garis miring, dan default (tanpa awalan) untuk "cocokkan apa saja hingga garis miring berikutnya." <int:event_id> menerima /events/42 dan menolak /events/abc -- penolakan menjadi 404 tanpa handler berjalan.
10.5.5. Respons kesalahan kustom¶
404 default yang dikirim microdot adalah Not found biasa. Dasbor mengharapkan JSON untuk setiap respons; timpa handler 404 sehingga juga mengembalikan JSON:
@app.errorhandler(404)
async def not_found(request):
return {'error': 'not found', 'path': request.path}, 404
errorhandler() mengambil kode status (menangkap setiap kesalahan dengan status itu) atau kelas pengecualian (menangkap setiap handler yang memunculkan pengecualian itu). Tuple (body, status) mempersingkat respons tanpa membuat Response.
Kamera sekarang mengekspos statusnya dan menerima pengeditan.