Mercurial > personal > weather-server
diff weather_server/server.py @ 1:f66df122f18d
get the skeleton of a webserver up?
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Sun, 29 Sep 2019 00:52:13 -0400 |
parents | |
children | cda47993a193 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/weather_server/server.py Sun Sep 29 00:52:13 2019 -0400 @@ -0,0 +1,69 @@ +import bson +import flask + +from . import common +from . import locations +from . import types + + +def build_app(root_directory: str) -> flask.Flask: + locs = locations.Locations(root_directory) + app = flask.Flask(__name__) + + @app.route('/favicon.ico') + def favicon(): + return flask.send_file('static/favicon.ico') + + @app.route('/') + def home(): + return 'Weather server' + + @app.route('/_submit', methods=['POST']) + def submit(): + req = flask.request + target = req.args.get('location') + if not target: + flask.abort(404) + try: + target_loc = locs.get(target) + except KeyError: + flask.abort(404) + + password = req.args.get('password') + if password != target_loc.password: + flask.abort(401) + + reader = bson.decode_file_iter( + req.stream, codec_options=common.BSON_OPTIONS) + entries = [ + types.Reading.from_now( + sample_time=item['sample_time'], + temp_c=item['temp_c'], + rh_pct=item['rh_pct'], + ) + for item in reader + ] + target_loc.logger.write_rows(entries) + return {'status': 'OK'} + + @app.route('/<location>') + def show(location): + try: + loc, logger = locs.get(location) + except KeyError: + flask.abort(404) + data = logger.data + if data: + last_reading = data[-1] + tz = loc.timezone + date = tz.normalize(last_reading.sample_time.astimezone(tz)) + else: + last_reading = None + date = None + return flask.render_template( + 'location.html', + location=loc, + last_reading=last_reading, + date=date) + + return app