· 9 years ago · Dec 26, 2016, 01:18 AM
1# -*- coding: utf-8 -*-
2import os
3import sqlite3
4
5from flask import Flask
6from flask import redirect
7from flask import request
8from flask import session
9from jinja2 import Template
10
11app = Flask(__name__)
12
13app.secret_key = 'schrodinger cat'
14
15DATABASE_PATH = os.path.join(os.path.dirname(__file__), 'database.db')
16
17
18def connect_db():
19 return sqlite3.connect(DATABASE_PATH)
20
21
22def create_tables():
23 conn = connect_db()
24 cur = conn.cursor()
25 cur.execute('''
26 CREATE TABLE IF NOT EXISTS user(
27 id INTEGER PRIMARY KEY AUTOINCREMENT,
28 username VARCHAR(32),
29 password VARCHAR(32)
30 )''')
31 cur.execute('''
32 CREATE TABLE IF NOT EXISTS time_line(
33 id INTEGER PRIMARY KEY AUTOINCREMENT,
34 user_id INTEGER,
35 content TEXT,
36 FOREIGN KEY (`user_id`) REFERENCES `user`(`id`)
37 )''')
38 conn.commit()
39 conn.close()
40
41
42def init_data():
43 users = [
44 ('user1', '123456'),
45 ('user2', '123456')
46 ]
47 lines = [
48 (1, 'Hello'),
49 (1, 'World'),
50 (2, 'Im 2'),
51 (2, 'Hello 2')
52 ]
53 conn = connect_db()
54 cur = conn.cursor()
55 cur.executemany('INSERT INTO `user` VALUES(NULL,?,?)', users)
56 cur.executemany('INSERT INTO `time_line` VALUES(NULL,?,?)', lines)
57 conn.commit()
58 conn.close()
59
60
61def init():
62 create_tables()
63 init_data()
64
65
66def get_user_from_username_and_password(username, password):
67 conn = connect_db()
68 cur = conn.cursor()
69 cur.execute('SELECT id, username FROM `user` WHERE username=\'%s\' AND password=\'%s\'' % (username, password))
70 row = cur.fetchone()
71 conn.commit()
72 conn.close()
73
74 return {'id': row[0], 'username': row[1]} if row is not None else None
75
76
77def get_user_from_id(uid):
78 conn = connect_db()
79 cur = conn.cursor()
80 cur.execute('SELECT id, username FROM `user` WHERE id=%d' % uid)
81 row = cur.fetchone()
82 conn.commit()
83 conn.close()
84
85 return {'id': row[0], 'username': row[1]}
86
87
88def create_time_line(uid, content):
89 conn = connect_db()
90 cur = conn.cursor()
91 cur.execute('INSERT INTO `time_line` VALUES (NULL, %d, \'%s\')' % (uid, content))
92 row = cur.fetchone()
93 conn.commit()
94 conn.close()
95
96 return row
97
98
99def get_time_lines():
100 conn = connect_db()
101 cur = conn.cursor()
102 cur.execute('SELECT id, user_id, content FROM `time_line` ORDER BY id DESC')
103 rows = cur.fetchall()
104 conn.commit()
105 conn.close()
106
107 return map(lambda row: {'id': row[0], 'user_id': row[1], 'content': row[2]}, rows)
108
109
110def user_delete_time_line_of_id(uid, tid):
111 conn = connect_db()
112 cur = conn.cursor()
113 cur.execute('DELETE FROM `time_line` WHERE user_id=%s AND id=%s' % (uid, tid))
114 conn.commit()
115 conn.close()
116
117
118def render_login_page():
119 return '''
120<form method="POST" style="margin: 60px auto; width: 140px;">
121 <p><input name="username" type="text" /></p>
122 <p><input name="password" type="password" /></p>
123 <p><input value="Login" type="submit" /></p>
124</form>
125 '''
126
127
128def render_home_page(uid):
129 user = get_user_from_id(uid)
130 time_lines = get_time_lines()
131 template = Template('''
132<div style="width: 400px; margin: 80px auto; ">
133 <h4>I am: {{ user['username'] }}</h4>
134
135 <form method="POST" action="/create_time_line">
136 Add time line:
137 <input type="text" name="content" />
138 <input type="submit" value="Submit" />
139 </form>
140
141 <ul style="border-top: 1px solid #ccc;">
142 {% for line in time_lines %}
143 <li style="border-top: 1px solid #efefef;">
144 <p>{{ line['content'] }}</p>
145
146 {% if line['user_id'] == user['id'] %}
147 <a href="/delete/time_line/{{ line['id'] }}">Delete</a>
148 {% endif %}
149
150 </li>
151 {% endfor %}
152 </ul>
153</div>
154 ''')
155 return template.render(user=user, time_lines=time_lines)
156
157
158@app.route('/')
159def index():
160 if 'uid' in session:
161 return render_home_page(session['uid'])
162 return redirect('/login')
163
164
165@app.route('/login', methods=['GET', 'POST'])
166def login():
167 if request.method == 'GET':
168 return render_login_page()
169 elif request.method == 'POST':
170 username = request.form['username']
171 password = request.form['password']
172 user = get_user_from_username_and_password(username, password)
173 if user is not None:
174 session['uid'] = user['id']
175 return redirect('/')
176 else:
177 return redirect('/login')
178
179
180@app.route('/create_time_line', methods=['POST'])
181def time_line():
182 if 'uid' in session:
183 uid = session['uid']
184 create_time_line(uid, request.form['content'])
185 return redirect('/')
186
187
188@app.route('/delete/time_line/<tid>')
189def delete_time_line(tid):
190 if 'uid' in session:
191 user_delete_time_line_of_id(session['uid'], tid)
192 return redirect('/')
193
194
195@app.route('/logout')
196def logout():
197 if 'uid' in session:
198 session.pop('uid')
199 return redirect('/login')
200
201
202if __name__ == '__main__':
203 app.run(debug=True)