Advertisement
Guest User

Untitled

a guest
Dec 17th, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.80 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import sqlite3
  4.  
  5. from flask import Flask
  6. from flask import redirect
  7. from flask import request
  8. from flask import session
  9. from jinja2 import Template
  10.  
  11. app = Flask(__name__)
  12.  
  13. app.secret_key = 'schrodinger cat'
  14.  
  15. DATABASE_PATH = os.path.join(os.path.dirname(__file__), 'database.db')
  16.  
  17.  
  18. def connect_db():
  19. return sqlite3.connect(DATABASE_PATH)
  20.  
  21.  
  22. def 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.  
  42. def 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.  
  61. def init():
  62. create_tables()
  63. init_data()
  64.  
  65.  
  66. def 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.  
  77. def 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.  
  88. def 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.  
  99. def 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.  
  110. def 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.  
  118. def 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.  
  128. def 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('/')
  159. def 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'])
  166. def 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'])
  181. def 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>')
  189. def 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. if __name__ == '__main__':
  196. app.run(debug=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement