· 4 years ago · May 17, 2021, 05:46 PM
1❯ cats app.py
2import os.path
3from flask import Flask, Response, g, request, jsonify, redirect
4import urllib.request
5import sqlite3
6#
7import config
8
9app = Flask(__name__)
10app.config.from_object(config)
11
12def initialize_db():
13 conn = sqlite3.connect(f'{config.SQLITE_DB_PATH}')
14 print("Database opened")
15 conn.execute(
16 'CREATE TABLE IF NOT EXISTS todo ( id integer PRIMARY KEY, todo_text text NOT NULL, completed integer default 0 );')
17 return conn
18
19
20def select_all_tasks(conn):
21 data = []
22 conn.row_factory = sqlite3.Row
23 c = conn.cursor()
24 c.execute('select * from todo')
25 for data_row in c.fetchall():
26 data.append(dict(data_row))
27 return data
28
29def picture_of_the_day_exists() -> bool:
30 if os.path.isfile(f"{config.FILE_STORAGE}/{config.TODAYS_PICTURE_FILENAME}"):
31 return True
32 return False
33
34def save_picture_of_the_day():
35 with urllib.request.urlopen("https://picsum.photos/1200") as response, open(f"{config.FILE_STORAGE}/{config.TODAYS_PICTURE_FILENAME}", 'wb') as out_file:
36 data = response.read() # a `bytes` object
37 out_file.write(data)
38
39
40@app.route(f"{config.PATH_PREFIX}/todos", methods=['GET'])
41def get_todos():
42 return jsonify(select_all_tasks(get_db()))
43
44
45@app.route(f"{config.PATH_PREFIX}/todos", methods=['POST'])
46def add_todo():
47 conn = get_db()
48 text = request.form.get("todo_text")
49 conn.execute(f"INSERT INTO todo (todo_text, completed) VALUES ('{text}', 0);")
50 conn.commit()
51 return redirect("/", code=301)
52
53
54@app.route(f"{config.PATH_PREFIX}/picture_of_the_day")
55def show_image():
56 if not picture_of_the_day_exists():
57 save_picture_of_the_day()
58 if os.path.isfile(f"{config.FILE_STORAGE}/{config.TODAYS_PICTURE_FILENAME}"):
59 content = open(f"{config.FILE_STORAGE}/{config.TODAYS_PICTURE_FILENAME}", "rb").read()
60 return Response(content, mimetype="image/jpg")
61 return 'No image found =('
62
63def get_db():
64 if not "db" in g:
65 g.db = initialize_db()
66 return g.db
67
68@app.route(f"{config.PATH_PREFIX}/")
69def index():
70 return ""
71
72if __name__ == '__main__':
73 app.run(debug=True, host='0.0.0.0', port=config.PORT)