Desarrollar una aplicación backend robusta y escalable utilizando Django que integre una interfaz de administrador intuitiva para la gestión eficiente de datos y funcionalidades junto con un REST API completo que facilite la comunicación con las aplicaciones cliente de tal forma que garantice la seguridad, el rendimiento y la extensibilidad del sistema.
Desde la línea de comandos
python -m venv environment
environment\Scripts\activate
Desde la línea de comandos
pip install -r requirements.txt
Abra el proyecto con VSCode, con:
code .
Levante el servidor, con:
python manage.py runserver
(STOP 1) Revise los cambios en el navegador en el URL:
Edite el archivo main/views.py, con:
...
def index(request):
# Objeto con los datos a renderizar
data = {
'title': 'Landing - Dashboard',
}
# Renderización en la plantilla
return render(request, 'main/index.html', data)
Modifique el archivo templates/main/content/data.html, con:
...
<!-- START - title -->
{{ title }}
<!-- END - title -->
...
(STOP 2) Revise los cambios en el navegador en el URL:
Edite el archivo main/views.py, con:
endpoint
con la URL del proyecto y la ruta de la aplicación. ...
# Importe requests y json
import requests
import json
def index(request):
# Arme el endpoint del REST API
current_url = request.build_absolute_uri()
url = current_url + '/api/v1/landing'
# Petición al REST API
response_http = requests.get(url)
response_dict = json.loads(response_http.content)
print("Endpoint ", url)
print("Response ", response_dict)
# Respuestas totales
total_responses = len(response_dict.keys())
# Objeto con los datos a renderizar
data = {
'title': 'Landing - Dashboard',
'total_responses': total_responses,
}
# Renderización en la plantilla
return render(request, 'main/index.html', data)
Modifique el archivo templates/main/content/data.html, con:
...
<!-- START - total_responses -->
{{ total_responses }}
<!-- END - total_responses -->
...
<!-- START - total_responses_table -->
{{ total_responses }}
<!-- END - total_responses_table -->
respuestas
(STOP 3) Revise los cambios:
Edite el archivo main/views.py, con:
...
# Importe requests y json
import requests
import json
def index(request):
...
# Respuestas totales
...
# Valores de la respuesta
responses = response_dict.values()
# Objeto con los datos a renderizar
data = {
'title': 'Landing - Dashboard',
'total_responses': total_responses,
'responses': responses
}
# Renderización en la plantilla
return render(request, 'main/index.html', data)
Modifique el archivo templates/main/content/data.html, con:
...
<!-- START - responses -->
{% for row in responses %}
<tr class="text-gray-700 dark:text-gray-400">
<td class="px-4 py-3 text-sm">
<!-- START - row.email -->
{{ row.email }}
<!-- END - row.email -->
</td>
<td class="px-4 py-3 text-sm">
<!-- START - row.saved -->
{{ row.saved }}
<!-- END - row.saved -->
</td>
</tr>
{% endfor %}
<!-- END - responses -->
...
(STOP 4) Revise los cambios:
Edite el archivo static/js/charts-pie.js, con:
...
const pieCtx = ...
window.myPie = ...
// Función para procesar el JSON
countCommentsByHour = (data) => {
// Inicializar contadores por rango de horas
const labels = ["0 a.m. - 8 a.m.", "8 a.m. - 16 p.m.", "16 p.m. - 0 a.m."];
const counts = [0, 0, 0];
Object.values(data).forEach(record => {
const savedTime = record.saved;
if (!savedTime) {
return;
}
// Convertir a formato de hora AM/PM
const formattedTime = savedTime.replace('a. m.', 'AM').replace('p. m.', 'PM');
// Crear objeto Date con la cadena de tiempo
const dt = new Date(Date.parse(formattedTime.replace(/(\d{2}\/\d{2}\/\d{4}), (\d{2}):(\d{2}):(\d{2}) (AM|PM)/, '$1 $2:$3:$4 $5')));
const hour = dt.getHours();
// Clasificar en el rango correspondiente
if (hour >= 0 && hour < 8) {
counts[0]++;
} else if (hour >= 8 && hour < 16) {
counts[1]++;
} else {
counts[2]++;
}
});
return { labels, counts };
}
...
countCommentsByHour = { ... }
update = () => {
fetch('/api/v1/landing')
.then(response => response.json())
.then(data => {
let { labels, counts } = countCommentsByHour(data)
// Reset data
window.myPie.data.labels = [];
window.myPie.data.datasets[0].data = [];
// New data
window.myPie.data.labels = [...labels]
window.myPie.data.datasets[0].data = [...counts]
window.myPie.update();
})
.catch(error => console.error('Error:', error));
}
update();
(STOP 5) Revise los cambios:
En la línea de comandos
pip freeze > requirements.txt
deactivate
Versione local y remotamente.
Rendering on the Web – The SEO Version: Pros and Cons from Server Side to Full Client Side Rendering by @jbobbink https://t.co/IioPUtth8Y pic.twitter.com/VzZrRGVOOo
— Aleyda Solis 🕊️ (@aleyda) February 10, 2019
SSR, endpoint, etiquetas integradas