Mercurial > personal > weather-server
comparison weather_server/server.py @ 3:b42c4bfe57c7
server: Use a "preamble" object in the POST to auth.
| author | Paul Fisher <paul@pfish.zone> |
|---|---|
| date | Sun, 29 Sep 2019 11:52:48 -0400 |
| parents | cda47993a193 |
| children | e7c8dcc5fc15 |
comparison
equal
deleted
inserted
replaced
| 2:cda47993a193 | 3:b42c4bfe57c7 |
|---|---|
| 1 import bson | 1 import bson |
| 2 import flask | 2 import flask |
| 3 import hmac | |
| 3 | 4 |
| 4 from . import common | 5 from . import common |
| 5 from . import locations | 6 from . import locations |
| 6 from . import types | 7 from . import types |
| 7 | 8 |
| 19 return 'Weather server' | 20 return 'Weather server' |
| 20 | 21 |
| 21 @app.route('/_submit', methods=['POST']) | 22 @app.route('/_submit', methods=['POST']) |
| 22 def submit(): | 23 def submit(): |
| 23 req = flask.request | 24 req = flask.request |
| 24 target = req.args.get('location') | |
| 25 if not target: | |
| 26 flask.abort(404) | |
| 27 try: | |
| 28 target_loc, logger = locs.get(target) | |
| 29 except KeyError: | |
| 30 flask.abort(404) | |
| 31 | |
| 32 password = req.args.get('password') | |
| 33 if password != target_loc.password: | |
| 34 flask.abort(401) | |
| 35 | |
| 36 reader = bson.decode_file_iter( | 25 reader = bson.decode_file_iter( |
| 37 req.stream, codec_options=common.BSON_OPTIONS) | 26 req.stream, codec_options=common.BSON_OPTIONS) |
| 38 entries = [ | 27 try: |
| 39 types.Reading.from_now( | 28 preamble = next(reader) |
| 40 sample_time=item['sample_time'], | 29 loc_name = preamble['location'] |
| 41 temp_c=item['temp_c'], | 30 password = str(preamble['password']) |
| 42 rh_pct=item['rh_pct'], | 31 loc, logger = locs.get(loc_name) |
| 43 ) | 32 if not hmac.compare_digest(password, loc.password): |
| 44 for item in reader | 33 flask.abort(400) |
| 45 ] | 34 entries = [ |
| 35 types.Reading.from_now( | |
| 36 sample_time=item['sample_time'], | |
| 37 temp_c=item['temp_c'], | |
| 38 rh_pct=item['rh_pct'], | |
| 39 ) | |
| 40 for item in reader | |
| 41 ] | |
| 42 except (KeyError, bson.InvalidBSON): | |
| 43 flask.abort(400) | |
| 46 logger.write_rows(entries) | 44 logger.write_rows(entries) |
| 47 return flask.jsonify({'status': 'OK'}) | 45 return flask.jsonify({'status': 'OK'}) |
| 48 | 46 |
| 49 @app.route('/<location>') | 47 @app.route('/<location>') |
| 50 def show(location): | 48 def show(location): |
