· 7 years ago · Mar 27, 2018, 09:54 PM
1from flask import Flask, request, redirect, make_response
2from flask import render_template, jsonify, session, Response
3from collections import OrderedDict
4from functools import wraps
5import uuid
6
7SECRET_KEY = 'mySecretKey'
8app = Flask(__name__)
9app.config.from_object(__name__)
10
11# fishes
12lastId = 3
13fishes = {
14 "id_1": {
15 "who": "Znajomy",
16 "where": {
17 "lat": 0.001,
18 "long": 0.002
19 },
20 "mass": 34.56,
21 "length": 23.67,
22 "kind": "szczupak"
23 },
24 "id_2": {
25 "who": "Kolega kolegi",
26 "where": {
27 "lat": 34.001,
28 "long": 52.002
29 },
30 "mass": 300.12,
31 "length": 234.56,
32 "kind": "sum olimpijczyk"
33 }
34}
35
36# users
37users = {
38 'admin': 'admin',
39 'Akwarysta69': 'J3si07r'
40}
41
42# active sessions
43active_sessions = {}
44
45
46def check_credentials(username, password):
47 if username in users:
48 if users[username] == password:
49 return True
50 return False
51
52
53def restricted_area():
54 def decorate(f):
55 @wraps(f)
56 def inner(*args, **kwargs):
57 sessionId = session.get('sessionId', None)
58 if sessionId is None:
59 return make_response(redirect("/login"))
60 if active_sessions.get(sessionId, None) is None:
61 session.clear()
62 return make_response(redirect("/login"))
63 return f(*args, **kwargs)
64 return inner
65 return decorate
66
67
68@app.route('/', methods=['GET'])
69def root_page():
70 print(active_sessions)
71 return "Portal dla fanatykow wedkarstwa"
72
73
74@app.route('/login', methods=['GET', 'POST'])
75def login_page():
76 sessionId = session.get('sessionId', None)
77 if sessionId is not None:
78 if active_sessions.get(sessionId, None) is not None:
79 return make_response(redirect("/hello"))
80 else:
81 return make_response(redirect("/logout"))
82 auth = request.authorization
83 if not auth or not check_credentials(auth.username, auth.password):
84 return Response('Incorrect username or password\n'
85 'You have to login with proper credentials',
86 401,
87 {'WWW-Authenticate': 'Basic realm="Login Required"'})
88 sessionId = str(uuid.uuid4())
89 session['sessionId'] = sessionId
90 active_sessions[sessionId] = auth.username
91 return make_response(redirect("/hello"))
92
93
94@app.route('/logout', methods=['GET'])
95@restricted_area()
96def logout_page():
97 del active_sessions[session['sessionId']]
98 session.clear()
99 return make_response(redirect("/"))
100
101
102@app.route('/hello', methods=['GET'])
103@restricted_area()
104def hello_page():
105 return render_template(
106 'hello_tmpl.html',
107 user=active_sessions[session['sessionId']]
108 )
109
110
111@app.route('/fishes', methods=['GET', 'POST'])
112@restricted_area()
113def fishes_page():
114 if request.method == 'GET':
115 return jsonify(OrderedDict(sorted(fishes.items())))
116 elif request.method == 'POST':
117 global lastId
118 tmp = 'id_' + str(lastId)
119 lastId += 1
120 put_fish(tmp)
121 return make_response(redirect('/fishes/' + tmp))
122 return 'Wrong request method'
123
124
125@app.route('/fishes/<id>', methods=['GET', 'DELETE', 'PUT', 'PATCH'])
126@restricted_area()
127def fishes_id_page(id):
128 if request.method == 'GET':
129 return get_fish_(id)
130 elif request.method == 'DELETE':
131 return delete_fish(id)
132 elif request.method == 'PUT':
133 return put_fish(id)
134 elif request.method == 'PATCH':
135 return path_fish(id)
136 else:
137 return 'Wrong request method'
138
139
140def get_fish_(id):
141 global fishes
142 fish = fishes.get(id, None)
143 if request.args.get('format', '') == 'json':
144 return jsonify(fish)
145 if fish is None:
146 return None
147 return render_template(
148 'fish_tmpl.html',
149 fish_id=id,
150 kind=fishes[id]['kind'],
151 mass=fishes[id]['mass'],
152 length=fishes[id]['length'],
153 who=fishes[id]['who'],
154 lat=fishes[id]['where']['lat'],
155 long=fishes[id]['where']['long']
156 )
157
158
159def delete_fish(id):
160 global fishes
161 if fishes.pop(id, None) is None:
162 return 'Fish id not exist'
163 return 'Removed'
164
165
166def put_fish(id):
167 global fishes
168 data = request.get_json()
169 fishes[id] = data
170 return 'Saved'
171
172
173def path_fish(id):
174 global fishes
175 if fishes[id] is None:
176 return 'Fish id not exist'
177 data = request.get_json()
178 fishes[id].update(data)
179 return 'Modified'
180
181
182if __name__ == '__main__':
183 app.run(debug=True)