/
cors.py
67 lines (47 loc) · 1.54 KB
/
cors.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
import os
from functools import wraps
from demo_services.core.response import RESTSuccess
CORS_ALLOW_ORIGIN_ENV_VAR_NAME = 'CORS_ALLOW_ORIGIN'
def make_headers(
allow_origin=None,
allow_methods=None,
allow_headers=None,
max_age=None,
):
results = []
if allow_origin is None:
allow_origin = os.environ.get(CORS_ALLOW_ORIGIN_ENV_VAR_NAME)
if allow_origin is not None:
results.append(('Access-Control-Allow-Origin', allow_origin, ))
if allow_methods is not None:
allow_methods = ','.join(allow_methods)
results.append(('Access-Control-Allow-Methods', allow_methods, ))
if allow_headers is not None:
results.append(('Access-Control-Allow-Headers', allow_headers, ))
if max_age is not None:
results.append(('Access-Control-Max-Age', max_age, ))
return results
def with_cors(
allow_origin=None,
allow_methods=None,
allow_headers=None,
max_age=None,
):
headers = make_headers(
allow_origin=allow_origin,
allow_methods=allow_methods,
allow_headers=allow_headers,
max_age=max_age,
)
def decorator(view_func):
@wraps(view_func)
def wrapper(request, *args, **kwargs):
if request.method == 'OPTIONS':
response = RESTSuccess()
else:
response = view_func(request, *args, **kwargs)
for header, value in headers:
response.headers.add(header, value)
return response
return wrapper
return decorator