/
app.py
144 lines (115 loc) · 4.39 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
from flask import Flask
from flask import flash, redirect, render_template, request, session, url_for, jsonify, make_response
from flask_sqlalchemy import SQLAlchemy
from models import User, Entity
from functools import wraps
import os, json
from werkzeug.security import check_password_hash
# from flask_debugtoolbar import DebugToolbarExtension
# create app
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///main.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False
# create db session
db = SQLAlchemy(app)
# decorator auth
def authenticate(f):
@wraps(f)
def wrapper(*args, **kwargs):
if not session.get('logged_in'):
return "access denied (^v^)", 404, {"Refresh": "3; url=/"}
return f(*args, **kwargs)
return wrapper
# home page
@app.route('/')
def index():
if session.get('logged_in') and session['owner']:
entries = db.session.query(Entity).filter(Entity.user_id == session['owner']).all()
else:
entries = None
flash('It worked!')
return render_template('index.html', entries=entries, username=session.get('username'))
@app.route('/login', methods=['GET', 'POST'])
def do_admin_login():
if request.method == 'POST':
POST_USERNAME = str(request.form['username'])
POST_PASSWORD = str(request.form['password'])
query = db.session.query(User).filter(User.username == POST_USERNAME).first()
if check_password_hash(query.password, POST_PASSWORD):
session['logged_in'] = True
session['owner'] = query.id
session['username'] = POST_USERNAME
return redirect(url_for('index'))
else:
flash('wrong password!', 'error')
return render_template('login.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
"""Register Form"""
if request.method == 'POST':
new_user = User(username=request.form['username'], password=request.form['password'])
db.session.add(new_user)
db.session.commit()
flash('You are now registered in system', 'success')
return redirect(url_for('index'))
return render_template('register.html')
@app.route("/logout")
def logout():
session['logged_in'] = False
return index()
# get all entities of the current user
@app.route('/getall')
@authenticate
def get_all_entities():
entries = db.session.query(Entity).filter(Entity.user_id == session['owner']).all()
return make_response(jsonify([i.serialize for i in entries]), 200)
# get one entry of the current user
@app.route("/get/<string:slug>", methods=['GET'])
@authenticate
def get(slug):
query = db.session.query(Entity).filter(
Entity.key.in_([slug]),
Entity.user_id.in_([session["owner"]])).one_or_none()
return render_template('single.html', entity=query)
# JSON response one enity of the current user
@app.route("/api/get/<string:slug>", methods=['POST'])
@authenticate
def getapi(slug):
query = db.session.query(Entity).filter(
Entity.key.in_([slug]),
Entity.user_id.in_([session["owner"]])).one_or_none()
return make_response(jsonify(query.serialize), 200)
# set entity of the current user
@app.route("/api/set", methods=['POST'])
@authenticate
def set():
data = request.get_json()
key = data['key']
value = data['value']
# check empty one of below
if key and value:
query = db.session.query(Entity).filter(Entity.key == key, Entity.user_id == session['owner']).first()
if query is not None:
# check the same value exist
if query.value == value:
flash('key/value already exist', 'warning')
return json.dumps({'status': 'key/value already exist'})
# change only value
query.value = value
db.session.commit()
else:
# full query
db.session.add(Entity(key=key, value=value, user_id=session['owner']))
db.session.commit()
message = ('').join(("Set ", key, "/", value))
flash(message)
else:
flash('Not correct data!', 'error')
return json.dumps({'status': 'Not correct data!'})
return json.dumps({'status': 'OK'})
if __name__ == '__main__':
app.debug = False
app.secret_key = os.urandom(15)
# toolbar = DebugToolbarExtension(app)
app.run(port=2020, host='0.0.0.0')