forked from c137santos/FATEC-API-1-SEMESTRE
-
Notifications
You must be signed in to change notification settings - Fork 0
/
wgsi.py
137 lines (113 loc) · 4.76 KB
/
wgsi.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
from wsgiref.simple_server import make_server
import json
from fs.copy import copy_fs
from fs.walk import Walker
import sys
# Implementação do protocolo de comunicação entre o python e a web
# WSGI - Web Server Gateway Interface
# Esse padrão permitirá que o navegador possa executar nosso código para internet
# Referência PEP333
class HttpResponse:
"""
Essa classe montar o objeto de resposta HTTP, por meio das informações da requisição web.
Atributos:
header (dict): Esse é um dicionário para as informações header's HTTP
body (str): O texto da resposta.
content_type (str): O tipo que é composto o texto; Str, binário, html.
status (str): Um dos códigos HTTP de status, ok, not_found. etc.
Methods:
__init__ (self, header, body, content_type, status): Inicializa a instância HTTP
__iter__(self): Permite tornar o objeto iterável
"""
def __init__(
self,
content="",
status="200 OK",
headers={},
content_type="text/html;charset=UTF-8",
):
self.content = content
self.status = status
self.headers = headers
self.headers["content-type"] = content_type
self.headers["access-control-allow-origin"] = "*"
def __iter__(self):
# iterável que será escrito no body do response
yield self.content.encode("utf-8")
## Função retorna um response dado o request
class JsonResponse:
"""
JSON é o formato JavaScript Object Notation.
Formato de dados leve e fácil de ler usado para transmitir dados
estruturados entre um servidor e um cliente. Amplamente utilizado
em APIs para transmitir informações. Importante a diferença entre
resposta JSON e resposta HTTP
Methods:
__init__ (self, header, body, content_type, status): Inicializa a instância HTTP
__iter__(self): Permite tornar o objeto iterável
"""
def __init__(
self, content="{}", status="200 OK", headers={}, content_type="application/json"
):
self.content = json.dumps(content)
self.status = status
self.headers = headers
self.headers["content-type"] = content_type
self.headers["access-control-allow-origin"] = "*"
def __iter__(self):
# iterável que será escrito no body do response
yield self.content.encode("utf-8")
class HTTPRequest:
def __init__(self, environ):
self.method = environ.get("REQUEST_METHOD", "GET")
# URL
self.path = environ.get("PATH_INFO", "/")
# 'PATH_INFO' é uma das chaves no dicionário environ.
# Ela contém a parte da URL da solicitação após o nome do domínio e a porta,
# ou seja, a parte do caminho da URL que segue a barra (/).
# Por exemplo, para a URL "http://example.com/pagina", 'PATH_INFO' conteria "/pagina".
self.query_string = environ.get("QUERY_STRING", "")
self.content_type = environ.get("CONTENT_TYPE", "")
# Por padrão os headers começam com HTTP_
# retira o HTTP_ e deixa tudo em minúscilo
self.headers = {
key[5:].lower(): value
for key, value in environ.items()
if key.startswith("HTTP_")
}
self.environ = environ
try:
request_body_size = int(environ.get("CONTENT_LENGTH", 0))
except ValueError:
request_body_size = 0
# lê o corpo do request HTTP
self.body = environ["wsgi.input"].read(request_body_size).decode("utf-8")
def retorna_response(environ, start_response):
from urls import url_match
"""
Essa é a função desenhada no padrão WSGI. Recebe request do navegador e gera response adequado.
Args:
environ (dict): Conteúdo preenchido pelo servidor. Como o método HTTP, cabeçalhos, URL,
parâmetros de consulta e outras informações relacionadas à solicitação.
start_response (str): callback enviado pelo servidor para acionar a requisição.
"""
request = HTTPRequest(environ)
view = url_match(request.path)
response = view(request)
start_response(response.status, list(response.headers.items()))
return response
def ajusta_banco(arg=False):
if arg:
copy_fs("./devdb", "./dados", walker=Walker(filter=["*.json"]))
print("Banco formatado")
if __name__ == "__main__":
if len(sys.argv) > 1:
if sys.argv[1].lower() == "db":
ajusta_banco(True)
else:
print(
f"'{sys.argv[1]}' é um argumento inválido. Para formatar o banco utilize:'python3 wgsi.py db'"
)
print("🚀 Servidor HTTP rodando! 🚀 \n Acesse o servidor em: 127.0.0.1:8080")
server = make_server("127.0.0.1", 8080, retorna_response)
server.serve_forever()