· 10 years ago · Jul 12, 2016, 05:45 AM
1import json
2import os
3import sqlite3
4
5from flask import Flask, render_template, request, flash, session, redirect, url_for
6from werkzeug import security
7
8app = Flask(__name__)
9app.secret_key = os.urandom(32)
10conn = sqlite3.connect('database.db')
11
12
13@app.route('/')
14def index():
15 if 'logged_in' in session and session['logged_in']:
16 return 'Welcome, %s' % (session['username'])
17 else:
18 return 'Welcome, Guest'
19
20
21@app.route('/register', methods=['GET', 'POST'])
22def register():
23 if request.method == "POST":
24 username = request.form['username']
25 email = request.form['email']
26 password = request.form['password']
27 confirm_password = request.form['confirm_password']
28
29 if password != confirm_password:
30 flash("Passwords do not match!")
31 else:
32 res = conn.cursor().execute("SELECT username, email FROM Accounts WHERE username = ? OR email = ?",
33 [username, email])
34 one = res.fetchone()
35 if one is not None:
36 if one[0] == username:
37 flash("Username taken")
38 elif one[1] == email:
39 flash("Email already in use")
40 else:
41 pwhash = security.generate_password_hash(password, method='pbkdf2:sha512:1000', salt_length=16)
42 _ = conn.cursor().execute("INSERT INTO Accounts (password_hash, username, email) VALUES (?,?,?)",
43 [pwhash, username, email])
44 conn.commit()
45 flash("Registered Successfully")
46 _.close()
47 res.close()
48 return render_template('register.html')
49
50
51@app.route('/login', methods=['GET', 'POST'])
52def login():
53 if 'logged_in' in session and session['logged_in']:
54 return redirect(url_for('index'))
55 elif request.method == "POST":
56 email = request.form['email']
57 password = request.form['password']
58 q = conn.cursor().execute("SELECT * FROM Accounts WHERE email = ?", [email])
59 first = q.fetchone()
60 if first is not None:
61 pwhash = first[1]
62 if security.check_password_hash(pwhash, password):
63 session['logged_in'] = True
64 session['username'] = first[2]
65 flash("Logged in successfully")
66 else:
67 flash("Incorrect Password!")
68 else:
69 flash("Invalid Email Address")
70 q.close()
71 return render_template('login.html')
72
73
74@app.route('/logout')
75def logout():
76 if 'logged_in' in session and session['logged_in']:
77 session.pop('logged_in', None)
78 session.pop('username', None)
79 return redirect(url_for('index'))
80
81
82@app.route('/api/search/<name>')
83def api_search(name):
84 res = conn.cursor().execute("SELECT username FROM Accounts WHERE username LIKE (?)", [name + "%"])
85 # conn.commit()
86 t = list()
87 for row in res:
88 t.append(row[0])
89 return json.dumps(t)
90
91
92def init_db():
93 conn.executescript('''
94 CREATE TABLE IF NOT EXISTS `Accounts` (
95 'id' INTEGER PRIMARY KEY AUTOINCREMENT,
96 'password_hash' TEXT NOT NULL,
97 'username' VARCHAR(64) NOT NULL,
98 'email' TEXT NOT NULL
99 );
100 ''')
101 conn.commit()
102 # curr.close()
103
104
105if __name__ == '__main__':
106 init_db()
107 # app.debug = True
108 app.run()