-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
130 lines (109 loc) · 3.49 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
import os
import secrets
import requests
from flask import Flask, jsonify
from flask_smorest import Api
from flask_jwt_extended import JWTManager
from dotenv import load_dotenv
from flask_cors import CORS
from db import db
import models
import cloudinary
from resources.user import blp as UserBlueprint
from resources.post import blp as PostBlueprint
from resources.quiz import blp as QuizBlueprint
CATEGORY_ID_FOR_STAR_TREK = None
def fetch_star_trek_questions():
from otdb import load_and_save_questions_from_csv
load_and_save_questions_from_csv()
def create_app(db_url=None):
app = Flask(__name__)
load_dotenv()
app.config["API_TITLE"] = "StarFleet API"
app.config["API_VERSION"] = "v1"
app.config["OPENAPI_VERSION"] = "3.0.3"
app.config["OPENAPI_URL_PREFIX"] = "/"
app.config["OPENAPI_SWAGGER_UI_PATH"] = "/"
app.config[
"OPENAPI_SWAGGER_UI_URL"
] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist/"
app.config["SQLALCHEMY_DATABASE_URI"] = db_url or os.getenv("DATABASE_URL", "sqlite:///data.db")
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["PROPAGATE_EXCEPTIONS"] = True
app.config['API_SPEC_OPTIONS'] = {
'security':[{"bearerAuth": []}],
'components':{
"securitySchemes":
{
"bearerAuth": {
"type":"http",
"scheme": "bearer",
"bearerFormat": "JWT"
}
}
}
}
db.init_app(app)
api = Api(app)
# Enable CORS
CORS(app, resources={r"/*": {"origins": "*"}}, supports_credentials=True)
cloudinary.config(
cloud_name = os.getenv('CLOUDINARY_CLOUD_NAME'),
api_key = os.getenv('CLOUDINARY_API_KEY'),
api_secret = os.getenv('CLOUDINARY_API_SECRET')
)
app.config["JWT_SECRET_KEY"] = "121055982679089208576533403122492505118"
jwt = JWTManager(app)
# JWT configuration starts
@jwt.expired_token_loader
def expired_token_callback(jwt_header, jwt_payload):
return (
jsonify({"message": "O token venceu.", "error": "token_expired"}),
401,
)
@jwt.invalid_token_loader
def invalid_token_callback(error):
return (
jsonify(
{"message": "Verificação falhou.", "error": "invalid_token"}
),
401,
)
@jwt.unauthorized_loader
def missing_token_callback(error):
return (
jsonify(
{
"description": "Não possui um token de acesso.",
"error": "authorization_required",
}
),
401,
)
@jwt.needs_fresh_token_loader
def token_not_fresh_callback(jwt_header, jwt_payload):
return (
jsonify(
{
"description": "O token não é novo.",
"error": "fresh_token_required",
}
),
401,
)
@jwt.revoked_token_loader
def revoked_token_callback(jwt_header, jwt_payload):
return (
jsonify(
{"description": "O token foi revogado.", "error": "token_revoked"}
),
401,
)
# JWT configuration ends
with app.app_context():
db.create_all()
fetch_star_trek_questions()
api.register_blueprint(UserBlueprint)
api.register_blueprint(PostBlueprint)
api.register_blueprint(QuizBlueprint)
return app