-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathIT-ST.tex
1064 lines (828 loc) · 55.5 KB
/
IT-ST.tex
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
%%
%% $Revision: $"
%%
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage{geometry}
\usepackage{hyperref}
\usepackage{url}
\hypersetup{
colorlinks=true,
linkcolor=blue,
filecolor=magenta,
urlcolor=cyan,
}
\title{Servicios Telemáticos \\
Grado en Ingeniería Telemática \\
Guía de Estudio, curso 2024/2025}
\author{Jesús M. González Barahona, Gregorio Robles Martínez, \\
David Moreno Lumbreras \\
GSyC, Universidad Rey Juan Carlos}
%\date{}
% Para que el margen derecho no se desborde
\sloppy
\begin{document}
\maketitle
\tableofcontents
\newpage
%%--------------------------------------------------------------------------
%%--------------------------------------------------------------------------
%%--------------------------------------------------------------------------
\section{Datos generales}
\begin{tabular}{ll}
\textbf{Título:} & Servicios Telemáticos \\
\textbf{Titulación:} & Grado en Ingeniería en Tecnologías de Telecomunicación \\
\textbf{Cuatrimestre:} & Tercer curso, segundo cuatrimestre \\
\textbf{Créditos:} & 6 (3 teóricos, 3 prácticos) \\
\textbf{Horas lectivas:} & 4 horas semanales \\
\textbf{Horario:} & lunes, 11:00--13:00 \\
& jueves, 11:00--13:00 \\
\textbf{Profesores:}
& Alberto Rafael Rodríguez Iglesias \\
& \hspace{1cm}alberto.rodriguezi @ urjc.es \\
& David Moreno Lumbreras \\
& \hspace{1cm}david.morenolu @ urjc.es \\
& \hspace{1cm}Despacho 110, Departamental III\\
& Sergio Montes\\
& \hspace{1cm}sergio.montes @ urjc.es \\
& \hspace{1cm}Despacho 103, Biblioteca\\
\textbf{Sedes telemáticas:} & \url{https://aulavirtual.urjc.es} \\
& \url{https://cursosweb.github.io} \\
& \url{https://gitlab.etsit.urjc.es/cursosweb} \\
\textbf{Aulas:} & Laboratorio 3206, Edif. Laboratorios III (lunes y jueves) \\
\end{tabular}
\newpage
%%-------------------------------------------------------------------------
%%-------------------------------------------------------------------------
%%-------------------------------------------------------------------------
\section{Objetivos}
En esta asignatura se pretende que el alumno obtenga conocimientos detallados sobre los servicios y aplicaciones comunes en las redes de ordenadores, y en particular en Internet. Se pretende especialmente que conozcan las tecnologías básicas que los hacen posibles.
\section{Metodología}
La asignatura tiene un enfoque eminentemente práctico. Por ello se realizará en la medido de lo posible en el laboratorio, y las prácticas realizadas (incluyendo especialmente el proyecto final) tendrán gran importancia en la evaluación de la asignatura. Los conocimientos teóricos necesarios se intercalarán con los prácticos, en gran media mediante metodologías apoyadas en la resolución de problemas. En las clases teóricas se utilizan, en algunos casos, transparencias que sirven de guión. En todos los casos se recomendarán referencias (usualmente documentos disponibles en Internet) para profundizar conocimientos, y complementarias de los detalles necesarios para la resolución de los problemas prácticos. En el desarrollo diario, las sesiones docentes incluirán habitualmente tanto aspectos teóricos como prácticos.
Se usa un sistema de apoyo telemático a la docencia (aula virtual de la URJC) para realizar actividades complementarias a las presenciales, y para organizar parte de la documentación ofrecida a los alumnos. La mayoría de los contenidos utilizados en la asignatura están disponibles o enlazados desde el sitio web CursosWeb. Asimismo, se utiliza el servicio GitLab de la ETSIT como repositorio, tanto de los materiales de la asignatura, como para entregar las prácticas por parte de los alumnos.
\newpage
%%--------------------------------------------------------------------------
%%--------------------------------------------------------------------------
%%--------------------------------------------------------------------------
\section{Evaluación}
% \subsection{Cambios excepcionales para el curso 2019-2020}
% Debido a las circunstancias excepcionales de este curso académico, hemos tenido que realizar algunos cambios a los criterios de evaluación. Estos cambios suponen sólo un cambio en cuanto a cómo se realizarán alguna de las actividades evaluables, y en cuanto a sus condiciones y plazos de entrega. No suponen en general un cambio en los criterios de evaluación, salvo que se tratará de tener una visión más global de la evaluación de la asignatura, sabiendo que los alumnos se han podido tener que enfrentar a situaciones excepcionales, y que se hará un esfuerzo por asegurar que el alumno ha conseguido los objetivos personales de conocimiento y habilidad que se esperan en esta asignatura.
% Los cambios son los siguientes:
% \begin{itemize}
% \item Se tendrán en cuenta las microprácticas diarias y las miniprácticas preparatorias aunque se hayan entregado con posterioridad a la fecha indicada. No se tendrán en cuenta exactamente igual que si se hubieran entregado en plazo, sino (aproximadamente) con un 75\% de valoración. Aún así se podrán conseguir notas cercanas a los dos puntos (que es máximo para el total de estas prácticas) en casos en que estén realizadas especialmente bien, o se hayan entregado prácticamente todas y bien realizadas.
% \item En lugar de la prueba de teoría se propondrán unas preguntas para evaluar el contenido más teórico, en relación a el proyecto final de cada alumno. Estas preguntas cubrirán conocimientos y habilidades similares a los evaluados normalmente con la prueba de teoría. Las preguntas se entregarán, vía indicaciones en el campus virtual, el miércoles 10 de junio, y tendrán una fecha límite de entrega de viernes 12 de junio (detalles en las condiciones de entrega de la practica final).
% \item Se realizará una entrevista personal, vía videoconferencia, o si eso no fuera posible por otros medios, con el mayor número posible de alumnos. Estas entrevistas tendrán lugar en las fechas que se indica en el enunciado de el proyecto final. El objetivo de esta entrevista es evaluar que el alumno puede explicar, en el contexto de los conocimientos y habilidades necesarios para aprobar esta asignatura, lo que ha realizado tanto en el proyecto final como en su respuesta a las preguntas que se usan este curso para evaluar el contenido más teórico. el resultado de esta entrevista puede tener un gran impacto en la calificación final, por la vía de aclarar o invalidar las respuestas, o el proyecto final entregada. Es fundamental que el alumno pueda explicar y razonar cualquier aspecto de ambas, y hacerlo en el contexto de los conocimientos y habilidades de la asignatura.
% \end{itemize}
% Estos cambios se aplicarán tanto para la convocatoria ordinaria como para la extraordinaria. Para la práctica extraordinaria se publicarán nuevas fechas de entrega y entrevistas, y el enunciado de el proyecto final (que será similar, pero no igual, a la propuesta para la convocatoria ordinaria).
\subsection{Criterios de evaluación}
Parámetros generales:
\begin{itemize}
\item Teoría (obligatorio): 0 a 4.
\item Microprácticas diarias: 0 a 1
\item Miniprácticas preparatorias: 0 a 1
\item Proyecto final (obligatorio): 0 a 2.
\item Opciones y mejoras del proyecto final: 0 a 3
\item Nota final: Suma de notas, moderada por la interpretación del profesor
\item Mínimo para aprobar:
\begin{itemize}
\item aprobado en teoría (2) y proyecto final (1)
\item 5 puntos de nota final
\end{itemize}
\end{itemize}
Evaluación teoría: prueba escrita
Evaluación microprácticas diarias (evaluación continua):
\begin{itemize}
\item entre 0 y 1
\item preguntas y ejercicios en foro y entragados en GitLab
\item es muy recomendable hacerlas
\end{itemize}
Evaluación proyecto final:
\begin{itemize}
\item posibilidad de examen presencial para proyecto final
\item tiene que funcionar en el laboratorio
\item enunciado mínimo obligatorio supone 1, se llega a 2 sólo con calidad y cuidado en los detalles
\item realización individual de la práctica
\end{itemize}
Opciones y mejoras proyecto final:
\begin{itemize}
\item permiten subir la nota mucho
\end{itemize}
Evaluación extraordinaria:
\begin{itemize}
\item prueba escrita (si no se aprobó la ordinaria)
\item nuevo proyecto final (si no se aprobó la ordinaria)
\item entrega de ejercicios de evaluación continua (con penalización)
\end{itemize}
\newpage
%%--------------------------------------------------------------------------
%%--------------------------------------------------------------------------
%%--------------------------------------------------------------------------
\section{Calendario}
\newcommand{\lunesA}{27 de enero}
\newcommand{\lunesB}{3 de febrero}
\newcommand{\lunesC}{10 de febrero}
\newcommand{\lunesD}{17 de febrero}
\newcommand{\lunesE}{24 de febrero}
\newcommand{\lunesF}{3 de marzo}
\newcommand{\lunesG}{10 de marzo}
\newcommand{\lunesH}{17 de marzo}
\newcommand{\lunesI}{24 de marzo}
\newcommand{\lunesJ}{31 de marzo}
\newcommand{\lunesK}{7 de abril}
\newcommand{\lunesL}{28 de abril}
\newcommand{\lunesM}{5 de mayo}
%\newcommand{\lunesL}{9 de mayo}
%\newcommand{\lunesX}{XXX}
\newcommand{\juevesAa}{23 de enero}
\newcommand{\juevesA}{30 de enero}
\newcommand{\juevesB}{6 de febrero}
\newcommand{\juevesC}{13 de febrero}
\newcommand{\juevesD}{20 de febrero}
\newcommand{\juevesE}{27 de febrero}
\newcommand{\juevesF}{6 de marzo}
\newcommand{\juevesG}{13 de marzo}
\newcommand{\juevesH}{20 de marzo}
\newcommand{\juevesI}{27 de marzo}
\newcommand{\juevesJ}{3 de abril}
\newcommand{\juevesK}{10 de abril}
\newcommand{\juevesL}{24 de abril}
\newcommand{\juevesM}{8 de mayo}
%\newcommand{\juevesX}{XXX}
\begin{tabular}{|l|l|}
\hline
Lunes & Jueves \\ \hline \hline
& \nameref{cal:juevesAa} \\ \hline
\nameref{cal:lunesA} & \nameref{cal:juevesA} \\ \hline
\nameref{cal:lunesB} & \nameref{cal:juevesB} \\ \hline
\nameref{cal:lunesC} & \nameref{cal:juevesC} \\ \hline
\nameref{cal:lunesD} & \nameref{cal:juevesD} \\ \hline
\nameref{cal:lunesE} & \nameref{cal:juevesE} \\ \hline
\nameref{cal:lunesF} & \nameref{cal:juevesF} \\ \hline
\nameref{cal:lunesG} & \nameref{cal:juevesG} \\ \hline
\nameref{cal:lunesH} & \nameref{cal:juevesH} \\ \hline
\nameref{cal:lunesI} & \nameref{cal:juevesI} \\ \hline
\nameref{cal:lunesJ} & \nameref{cal:juevesJ} \\ \hline
\nameref{cal:lunesK} & \nameref{cal:juevesK} \\ \hline
Festivo & Festivo \\ \hline
Festivo & \nameref{cal:juevesL} \\ \hline
\nameref{cal:lunesL} & Festivo \\ \hline
\nameref{cal:lunesM} & \nameref{cal:juevesM} \\ \hline
\end{tabular}
\newpage
%%--------------------------------------------------------------------------
%%--------------------------------------------------------------------------
%%--------------------------------------------------------------------------
\section{Programa de teoría}
Programa de la asignatura (el detalle evoluciona según avanza el curso).
%%--------------------------------------------------------------------------
%%--------------------------------------------------------------------------
\subsection{00 - Presentación}
%%-----------------------------------------------------------------------
\subsubsection{\juevesAa: Presentación (2 horas)}
\label{cal:juevesAa}
\begin{itemize}
\item \textbf{Presentación:} Presentación de la temática de la asignatura
\item \textbf{Presentación:} Qué son las aplicaciones web del lado del servidor (``back-end'') y del lado del cliente (``front-end''), y cómo se relacionan.
\item \textbf{Presentación:} Detalles de la asignatura: teoría y prácticas, estructura de las clases, evaluación, etc.
\item \textbf{Presentación:} Materiales de la asignatura: sitios web y documentos fundamentales que tenéis a vuestra disposición.
\item \textbf{Material:} Transparencias, tema ``Presentación''.
\item \textbf{Ejercicio propuesto (voluntario, entrega en el foro):} ``Web 2.0'' (ejercicio~\ref{subsec:web-20}) \\
Entrega recomendada: antes del \juevesB.
\end{itemize}
%%----------------------------------------------------------------------
\subsection{01 - Conceptos básicos de aplicaciones web}
Sesión, mantenimiento de estado, persistencia.
%%------------------------------------------------------------------------
\subsubsection{\lunesA: Conceptos básicos I (2 horas)}
\label{cal:lunesA}
Páginas dinámicas (diferentes según cómo y cuándo se invocan). Cómo realizar sesiones en HTTP. Profundización en el concepto de sesión, y técnicas para conseguirla, incluyendo cookies y otros mecanismos.
\begin{itemize}
\item \textbf{Ejercicio (presentación en clase):} ``Espía a tu navegador (Firefox Developer Tools)'' (ejercicio~\ref{subsec:firefox-devel}) \\
Centrado en las pestañas de ``Red'' e ``Inspección''.
\item \textbf{Ejercicio propuesto (entrega en el foro):} ``Explora tus cookies'' (ejercicio~\ref{subsec:explora-cookies}) \\
Entrega recomendada: antes del \lunesB.
\end{itemize}
%%----------------------------------------------------------------
\subsubsection{\lunesB: Conceptos básicos II (2 horas)}
\label{cal:lunesB}
\begin{itemize}
\item \textbf{Frikiminutos}: ``De rebajas'' (Markdown).
\item Resolución de ejericios pendientes.
\item \textbf{Ejercicio (discusión en clase):} ``Explora tus cookies'' (ejercicio~\ref{subsec:explora-cookies}).
Explicación de cookies en interacciones HTTP y almacenadas, vistas en el depurador del navegador.
\item \textbf{Presentación:} Cookies
\item \textbf{Material:} Transparencias, tema ``Cookies''
\item \textbf{Ejercicio (entrega en el foro):} ``Última búsqueda'' (ejercicio~\ref{subsec:ultima-busqueda}) \\
Entrega recomendada: antes del \lunesC. \\
\end{itemize}
%%----------------------------------------------------------------
\subsubsection{\lunesC: Conceptos básicos III (2 horas)}
\label{cal:lunesC}
\begin{itemize}
\item \textbf{Frikiminutos}: ``Pregunta, que te responderán'' (Stackoverflow).
\item \textbf{Ejercicio (discusión en clase):} ``Última búsqueda'' (ejercicio~\ref{subsec:ultima-busqueda}) \\
Se introducen las dos solucines típicas: cookie con la pregunta, y cookie con un identificador más tabla en el servidor.
Discusión sobre el uso de cookies (u otros mecanismos) para conseguir la funcionalidad requerida. Se discute también el almacenamiento en el lado del servidor y en el lado del cliente. Relación entre peticiones HTTP. Cookies como herramienta para ambas situaciones. Analogía con la agencia de viajes física. Cómo tienen que ser las cookies de identificación para que no sean fácilmente ``adivinables''.
\item \textbf{Discusión:} Usos de las cookies. \\
Uso de las cookies para identificación de visitantes (como en el ejercicio~\ref{subsec:ultima-busqueda}), para autenticación (interacción de autenticación y cookie de sesión posterior), para almacenamiento (como en el ejercicio~\ref{subsec:ultima-busqueda}, con última búsqueda en la cookie). Implicaciones de trasladar una cookie de identificación o de sesión de un ordenador a otro. Implicaciones de almacenar datos en el lado del navegador.
\item \textbf{Ejercicio propuesto (entrega en el foro):} ``Explora tus cookies (2)'' (ejercicio~\ref{subsec:explora-cookies-2}) \\
Entrega recomendada: antes del \lunesD.
\end{itemize}
%%----------------------------------------------------------------
\subsubsection{\lunesD: Conceptos básicos IV (2 horas)}
\label{cal:lunesD}
\begin{itemize}
\item \textbf{Frikiminutos}: ``Lo importante es participar'' (Google Summer of Code).
\item \textbf{Ejercicio (discusión en clase):} ``Explora tus cookies (2)'' (ejercicio~\ref{subsec:explora-cookies-2}).
\item \textbf{Discusión:} Datos persistentes entre operaciones HTTP diferentes. Concepto de estado persistente frente a caídas del servidor.
\item \textbf{Ejercicio propuesto:} ``Contador simple'' (ejercicio~\ref{subsec:contador-simple})
\item \textbf{Discusión:} Introducción al problema de los rearranques.
\item \textbf{Discusión:} Medición de audiencias y visitas únicas por un sitio web.
\item \textbf{Ejercicio propouesto (entrega en el foro):} ``Traza de historiales de navegación por terceras partes'' (ejercicio~\ref{subsec:navegacion-terceras-partes}) \\
Entrega recomendada: antes del \lunesE.
\item \textbf{Ejercicio propuesto:} ``cURL básico'' (ejercicio~\ref{subsec:curl-basico})
%\item \textbf{Ejercicio propuesto:} ``Transplante de cookies 2'' (ejercicio~\ref{subsec:transplante-cookies2})
\end{itemize}
%%----------------------------------------------------------------
\subsubsection{\lunesE: Conceptos básicos V (2 horas)}
\label{cal:lunesE}
\begin{itemize}
\item \textbf{Frikiminutos}: ``¿Qué datos tuyos tienen?''
\item \textbf{Discusión de ejercicio:} ``Traza de historiales de navegación por terceras partes'' (ejercicio~\ref{subsec:navegacion-terceras-partes})
\item \textbf{Discusión:} Relación de traza de historias de navegación con identidades personales.
\item \textbf{Discusión de ejercicio:} ``cURL básico'' (ejercicio~\ref{subsec:curl-basico})
\item \textbf{Ejercicio (demo):} ``Protección contra trackers en el navegador'' (ejercicio~\ref{subsec:trackers-navegador}).
%\item \textbf{Ejercicio (demo):} ``Trackers en páginas web'' (ejercicio~\ref{subsec:trackers-paginas-web})
\item \textbf{Discusión de ejercicio:} ``Distinto contenido según navegador'' (ejercicio~\ref{subsec:contador-simple-navegador}).
\item \textbf{Discusión de ejercicio:} ``Transplante de cookies'' (ejercicio~\ref{subsec:transplante-cookies})
\item \textbf{Ejercicio (discusión en clase):} ``Contador simple con varios
navegadores intercalados'' (ejercicio~\ref{subsec:contador-simple-varios-intercalados})
\item \textbf{Ejercicio (entrega en el foro):} ``Contador simple con rearranques'' (ejercicio~\ref{subsec:contador-simple-rearranques}).\\
Entrega recomendada: antes del \lunesF.
\end{itemize}
%%----------------------------------------------------------------
%%----------------------------------------------------------------
\subsection{02 - Servicios web que interoperan}
Invocaciones a aplicaciones web desde aplicaciones web. Servicios web como un conjunto de aplicaciones que interoperan.
%%----------------------------------------------------------------
\subsubsection{\lunesF: Interoperación web I (2 horas)}
\label{cal:lunesF}
\begin{itemize}
\item Introducción al diseño de APIs HTTP
\item \textbf{Ejercicio (discusión en clase)}: ``Lista de la compra'' (ejercicio~\ref{subsec:lista-compra}). \\
Trabajo en grupos y discusión de los detalles del ejercicio.
\item \textbf{Presentación:} Arquitectura REST (1)
\item \textbf{Material:} Transparencias, tema ``REST''
%\item \textbf{Discusión de ejercicio:} ``Cache de contenidos'' (ejercicio~\ref{subsec:cache-contenidos}). \\
% Trabajo en grupos y discusión de los detalles del ejercicio.
% Repo GitLab: \url{https://gitlab.etsit.urjc.es/CursosWeb/X-Serv-App-Cache}
\end{itemize}
%%----------------------------------------------------------------
\subsubsection{\lunesG: Interoperación web II (2 horas)}
\label{cal:lunesG}
\begin{itemize}
\item \textbf{Presentación:} Arquitectura REST (2)
\item \textbf{Material:} Transparencias, tema ``REST''
\item \textbf{Discusión:} Introducción a las operaciones idempotentes.
\item \textbf{Ejercicio (discusión en clase):} ``Listado de lo que tengo en la nevera'' (ejercicio~\ref{subsec:contenido-nevera}).
\item \textbf{Ejercicio (entrega en el foro):} ``Listado de lo que tengo en la nevera'' (ejercicio~\ref{subsec:contenido-nevera}) \\
Entrega recomendada: \lunesH
\end{itemize}
%% \item \textbf{Ejercicio (discusión en clase, entrega en el foro):} ``Calculadora simple versión REST'' (ejercicio~\ref{subsec:calc-simple-rest}). \\
%% Entrega recomendada: antes del 16 de marzo. \\
%% Repo GitLab: \url{https://github.com/CursosWeb/X-Serv-App-Calculadora-REST}
%%\item \textbf{Ejercicio (discusión en clase, entrega en GitLab):} ``Aplicación redirectora'' (ejercicio~\ref{subsec:aplweb-redirectora}). \\
%% Entrega recomendada: antes del 9 de marzo. \\
%% Repo GitLab: \url{https://github.com/CursosWeb/X-Serv-App-Redirectora}
%% \item \textbf{Ejercicio (entrega en el foro):} ``Cache de contenidos anotado'' (ejercicio~\ref{subsec:cache-contenidos-anotado}) \\
%% Entrega recomendada: antes del 23 de marzo. \\
%% Repo GitLab: \url{https://github.com/CursosWeb/X-Serv-App-Cache-Anotada}
%% \item \textbf{Ejercicio (discusión en clase, entrega en el foro):} ``Sistema de transferencias bancarias'' (ejercicio~\ref{subsec:transferencias-bancarias}). \\
%% Entrega recomendada: antes del 12 de marzo.
%% \item \textbf{Ejercicio (entrega en el foro):} ``Sistema REST para calcular Pi'' (ejercicio~\ref{subsec:rest-pi}) \\
%% Entrega recomendada: antes del 12 de marzo.
%% \item \textbf{Ejercicio:} ``Arquitectura escalable'' (ejercicio~\ref{subsec:arq-escalable}).
%% \item \textbf{Ejercicio:} ``Gestor de contenidos multilingue preferencias del navegador'' (ejercicio~\ref{subsec:contentappmulti-navegador}).
%% \item \textbf{Ejercicio:} ``Gestor de contenidos multilingue con elección en la aplicación'' (ejercicio~\ref{subsec:contentappmulti-apli}).
%\end{itemize}
%%----------------------------------------------------------------
%%----------------------------------------------------------------
\subsection{03 - Modelo-vista-controlador}
Explicación del patrón de diseño ``modelo-vista-controlador''.
%%----------------------------------------------------------------
\subsubsection{\lunesH: MVC (2 horas)}
\label{cal:lunesH}
\begin{itemize}
\item \textbf{Presentación:} ``Tres implementaciones de una aplicación web simple: Counter''. Comparación de tres formas de implementar una aplicación web muy sencilla, identificando los componentes y estructuras que se repiten, con el objetivo de ver cómo cuando pasamos a Django seguimos construyendo el mismo tipo de apicaciones, aunque el marco de programación nos proporcione ya muchos elementos que no tenemos que construir.
\item \textbf{Código:}
\begin{itemize}
\item \verb|counter-server-1.py|, directorio \verb|Python-Web/counter|
\item \verb|counterapp.py|, directorio \verb|Python-Web/http-server-classes/counterapp.py|
\item Projecto Django \verb|django-counter|, directorio \verb|Python-Django|
\end{itemize}
%\item \textbf{Videos:} ``Implementación de aplicaciones web: Counter Server'', ``Implementación de aplicaciones web: Counter WebApp'', ``Implementación de aplicaciones web: Counter Django''.
\end{itemize}
%%----------------------------------------------------------------
\subsubsection{\lunesI: MVC II (2 horas)}
\label{cal:lunesI}
\begin{itemize}
\item \textbf{Presentación:} ``Modelo-vista-controlador''.
\item \textbf{Material:} Transparencias ``Modelo-vista-controlador''.
\item \textbf{Presentación:} ``Componentes de aplicaciones Django y MVC''.
Repaso de los componentes principales de una aplicación Django y su relación con el patrón modelo-vista-controlador.
\item \textbf{Ejercicio (discusión en clase y entrega voluntaria en el foro):} ``Red social muy simple'' (ejercicio~\ref{subsec:mvc-red-social}).
\item \textbf{Video:} ``Arquitectura Modelo-Vista-Controlador''
\end{itemize}
%%----------------------------------------------------------------
%%----------------------------------------------------------------
\subsection{04 - Introducción a XML y JSON}
Uso de XML en aplicaciones web.
%%----------------------------------------------------------------
\subsubsection{\lunesJ: XML, JSON I (2 horas)}
\label{cal:lunesJ}
\begin{itemize}
\item \textbf{Presentación:} ``XML: Conceptos fundamentales''. \\
Introducción a XML, sintaxis básica, equivalencia con el árbol XML correspondiente a un documento.
\item \textbf{Video:} ``XML: Conceptos fundamentales''.
\item \textbf{Presentación:} ``XML: Lenguajes de definición de vocabularios XML''. \\
Formas de especificar vocabularios XML, ejemplo de DTD simple.
\item \textbf{Video:} ``XML: Lenguajes de definición de vocabularios XML''.
\item \textbf{Presentación:} ``XML: Módulos habituales para trabajar con XML desde lenguajes de programación''. \\
Reconocedores SAX y DOM, y su uso en aplicaciones web.
\item \textbf{Video:} ``XML: Módulos habituales para trabajar con XML desde lenguajes de programación''.
\item \textbf{Presentación:} ``XML: Usos en aplicaciones web''. \\
Usos habituales de XML en aplicaciones web, incluyendo el DOM de los navegadores y los canales RSS.
\item \textbf{Video:} ``XML: Usos en aplicaciones web''.
\item \textbf{Material:} Transparencias ``Introducción a XML''.
\item \textbf{Ejercicio (discusión en clase):} ``Chistes XML'' (ejercicio~\ref{subsec:xml-chistes}).
\item \textbf{Ejercicio (discusión en clase):} ``Chistes XML (parser DOM)'' (ejercicio~\ref{subsec:xml-chistes-dom}).
\item \textbf{Ejercicio (discusión en clase):} ``Videos en canal de YouTube'' (ejercicio~\ref{subsec:xml-youtube}).
\item \textbf{Ejercicio (entrega en GitLab):} ``Videos en canal de YouTube (con descarga)'' (ejercicio~\ref{subsec:xml-youtube-descarga}) \\
Repositorio: \url{https://gitlab.etsit.urjc.es/cursosweb/practicas/server/youtube-descarga}
\end{itemize}
%%----------------------------------------------------------------
\subsubsection{\lunesK: XML, JSON II (2 horas)}
\label{cal:lunesK}
\begin{itemize}
\item \textbf{Presentación:} ``JSON (JavaScript Object Nottion)''. \\
JSON como formato de intercambio de datos en aplicaciones web.
\item \textbf{Video:}``JSON (JavaScript Object Nottion)''.
\item \textbf{Presentación:} ``XML y JSON: Ejemplos reales''. \\
Ejemplo de canal XML de YouTube y documento JSON de GitLab.
\item \textbf{Video:}``XML y JSON: Ejemplos reales''.
\item \textbf{Ejercicio (discusión en clase):} ``Forks de un repositorio GitLab''
(ejercicio~\ref{subsec:json-gitlab-forks})
\item \textbf{Ejercicio (discusión en clase):} ``Gestor de contenidos con videos de YouTube (simple)'' (ejercicio~\ref{subsec:django-cms-youtube})
\item \textbf{Ejercicio (entrega en GitLab):} ``Gestor de contenidos con videos de YouTube (2)'' (ejercicio~\ref{subsec:django-cms-youtube-2}) \\
Repositorio: \url{https://gitlab.etsit.urjc.es/cursosweb/practicas/server/django-youtube} \\
Entrega: \juevesM
\item \textbf{Ejercicio voluntario:} ``Municipios JSON via HTTP'' (ejercicio~\ref{subsec:json-municipios-http}).
%\item \textbf{Ejercicio (entrega en GitLab):} ``Gestor de contenidos con video de Youtube (tests) (ejercicio~\ref{subsec:django-cms-youtube-tests}) \\
% Repositorio: \url{https://gitlab.etsit.urjc.es/cursosweb/practicas/server/django-youtube-tests}
\end{itemize}
%%----------------------------------------------------------------
%\subsubsection{Sesión del ... (2 horas)}
%\item \textbf{Ejercicio (complementario):} ``Gestor de contenidos con titulares de BarraPunto versión SQL'' (ejercicio~\ref{subsec:contentapp-barrapunto-sql}).
%%----------------------------------------------------------------
%\subsubsection{Sesión del ... (2 horas)}
%
%\begin{itemize}
%\item \textbf{Presentación:} ``Introducción a XML''. \\
%Uso básico de HTML DOM desde JavaScript.
%\item \textbf{Material:} Transparencias ``Introducción a XML''.
%\item \textbf{Demo:} Manejo de HTML DOM con JavaScript.
%\item \textbf{Ejercicio (entrega en el foro):} ``Modificación del contenido de una página HTML'' (ejercicio~\ref{subsec:xml-modificacion-html}). \\
% Entrega recomendada: antes del 2 de mayo.
%
%\item \textbf{Material:} Fichero dom.html
%\end{itemize}
%
%
%%----------------------------------------------------------------
%%----------------------------------------------------------------
\subsection{05 - Hojas de estilo CSS}
Hojas de estilo CSS, separación entre contenido y presentación.
%%----------------------------------------------------------------
\subsubsection{\lunesL: CSS (2 horas)}
\label{cal:lunesL}
Hojas de estilo CSS, y su uso para manejar la apariencia de las páginas HTML.
\begin{itemize}
\item \textbf{Presentación:} ``Hojas de estilo CSS''. Introducción a CSS. Principales elementos.
\item \textbf{Material:} Transparencias, tema ``CSS''.
\item \textbf{Demo:} Inspección de datos de aspecto y hojas CSS con el depurador de Firefox.
\item \textbf{Ejercicio (discusión en clase):} ``Django cms\_css simple'' (ejercicio~\ref{subsec:django-cms-css}).
\item \textbf{Ejercicio (entrega en GitLab):} ``Django cms\_css elaborado'' (ejercicio~\ref{subsec:django-cms-css-2}). \\
Entrega recomendada: antes del 1 de mayo.
\end{itemize}
%% ----------------------------------------------------------------
%% ----------------------------------------------------------------
%% \subsection{06 - AJAX}
%% Introducción a Ajax, mashups y otros tipos de aplicaciones web con código en el lado del cliente.
%% ----------------------------------------------------------------
%% \subsubsection{Sesión del 3 de mayo (2 horas)}
%% \begin{itemize}
%% \item \textbf{Presentación:} Aplicaciones web con código en el lado del cliente. DHTML, SPA, AJAX
%% \item \textbf{Material:} Transparencias de la asignatura, tema ``AJAX''.
%% \item \textbf{Ejercicio (discusión en clase):} ``SPA Sentences generator'' (ejercicio~\ref{subsec:spa-sentences-generator})
%% \item \textbf{Ejercicio (discusión en clase):} ``AJAX Sentences generator'' (ejercicio~\ref{subsec:ajax-sentences-generator})
%% \end{itemize}
%%% %----------------------------------------------------------------
%\subsubsection{Sesión del ... (2 horas)}
%
%Ejercicios con gadgets y mashups.
%
%\begin{itemize}
% \item \textbf{Presentación:} Aplicaciones web con código en el lado del cliente. Web 2.0, mashups, etc.
% \item \textbf{Material:} Transparencias de la asignatura, tema ``Ajax''.
% \item \textbf{Ejercicio opcional:} Gadget de Google (ejercicio~\ref{subsec:gadget-google}).
%% \item \textbf{Ejercicio opcional:} EyeOS (ejercicio~\ref{subsec:eyeos}).
%\end{itemize}
%
%%% \subsubsection{Sesión del 21 de noviembre}
%
%%% Ejercicios con gadgets y mashups.
%
%%% \begin{itemize}
%%% \item \textbf{Ejercicio opcional:} Gadget de Google en Django cms (ejercicio~\ref{subsec:gadget-google-cms}).
%%% \item \textbf{Ejercicio:} EzWeb (ejercicio~\ref{subsec:ezweb}).
%%% \end{itemize}
%
\newpage
%%----------------------------------------------------------------------------
%%----------------------------------------------------------------------------
%%----------------------------------------------------------------------------
\section{Programa de prácticas}
Programa de las prácticas de la asignatura (tentativo).
%%----------------------------------------------------------------------------
%%----------------------------------------------------------------------------
\subsection{P1 - Introducción a Python}
Introducción al lenguaje de programación Python, que se utilizará para la realización de las prácticas de la asignatura.
%%----------------------------------------------------------------------------
\subsubsection{\juevesA: Python y entorno I (2 horas)}
\label{cal:juevesA}
\begin{itemize}
\item \textbf{Presentación:} ``Introducción a Python'' (breve introducción a los materiales recomendados).
\item \textbf{Material:} Transparencias ``Introducción a Python''
\item \textbf{Ejercicio (realizado en clase):} ``Uso interactivo del intérprete de Python'' (ejercicio~\ref{subsec:practicas-interprete})
\item \textbf{Presentación y demo:} PyCharm
\item \textbf{Presentación y demo:} El depurador de PyCharm
\item \textbf{Presentación y demo:} GitLab, y git creación de repositorios, clonado de repositorios.
\item \textbf{Ejercicio:} ``Asistente de IA generativa para PyCharm'' (ejercicio~\ref{subsec:practicas-pycharm-ia})
\item \textbf{Presentación:} Mecanismos de conexión remota al laboratorio: VNC desde el navegador, ssh, etc.
\item \textbf{Ejercicio propuesta (entrega en GitLab):} ``Subida de programa a repo de GitLab'' (ejercicio~\ref{subsec:practicas-programa-gitlab}) \\
Entrega recomendada: antes del \juevesB.
\end{itemize}
%%----------------------------------------------------------------------------
\subsubsection{\juevesB: Python y entorno II (2 horas)}
\label{cal:juevesB}
\begin{itemize}
\item \textbf{Frikiminutos:} ``Servidor web Python de una línea''
%\item \textbf{Presentación:} ``Introducción a Python'' (estructuras condicionales (if else), listas, bucles (for))
%\item \textbf{Material:} Transparencias ``Introducción a Python''
\item \textbf{Presentación:} ``Entornos virtuales en Python''
% \item \textbf{Material:} Ejercicio ``Ficheros y listas'' (ejercicio~\ref{subsec:ficheros-listas}).
% \item \textbf{Ejercicio:} ``Ficheros, diccionarios y excepciones''~\ref{subsec:ficheros-dic-excep}.
\item \textbf{Presentación:} ``El GitLab de la EIF''. Interacción básica vía web, creación de repositorios, ``fork'', clonado de repositorios. Acceso a repositorios en GitLab desde PyCharm.
\item \textbf{Recursos:} GitLab de la EIF, \url{gitlab.eif.urjc.es}
\item \textbf{Ejercicio propuesto (entrega en GitLab):} ``Calculadora'' (ejercicio~\ref{subsec:calculadora}). \\
Entrega recomendada: antes del \juevesC.
\end{itemize}
%%----------------------------------------------------------------------------
\subsubsection{\juevesC: Python y entorno III (2 horas)}
\label{cal:juevesC}
\begin{itemize}
\item \textbf{Frikiminutos:} ``Generador de QRs''
\item \textbf{Presentación:} ``Introducción a Python''. Clases y orientación a objetos en Python.
\item \textbf{Material:} Transparencias ``Introducción a Python''
\item \textbf{Presentación:} ``Git desde la línea de comandos''.
\item \textbf{Presentación (repaso):} Introducción a la entrega de prácticas en GitLab (seccion~\ref{sec:eje-entrega-practicas-incr}).
\item \textbf{Ejercicio propuesto (entrega en GitLAb):} ``Descarga de documentos web con módulos'' (ejercicio~\ref{subsec:eje-python-descarga-web-modulos}). \\
Entrega recomendada: antes de \juevesD.
\end{itemize}
%%----------------------------------------------------------------------------
%%----------------------------------------------------------------------------
\subsection{P2 - Aplicaciones web simples}
Construcción de aplicaciones web mínimas sobre la biblioteca Sockets de Python.
%%----------------------------------------------------------------------------
\subsubsection{\juevesD: Aplicaciones web (2 horas)}
\label{cal:juevesD}
\begin{itemize}
\item \textbf{Frikiminutos Python:} ``Servidor web simple python''.
\item \textbf{Ejercicio:} ``Aplicación web hola mundo'' (ejercicio~\ref{subsec:aplweb-hola-mundo}) \\
Se muestra la solución del ejercicio, y se comenta en clase. Se pide a los alumnos que lo ejecuten, lo modifiquen y se fijen en las cabeceras HTTP enviadas por el cliente y que el servidor muestra en pantalla (pero no hay entrega específica).
\item \textbf{Ejercicio:} ``Variaciones de la aplicación web hola mundo'' (ejercicio~\ref{subsec:aplweb-hola-mundo-var}).
\item \textbf{Explicación de ejercicio:} ``Aplicación web generadora de URLs aleatorias'' (ejercicio~\ref{subsec:aplweb-urls-aleatorias})
\item \textbf{Ejercicio propuesto (entrega en GitLab):} ``Aplicación redirectora'' (ejercicio~\ref{subsec:aplweb-redirectora})
Entrega recomendada: antes del \juevesE.
\end{itemize}
%%%----------------------------------------------------------------------------
\subsection{P3 - Servidores simples de contenidos}
Construcción de algunos servidores de contenidos que permitan comprender la estructura básica de una aplicación web, y de cómo implementarlos aprovechando algunas características de Python.
%%----------------------------------------------------------------------------
\subsubsection{\juevesE: Servidores con clase (2 horas)}
\label{cal:juevesE}
\begin{itemize}
\item \textbf{Frikiminutos Python:} ``Eliminación de fondo en fotos''.
\item \textbf{Comentario de ejercicio:} ``Aplicación web generadora de URLs aleatorias'' (ejercicio~\ref{subsec:aplweb-urls-aleatorias})
\item \textbf{Comentario de ejercicio:} ``Aplicación redirectora'' (ejercicio~\ref{subsec:aplweb-redirectora}).
\item \textbf{Comentario de ejercicio:} ``Sumador simple'' (ejercicio~\ref{subsec:sumador-simple})
\item \textbf{Trabajo y explicación del ejercicio:} ``Clase servidor de aplicaciones'' (ejercicio~\ref{subsec:clase-serv-aplis}) \\
Explicación de la estructura general que tienen las aplicaciones web, y fundamentos de cómo esta estructura se puede encapsular en una clase.
\item \textbf{Ejercicio propuesto (entrega en GitLab):} ``Clase contentApp'' (ejercicio~\ref{subsec:contentapp}) \\
Entrega recomendada: antes de \juevesF.
\end{itemize}
%%----------------------------------------------------------------------------
\subsubsection{\juevesF: Servidores con clase II (2 horas)}
\label{cal:juevesF}
\begin{itemize}
\item \textbf{Comentario de ejercicio:} ``Clase contentApp'' (ejercicio~\ref{subsec:contentapp})
\item \textbf{Realización de ejercicio:} ``Clase contentPutApp'' (ejercicio~\ref{subsec:contentputapp})
\item \textbf{Ejercicio recomendado (entrega voluntaria):} ``Clase contentPostApp'' (ejercicio~\ref{subsec:contentpostapp})
%\item \textbf{Ejercicio recomendado (sin entrega):} ``Clase servidor de aplicaciones, generador de URLs aleatorias'' (ejercicio~\ref{subsec:aplweb-clase-urls-aleatorias}).
\item \textbf{Presentación minipráctica (entrega en GitLab):} ``Minipráctica 1'' (ejercicio~\ref{subsec:minipractica-1-2022}). \\
Entrega recomendada: antes del \juevesH.
\end{itemize}
%%----------------------------------------------------------------------------
%\subsubsection{\martesF: Servidores simples I (2 horas)}
%\label{cal:martesF}
%\begin{itemize}
%\item \textbf{Ejercicio:} ``Clase servidor de aplicaciones, sumador'' (ejercicio~\ref{subsec:clase-sumador-simple}).
%\item \textbf{Ejercicio:} ``Clase servidor varias aplicaciones'' (ejercicio~\ref{subsec:clase-serv-aplis-multi}) \\
% Explicación de la estructura principal de una clase que gestiona varias aplicaciones (o varios recursos, cada uno manejado por una aplicación)
% \item \textbf{Ejercicio:} ``Clase servidor, cuatro aplis'' (ejercicio~\ref{subsec:clase-serv-aplis-varias}).
% \item \textbf{Ejercicio:} ``Clase contentApp'' (ejercicio~\ref{subsec:contentapp}) \\
% Explicación de la estructura principal de una aplicación que sirve contenidos previamente almacenados.
% \item \textbf{Ejercicio:} ``Instalación y prueba de Poster'' (ejercicio~\ref{subsec:inst-poster}).
% \item \textbf{Ejercicio:} ``Clase contentPostApp'' (ejercicio~\ref{subsec:contentpostapp}).
% \item \textbf{Ejercicio:} ``Clase contentPutApp'' (ejercicio~\ref{subsec:contentputapp}).
%Entrega en GitLab. Fecha de entrega: antes del 3 de marzo.
%\end{itemize}
%%%----------------------------------------------------------------------------
%\subsubsection{\martesG: Servidores simples II (2 horas)}
%\label{cal:martesG}
%\begin{itemize}
% \item \textbf{Discusión en clase:} ``Clase contentPutApp'' (ejercicio~\ref{subsec:contentputapp}).
% \item Presentación de la primera práctica de entrega voluntaria (\ref{subsec:practica-vol-1-2016}). Entrega en GitLab. Fecha de entrega: antes del 10 de marzo.
%\end{itemize}
%%%----------------------------------------------------------------------------
%%%----------------------------------------------------------------------------
\subsection{P4 - Introducción a Django}
%%%----------------------------------------------------------------------------
\subsubsection{\juevesG: Django I (2 horas)}
\label{cal:juevesG}
Introducción a la interacción dinámica desde el navegador usando HTMX.
\begin{itemize}
\item \textbf{Ejercicio:} ``Gestor de contenidos con HTMX'' (ejercicio~\ref{subsec:contentapp-htmx}).
\item \textbf{Ejercicio:} ``Gestor de contenidos con HTMX (actualización con POST)'' (ejercicio~\ref{subsec:contentapp-htmx-post}).
\end{itemize}
Presentación de Django como sistema de construcción de aplicaciones web.
\begin{itemize}
\item \textbf{Ejercicio:} ``Instalación de Django'' (ejercicio~\ref{subsec:django-install}).
\item \textbf{Ejercicio:} ``Django Intro'' (ejercicio~\ref{subsec:django-intro}).
\item \textbf{Presentación:} Introducción a Django (primera parte)
\item \textbf{Material:} Transparencias ``Introducción a Django''
\item \textbf{Ejercicio (discusión en clase:} ``Django Primera Aplicación'' (ejercicio~\ref{subsec:django-primera}).
\item \textbf{Material:} Guión \url{https://gsyc.urjc.es/grex/cursosweb/guion.html}
\item \textbf{Ejercicio (discusión en clase):} ``Django calc'' (ejercicio~\ref{subsec:django-calc}).
\end{itemize}
%%%----------------------------------------------------------------------------
\subsubsection{\juevesH: Django II (2 horas)}
\label{cal:juevesH}
Primeros ejercicios con base de datos.
Usuarios, administración y autenticación con Django.
\begin{itemize}
\item \textbf{Presentación:} Introducción a Django (segunda parte)
\item \textbf{Material:} Guión \url{https://gsyc.urjc.es/grex/cursosweb/guion2.html}
\item \textbf{Ejercicio (discusión en clase):} ``Django cms'' (ejercicio~\ref{subsec:django-cms}). \\
\item \textbf{Ejercicio (entrega en GitLab):} ``Django cms\_put'' (ejercicio~\ref{subsec:django-cms-put}). \\
\textbf{Cambios a realizar}: Cuando hago un put a un recurso que ya tengo en la base de datos, debe de actualizar el contenido exitente, no crear uno de nuevo (para evitar el MultipleObjectError del get(). En cambio, si no tengo ese recurso en la base de datos, me lo debo de crear y guardar. \\
Entrega recomendada: antes del \juevesI.
\end{itemize}
%%%----------------------------------------------------------------------------
\subsubsection{\juevesI: Django III (2 horas)}
\label{cal:juevesI}
\begin{itemize}
\item \textbf{Presentación:} Introducción a Django (tercera parte)
\item \textbf{Material:} Guión \url{https://gsyc.urjc.es/grex/cursosweb/guion3.html}
\item \textbf{Ejercicio (discusión en clase):} ``Django cms\_post'' (ejercicio~\ref{subsec:django-cms-put-post}). \\
\item \textbf{Ejercicio (discusión en clase):} ``Django cms\_templates'' (ejercicio~\ref{subsec:django-templates}).
\item \textbf{Ejercicio (discusión en clase):} ``Django cms\_post'' (ejercicio~\ref{subsec:django-post}) \\
\item Presentación de la \textbf{Práctica 2} (ejercicio~\ref{subsec:minipractica-2-2024}) \\
Entrega recomendada: antes del \juevesK.
\end{itemize}
%%%----------------------------------------------------------------------------
\subsubsection{\juevesJ: Django IV (2 horas)}
\label{cal:juevesJ}
\begin{itemize}
\item \textbf{Presentación:} Tests con Django y GitLab
\item \textbf{Ejercicio (discusión en clase):} ``Django tests'' (ejercicio~\ref{subsec:django-tests}).
\item \textbf{Ejercicio (discusión en clase y entrega en GitLab):} ``Django tests en GitLab'' (ejercicio~\ref{subsec:django-tests-gitlab}) \\
Entrega recomendada: antes del \juevesK
\item \textbf{Presentación:} Tests con Django y GitLab
\end{itemize}
%%%----------------------------------------------------------------------------
\subsubsection{\juevesK: Django V (2 horas)}
\label{cal:juevesK}
\begin{itemize}
\item \textbf{Presentación:} Introducción a Django (quinta parte)
\item \textbf{Material:} Guión \url{https://gsyc.urjc.es/grex/cursosweb/guion4.html}
\item \textbf{Material:} Transparencias ``Introducción a Django''
\item \textbf{Ejercicio (discusión en clase):} ``Django cms\_users'' (ejercicio~\ref{subsec:django-users}).
\item \textbf{Ejercicio (discusión en clase):} ``Django cms\_users\_put'' (ejercicio~\ref{subsec:django-users-put}). \\
Entrega recomendada: antes del \juevesL.
\end{itemize}
%%%----------------------------------------------------------------------------
\subsubsection{\juevesL: Django VI (2 horas)}
\label{cal:juevesL}
\begin{itemize}
% \item \textbf{Presentación:} Posibilidades de feedparser.py
% \item \textbf{Presentación:} Posibilidades de BeautifulSoup.py
\item \textbf{Material:} Guión \url{https://gsyc.urjc.es/grex/cursosweb/guion5.html}
\item \textbf{Material:} Transparencias ``Introducción a Django''
\item \textbf{Ejercicio (discusión en clase):} ``Django cms\_post'' (ejercicio~\ref{subsec:django-post}).
Entrega recomendada: antes del \juevesM.
% \item \textbf{Material:} Documentación de Django: ``Working with forms'' \\
% \url{http://docs.djangoproject.com/en/1.4/topics/forms}
% \item \textbf{Ejercicio voluntario:} ``Django feed\_expander'' (ejercicio~\ref{subsec:django-feed-expander}).
% \item \textbf{Presentación:} proyecto final (enunciado~\ref{practica-final-2019-05})
\item \textbf{Presentación:} Práctica final (apartado~\ref{practica-final-2024-05}). \\
Entrega recomendada: día del examen de la asignatura.
\end{itemize}
%%%----------------------------------------------------------------------------
\subsubsection{\juevesM: Django VII (2 horas)}
\label{cal:juevesM}
\begin{itemize}
\item \textbf{Presentación:} Introducción a Django (formularios)
\item \textbf{Ejercicio:} ``Django cms\_forms'' (ejercicio~\ref{subsec:django-forms}) \\
\item \textbf{Ejercicio:} ``Django cms\_bootstrap cuadrícula'' (ejercicio~\ref{subsec:django-cms-bootstrap-1})
\item \textbf{Ejercicio:} ``Django cms\_bootstrap componentes'' (ejercicio~\ref{subsec:django-cms-bootstrap-2})
\item \textbf{Ejercicio:} ``Django cms\_bootstrap componentes personalizados'' (ejercicio~\ref{subsec:django-cms-bootstrap-3})
\end{itemize}
% %%----------------------------------------------------------------------------
% \subsubsection{\juevesN: Detalles finales I (2 horas)}
% \label{cal:juevesN}
% \begin{itemize}
% % \item \textbf{Presentación:} Introducción a CSS
% % \item \textbf{Ejercicio:} ``Django cms\_css simple'' (ejercicio~\ref{subsec:django-cms-css}) \\
% \item \textbf{Ejercicio:} ``Django cms\_bootstrap cuadrícula'' (ejercicio~\ref{subsec:django-cms-bootstrap-1})
% \item \textbf{Presentación:} Práctica final (apartado~\ref{practica-final-2021-05})
% \end{itemize}
%%----------------------------------------------------------------
\subsubsection{\lunesM: Detalles finales II (2 horas)}
\label{cal:lunesM}
\begin{itemize}
\item \textbf{Ejercicio:} ``Django cms\_bootstrap componentes'' (ejercicio~\ref{subsec:django-cms-bootstrap-2})
\item \textbf{Ejercicio:} ``Django cms\_bootstrap componentes personalizados'' (ejercicio~\ref{subsec:django-cms-bootstrap-3})
\item \textbf{Ejercicio (discusión en clase):} ``Gestor de contenidos con videos de YouTube (despliegue)'' (ejercicio~\ref{subsec:django-cms-youtube-despliegue}).
\end{itemize}
% %%----------------------------------------------------------------------------
% \subsubsection{\lunesX: Detalles finales III (2 horas)}
% \label{cal:lunesO}
% \begin{itemize}
% \item \textbf{Ejercicio:} ``Extractor de información de un documento HTML'' (ejercicio~\ref{subsec:html-extractor})
% \item \textbf{Presentación:} CSS Garden \\
% \url{https://csszengarden.com}
% \item \textbf{Presentación:} Awesome Django \\
% \url{https://github.com/wsvincent/awesome-django#readme}
% \item \textbf{Presentación:} Otras formas de despliegue de la práctica final.
% \item \textbf{Preguntas y comentarios:} Práctica final.
% \end{itemize}
%%----------------------------------------------------------------------------
% \subsubsection{\lunesO: Detalles finales III (2 horas)}
% \label{cal:lunesO}
% \begin{itemize}
% \item \textbf{Ejercicio:} ``Extractor de información de un documento HTML'' (ejercicio~\ref{subsec:html-extractor})
% \item \textbf{Presentación:} CSS Garden \\
% \url{https://csszengarden.com}
% \item \textbf{Presentación:} Awesome Django \\
% \url{https://github.com/wsvincent/awesome-django#readme}
% \item \textbf{Presentación:} Otras formas de despliegue de la práctica final.
% \item \textbf{Preguntas y comentarios:} Práctica final.
% \end{itemize}
%%%----------------------------------------------------------------------------
% \subsubsection{\lunesN: Django (2 horas)}
% \label{cal:lunesN}
% \begin{itemize}
% \item \textbf{Presentación:} Introducción a Django (repaso general)
% \item \textbf{Ejercicio:} ``Django Conciertos'' (ejercicio~\ref{subsec:django-conciertos}) \\
% Entrega recomendada: antes del 5 de mayo.
% % \item \textbf{Presentación:} Introducción a Django (ejercicio final)
% \end{itemize}
%%----------------------------------------------------------------------------
%% \subsubsection{Sesión del XX de abril (2 horas)}
%% \begin{itemize}
%% \item Tutoría para el proyecto final. Esta clase se aprovechará para presentar o asentar, si fuera necesario, cuestiones relacionadas con el proyecto final.
%% \end{itemize}
%%----------------------------------------------------------------------------
%% \subsubsection{Sesión del XXX de abril (2 horas)}
%% \begin{itemize}
%% \item Tutoría para el proyecto final. Esta clase se aprovechará para presentar o asentar, si fuera necesario, cuestiones relacionadas con el proyecto final.
%% \end{itemize}
%%% %----------------------------------------------------------------------------
%\subsubsection{Sesión del ...}
%
%Prácticas con almacenamiento en base de datos
%
%\begin{itemize}
% \item \textbf{Ejercicio (entrega en foro):} ``Django feed\_expander\_db'' (ejercicio~\ref{subsec:django-feed-expander-db}).
%\end{itemize}
%
%%% %%----------------------------------------------------------------------------
%%% \subsubsection{Sesión del ... (unos minutos)}
%% \begin{itemize}
%% \item \textbf{Presentación de ejercicio:} Práctica 2 de entrega voluntaria (ejercicio~\ref{subsec:practica-vol-2-2012}) \\
%% Entrega recomendada: antes del 19 de noviembre de 2012.
%% \end{itemize}
%% %%----------------------------------------------------------------------------
%% \subsubsection{Sesión del ... (20 min.)}
%% \begin{itemize}
%% \item \textbf{Presentación:} Enunciado de la práctica 2 de entrega voluntaria (\ref{subsec:practica-vol-2-2011}),
%% \end{itemize}
%%----------------------------------------------------------------------------
%% \subsubsection{Sesión del ... (2 horas)}
%% Recopilación final
%% \begin{itemize}
%% \item \textbf{Explicación de ejercicio:} ``Django feed\_expander'' (ejercicio~\ref{subsec:django-feed-expander}). Incluye implementación de referencia.
%% \item \textbf{Explicación de ejercicio:} ``Django feed\_expander\_db'' (ejercicio~\ref{subsec:django-feed-expander-db}).
%% \item \textbf{Presentación:} Algunos aspectos relevantes de las proyecto final
%% \end{itemize}
%%----------------------------------------------------------------------------
%%----------------------------------------------------------------------------
%% \subsection{P4 - Servidores simples de contenidos}
%% Construcción de algunos servidores de contenidos que permitan comprender la estructura básica de una aplicación web, y de cómo implementarlos aprovechando algunas características de Python.
%% %%----------------------------------------------------------------------------
%% \subsubsection{Sesión del 26 de septiembre (1 hora)}
%% \begin{itemize}
%% \item \textbf{Ejercicio propuesto (entrega en foro):} ``Clase contentApp'' (ejercicio~\ref{subsec:contentapp}) \\
%% Explicación de la estructura principal de una aplicación que sirve contenidos previamente almacenados.
%% \end{itemize}
%% %%----------------------------------------------------------------------------
%% \subsubsection{Sesión del 13 de octubre}
%% \begin{itemize}
%% \item \textbf{Ejercicio:} ``Instalación y prueba de Poster'' (ejercicio~\ref{subsec:inst-poster}).
%% \item \textbf{Ejercicio propuesto (entrega en foro):} ``Clase contentPutApp'' (ejercicio~\ref{subsec:contentputapp}).
%% \item \textbf{Ejercicio propuesto (entrega en foro):} ``Clase contentPostApp'' (ejercicio~\ref{subsec:contentpostapp}).
%% \item \textbf{Presentación:} Enunciado de la práctica 1 de entrega voluntaria (\ref{subsec:practica-vol-1-2011}),
%% %% \item \textbf{Ejercicio propuesto (entrega en foro):} ``Clase contentPersistentApp'' (ejercicio~\ref{subsec:contentpersistentapp}).
%% \end{itemize}
%% \subsubsection{Sesión del 13 de octubre}
%% \begin{itemize}
%% \item \textbf{Ejercicio propuesto (entrega en foro):} Clase ``contentStorageApp'' (ejercicio~\ref{subsec:contentstorageapp}).
%% \item \textbf{Ejercicio propuesto (entrega en foro):} ``Gestor de contenidos con usuarios'' (ejercicio~\ref{subsec:contentappusers}). Sólo se plantea su entrega, se explicará en la próxima sesión.
%% \end{itemize}
%% \subsubsection{Sesión del 20 de octubre (1.5 horas)}
%% \begin{itemize}
%% \item \textbf{Explicación de ejercicio:} ``Gestor de contenidos con usuarios'' (ejercicio~\ref{subsec:contentappusers}).
%% \item \textbf{Ejercicio propuesto (entrega en foro):} ``Gestor de contenidos con usuarios, con control estricto de actualización'' (ejercicio~\ref{subsec:contentappusersstrict}).
%% \item \textbf{Presentación:} Bibliotecas Python potencialmente útlies.
%% Para las próximas sesiones, hasta que introduzcamos Django, quien quiera puede considerar usar los siguientes módulos, de la biblioteca estándar de Python
%% \begin{itemize}
%% \item BaseHTTPServer. Proporciona las clases básicas para construcción de servidores web. SimpleHTTPServer y CGIHTTPServer heredan de ellas. Probablmente no te interese tocar la clase BaseHTTPServer.HTTPServer, pero sí te venga bien hacer que BaseHTTPServer.BaseHTTPRequestHandler sea la raíz de tu jerarquía de clases, redefiniendo probablmente el método handle, y usando send\_error, send\_response, send\_header, etc.
%% \item SimpleHTTPServer. Proporciona un servidor HTTP que sirve ficheros. Probablmente incluye funcionalidad que no necesitas, pero tiene métodos do\_GET, do\_PUT que te podrían interesar.
%% \item CGIHTTPServer. Proporciona un servidor HTTP que entiende el protocolo CGI-BIN. Probablmente incluye demasiada funcionalidad que no necesitas.
%% \item Cookie. Gestión de cookies. Un poquito complicado de usar, pero puede serte muy útil.
%% \item mimetools. Te servirá para manejar las cabeceras de HTTP. Un poco complejo, pero también te puede ser muy útil.
%% \end{itemize}
%% \end{itemize}
%% %%----------------------------------------------------------------------------
%% %%----------------------------------------------------------------------------
%% \subsection{P4 - Aplicaciones web con base de datos}