@@ -35,8 +35,11 @@ | |||
\bibstyle{alpha} | |||
\citation{*} | |||
\bibdata{references/References_2} | |||
\bibcite{Verdam}{{Lei13}{}{{}}{{}}} | |||
\bibcite{Gaynor}{{Gay10}{}{{}}{{}}} | |||
\bibcite{Herzog}{{Her16}{}{{}}{{}}} | |||
\bibcite{King}{{Kin17}{}{{}}{{}}} | |||
\bibcite{Leipner}{{Lei13}{}{{}}{{}}} | |||
\bibcite{Ndukwe}{{Ndu17}{}{{}}{{}}} | |||
\bibcite{Shelest}{{She09}{}{{}}{{}}} | |||
\providecommand\NAT@force@numbers{}\NAT@force@numbers | |||
\@writefile{toc}{\contentsline {chapter}{Referenzen}{15}{chapter*.7}} | |||
\@writefile{toc}{\contentsline {chapter}{Referenzen}{17}{chapter*.9}} |
@@ -1,6 +1,27 @@ | |||
\begin{thebibliography}{Ndu17} | |||
\bibitem[Lei13]{Verdam} | |||
\bibitem[Gay10]{Gaynor} | |||
Alex Gaynor. | |||
\newblock Exploring django-taggit’s data model. | |||
\newblock 2010. | |||
\newblock https://django-taggit.readthedocs.io/en/latest/getting\_started. | |||
\bibitem[Her16]{Herzog} | |||
Stephan Herzog. | |||
\newblock Model view controller, model view presenter, and model view viewmodel | |||
design patterns. | |||
\newblock 2016. | |||
\newblock | |||
https://medium.com/sthzg/a-short-exploration-of-django-taggit-bb869ea5051f. | |||
\bibitem[Kin17]{King} | |||
Adam King. | |||
\newblock Django middlewares and the request/response cycle. | |||
\newblock 2017. | |||
\newblock | |||
https://medium.com/zeitcode/django-middlewares-and-the-request-response-cycle-fcbf8efb903f. | |||
\bibitem[Lei13]{Leipner} | |||
Ingo Leipner. | |||
\newblock Stress für beschäftigte: Wie kann man die e-mail-flut | |||
bekämpfen. |
@@ -11,48 +11,51 @@ A level-1 auxiliary file: chapters/ausblick.aux | |||
A level-1 auxiliary file: chapters/fazit.aux | |||
The style file: alpha.bst | |||
Database file #1: ../references/References_2.bib | |||
Warning--empty journal in Verdam | |||
Warning--empty journal in Gaynor | |||
Warning--empty journal in Herzog | |||
Warning--empty journal in King | |||
Warning--empty journal in Leipner | |||
Warning--empty journal in Ndukwe | |||
Warning--empty journal in Shelest | |||
You've used 3 entries, | |||
You've used 6 entries, | |||
2543 wiz_defined-function locations, | |||
584 strings with 5442 characters, | |||
and the built_in function-call counts, 841 in all, are: | |||
= -- 81 | |||
> -- 24 | |||
< -- 3 | |||
+ -- 6 | |||
- -- 6 | |||
* -- 41 | |||
:= -- 155 | |||
add.period$ -- 12 | |||
call.type$ -- 3 | |||
change.case$ -- 15 | |||
chr.to.int$ -- 3 | |||
cite$ -- 6 | |||
duplicate$ -- 42 | |||
empty$ -- 61 | |||
format.name$ -- 12 | |||
if$ -- 161 | |||
600 strings with 5832 characters, | |||
and the built_in function-call counts, 1654 in all, are: | |||
= -- 162 | |||
> -- 48 | |||
< -- 6 | |||
+ -- 12 | |||
- -- 12 | |||
* -- 80 | |||
:= -- 296 | |||
add.period$ -- 24 | |||
call.type$ -- 6 | |||
change.case$ -- 30 | |||
chr.to.int$ -- 6 | |||
cite$ -- 12 | |||
duplicate$ -- 84 | |||
empty$ -- 121 | |||
format.name$ -- 24 | |||
if$ -- 320 | |||
int.to.chr$ -- 1 | |||
int.to.str$ -- 0 | |||
missing$ -- 3 | |||
newline$ -- 21 | |||
num.names$ -- 9 | |||
pop$ -- 18 | |||
missing$ -- 6 | |||
newline$ -- 39 | |||
num.names$ -- 18 | |||
pop$ -- 36 | |||
preamble$ -- 1 | |||
purify$ -- 18 | |||
purify$ -- 36 | |||
quote$ -- 0 | |||
skip$ -- 33 | |||
skip$ -- 66 | |||
stack$ -- 0 | |||
substring$ -- 21 | |||
substring$ -- 42 | |||
swap$ -- 0 | |||
text.length$ -- 3 | |||
text.prefix$ -- 3 | |||
text.length$ -- 6 | |||
text.prefix$ -- 6 | |||
top$ -- 0 | |||
type$ -- 24 | |||
warning$ -- 3 | |||
while$ -- 6 | |||
width$ -- 5 | |||
write$ -- 41 | |||
(There were 3 warnings) | |||
type$ -- 48 | |||
warning$ -- 6 | |||
while$ -- 12 | |||
width$ -- 8 | |||
write$ -- 80 | |||
(There were 6 warnings) |
@@ -2,8 +2,10 @@ | |||
\babel@toc {german}{} | |||
\addvspace {10\p@ } | |||
\addvspace {10\p@ } | |||
\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP\relax }}{5}{figure.caption.5} | |||
\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP\relax }}{6}{figure.caption.5} | |||
\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks\relax }}{6}{figure.caption.6} | |||
\contentsline {figure}{\numberline {2.3}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{9}{figure.caption.7} | |||
\contentsline {figure}{\numberline {2.4}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{10}{figure.caption.8} | |||
\addvspace {10\p@ } | |||
\addvspace {10\p@ } | |||
\addvspace {10\p@ } |
@@ -1,4 +1,4 @@ | |||
This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex 2018.6.7) 4 OCT 2018 21:57 | |||
This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex 2018.6.7) 10 OCT 2018 10:48 | |||
entering extended mode | |||
\write18 enabled. | |||
file:line:error style messages enabled. | |||
@@ -17,8 +17,8 @@ Package hyphsubst Info: Redefined: \l@ngerman | |||
(hyphsubst) new value: 4 on input line 223. | |||
) (/usr/local/texlive/2018/texmf-dist/tex/latex/base/report.cls | |||
Document Class: report 2014/09/29 v1.4h Standard LaTeX document class | |||
(/usr/local/texlive/2018/texmf-dist/tex/latex/base/size11.clo | |||
File: size11.clo 2014/09/29 v1.4h Standard LaTeX file (size option) | |||
(/usr/local/texlive/2018/texmf-dist/tex/latex/base/size12.clo | |||
File: size12.clo 2014/09/29 v1.4h Standard LaTeX file (size option) | |||
) | |||
\c@part=\count80 | |||
\c@chapter=\count81 | |||
@@ -957,12 +957,12 @@ LaTeX Font Info: ... okay on input line 26. | |||
* \topmargin=-23.91173pt | |||
* \headheight=12.0pt | |||
* \headsep=25.0pt | |||
* \topskip=11.0pt | |||
* \topskip=12.0pt | |||
* \footskip=30.0pt | |||
* \marginparwidth=103.0pt | |||
* \marginparwidth=85.0pt | |||
* \marginparsep=10.0pt | |||
* \columnsep=10.0pt | |||
* \skip\footins=10.0pt plus 4.0pt minus 2.0pt | |||
* \skip\footins=10.8pt plus 4.0pt minus 2.0pt | |||
* \hoffset=0.0pt | |||
* \voffset=0.0pt | |||
* \mag=1000 | |||
@@ -1033,7 +1033,7 @@ Package babel Info: Redefining german shorthand "~ | |||
] | |||
Overfull \hbox (16.99998pt too wide) in paragraph at lines 48--57 | |||
Overfull \hbox (17.99998pt too wide) in paragraph at lines 48--57 | |||
[]| | |||
[] | |||
@@ -1194,31 +1194,31 @@ Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 5. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 5. | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 10. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 10. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 10. | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
) | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 57. | |||
@@ -1235,7 +1235,7 @@ Package babel Info: Redefining german shorthand "~ | |||
[3] | |||
Package Fancyhdr Warning: \headheight is too small (12.0pt): | |||
Make it at least 13.59999pt. | |||
Make it at least 14.49998pt. | |||
We now make it that large for the rest of the document. | |||
This may cause the page layout to be inconsistent, however. | |||
@@ -1263,105 +1263,146 @@ Package babel Info: Redefining german shorthand "| | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 1. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 5. | |||
(babel) in language on input line 7. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 5. | |||
(babel) in language on input line 7. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 5. | |||
(babel) in language on input line 7. | |||
File: figures/MVP.png Graphic file (type bmp) | |||
<figures/MVP.png> | |||
LaTeX Warning: `!h' float specifier changed to `!ht'. | |||
File: figures/request-response-cycle.png Graphic file (type bmp) | |||
<figures/request-response-cycle.png> | |||
LaTeX Warning: `!h' float specifier changed to `!ht'. | |||
LaTeX Font Info: Try loading font information for TS1+aer on input line 28. | |||
LaTeX Font Info: No file TS1aer.fd. on input line 28. | |||
LaTeX Font Warning: Font shape `TS1/aer/m/n' undefined | |||
(Font) using `TS1/cmr/m/n' instead | |||
(Font) for symbol `textbullet' on input line 28. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 16. | |||
(babel) in language on input line 30. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 16. | |||
(babel) in language on input line 30. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 16. | |||
(babel) in language on input line 30. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 16. | |||
(babel) in language on input line 30. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 16. | |||
(babel) in language on input line 30. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 16. | |||
(babel) in language on input line 30. | |||
[5 | |||
] | |||
File: figures/request-response-cycle.png Graphic file (type bmp) | |||
<figures/request-response-cycle.png> | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 24. | |||
(babel) in language on input line 35. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 24. | |||
(babel) in language on input line 35. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 24. | |||
(babel) in language on input line 35. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 30. | |||
(babel) in language on input line 35. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 30. | |||
(babel) in language on input line 35. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 30. | |||
(babel) in language on input line 35. | |||
[6] | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 30. | |||
(babel) in language on input line 38. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 30. | |||
(babel) in language on input line 38. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 30. | |||
[6] | |||
(babel) in language on input line 38. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 32. | |||
(babel) in language on input line 60. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 32. | |||
(babel) in language on input line 60. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 32. | |||
(babel) in language on input line 60. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 38. | |||
(babel) in language on input line 63. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 38. | |||
(babel) in language on input line 63. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 38. | |||
(babel) in language on input line 63. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 55. | |||
(babel) in language on input line 63. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 55. | |||
(babel) in language on input line 63. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 55. | |||
) | |||
(babel) in language on input line 63. | |||
[7] | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 58. | |||
(babel) in language on input line 70. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 58. | |||
(babel) in language on input line 70. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 58. | |||
(babel) in language on input line 70. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 58. | |||
(babel) in language on input line 89. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 58. | |||
(babel) in language on input line 89. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 58. | |||
[7] | |||
\openout2 = `chapters/prototyp.aux'. | |||
(./chapters/prototyp.tex | |||
(babel) in language on input line 89. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 1. | |||
(babel) in language on input line 89. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 1. | |||
(babel) in language on input line 89. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 1. | |||
(babel) in language on input line 89. | |||
[8] | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 1. | |||
(babel) in language on input line 93. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 1. | |||
(babel) in language on input line 93. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 1. | |||
[8 | |||
(babel) in language on input line 93. | |||
File: figures/bootstrap-head-tag.png Graphic file (type bmp) | |||
<figures/bootstrap-head-tag.png> | |||
File: figures/bootstrap-class-example.png Graphic file (type bmp) | |||
<figures/bootstrap-class-example.png> | |||
LaTeX Warning: `!h' float specifier changed to `!ht'. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 115. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 115. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 115. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 115. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 115. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 115. | |||
[9]) | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 58. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 58. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 58. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 58. | |||
Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 58. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 58. | |||
[10] | |||
\openout2 = `chapters/prototyp.aux'. | |||
] | |||
(./chapters/prototyp.tex | |||
Kapitel 3. | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 1. | |||
@@ -1424,7 +1465,12 @@ Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 59. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 59. | |||
[9] | |||
[11 | |||
] | |||
\openout2 = `chapters/ergebnis.aux'. | |||
(./chapters/ergebnis.tex | |||
@@ -1440,7 +1486,7 @@ Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 1. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 1. | |||
[10 | |||
[12 | |||
@@ -1476,7 +1522,7 @@ Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 60. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 60. | |||
[11] | |||
[13] | |||
\openout2 = `chapters/ausblick.aux'. | |||
(./chapters/ausblick.tex) | |||
@@ -1495,7 +1541,7 @@ Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 1. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 1. | |||
[12 | |||
[14 | |||
@@ -1523,7 +1569,7 @@ Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 62. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 62. | |||
[13] (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.bbl | |||
[15] (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.bbl | |||
Package babel Info: Redefining german shorthand "f | |||
(babel) in language on input line 1. | |||
Package babel Info: Redefining german shorthand "| | |||
@@ -1536,7 +1582,7 @@ Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 1. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 1. | |||
[14 | |||
[16 | |||
@@ -1547,28 +1593,34 @@ Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 1. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 1. | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ̈ in font aer10! | |||
Missing character: There is no ’ in font aer10! | |||
Missing character: There is no ’ in font aer12! | |||
Underfull \hbox (badness 10000) in paragraph at lines 12--18 | |||
\T1/aer/m/n/10.95 nnennandukwe-python-is-the-back-end-programming-language-of-the-future- | |||
Underfull \hbox (badness 1521) in paragraph at lines 18--23 | |||
[]\T1/aer/m/n/12 Adam King. Djan-go midd-le-wa-res and the re-quest/-re-spon-se cy-cle. | |||
[] | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ̈ in font aer12! | |||
Missing character: There is no ’ in font aer12! | |||
Underfull \hbox (badness 10000) in paragraph at lines 20--26 | |||
[]\T1/aer/m/n/10.95 Alexy She-lest. Mo-del view con-trol-ler, mo-del view pre- | |||
Underfull \hbox (badness 10000) in paragraph at lines 33--39 | |||
\T1/aer/m/n/12 medium-com-nnennandukwe-python-is-the-back-end-programming- | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 20--26 | |||
\T1/aer/m/n/10.95 sen-ter, and mo-del view view-mo-del de-sign pat-terns. 2009. | |||
Underfull \hbox (badness 10000) in paragraph at lines 41--47 | |||
[]\T1/aer/m/n/12 Alexy She-lest. Mo-del view con-trol-ler, mo-del view pre- | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 20--26 | |||
\T1/aer/m/n/10.95 https://www.codeproject.com/Articles/42830/Model-View-Controller-Model- | |||
Underfull \hbox (badness 10000) in paragraph at lines 41--47 | |||
\T1/aer/m/n/12 sen-ter, and mo-del view view-mo-del de-sign pat-terns. 2009. | |||
[] | |||
Underfull \hbox (badness 10000) in paragraph at lines 41--47 | |||
\T1/aer/m/n/12 https://www.codeproject.com/Articles/42830/Model-View-Controller- | |||
[] | |||
) | |||
@@ -1585,23 +1637,27 @@ Package babel Info: Redefining german shorthand "| | |||
(babel) in language on input line 77. | |||
Package babel Info: Redefining german shorthand "~ | |||
(babel) in language on input line 77. | |||
[15] | |||
[17] | |||
Package atveryend Info: Empty hook `AfterLastShipout' on input line 77. | |||
(/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.aux (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/titlepage/titlepage.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/abstract/abstract.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/einleitung.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/framework.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/prototyp.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/ergebnis.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/ausblick.aux) (/Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/fazit.aux)) | |||
Package atveryend Info: Empty hook `AtVeryEndDocument' on input line 77. | |||
Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 77. | |||
Package rerunfilecheck Info: File `bachelorabeit_EstherKleinhenz.out' has not changed. | |||
(rerunfilecheck) Checksum: 1C7F7EA8FD90A663BA0DCEA09291597A. | |||
LaTeX Font Warning: Some font shapes were not available, defaults substituted. | |||
Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 77. | |||
) | |||
(\end occurred when \ifnum on line 5 was incomplete) | |||
Here is how much of TeX's memory you used: | |||
26518 strings out of 492970 | |||
475681 string characters out of 6133939 | |||
546282 words of memory out of 5000000 | |||
30139 multiletter control sequences out of 15000+600000 | |||
553864 words of font info for 60 fonts, out of 8000000 for 9000 | |||
26546 strings out of 492970 | |||
476176 string characters out of 6133939 | |||
546355 words of memory out of 5000000 | |||
30162 multiletter control sequences out of 15000+600000 | |||
554220 words of font info for 61 fonts, out of 8000000 for 9000 | |||
1348 hyphenation exceptions out of 8191 | |||
58i,11n,50p,10437b,822s stack positions out of 5000i,500n,10000p,200000b,80000s | |||
58i,12n,50p,10437b,894s stack positions out of 5000i,500n,10000p,200000b,80000s | |||
Output written on /Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.pdf (21 pages). | |||
Output written on /Users/Esthi/thesis_ek/doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.pdf (23 pages). |
@@ -20,4 +20,4 @@ | |||
\BOOKMARK [0][-]{chapter.4}{Ergebnis}{}% 20 | |||
\BOOKMARK [1][-]{subsection.4.0.1}{Evaluierung}{chapter.4}% 21 | |||
\BOOKMARK [0][-]{chapter.5}{Zusammenfassung\040und\040Ausblick}{}% 22 | |||
\BOOKMARK [0][-]{chapter*.7}{Referenzen}{}% 23 | |||
\BOOKMARK [0][-]{chapter*.9}{Referenzen}{}% 23 |
@@ -4,22 +4,22 @@ | |||
\contentsline {chapter}{Abbildungsverzeichnis}{1}{chapter*.4} | |||
\contentsline {chapter}{\numberline {1}Einleitung}{3}{chapter.1} | |||
\contentsline {section}{\numberline {1.1}Ausgangssituation}{3}{section.1.1} | |||
\contentsline {section}{\numberline {1.2}Ziel der Arbeit}{3}{section.1.2} | |||
\contentsline {section}{\numberline {1.2}Ziel der Arbeit}{4}{section.1.2} | |||
\contentsline {chapter}{\numberline {2}Framework}{5}{chapter.2} | |||
\contentsline {section}{\numberline {2.1}Django}{5}{section.2.1} | |||
\contentsline {subsection}{\numberline {2.1.1}Besonderheiten}{6}{subsection.2.1.1} | |||
\contentsline {section}{\numberline {2.2}Erweiterungen}{7}{section.2.2} | |||
\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{7}{subsection.2.2.1} | |||
\contentsline {section}{\numberline {2.3}Bootstrap}{7}{section.2.3} | |||
\contentsline {chapter}{\numberline {3}Prototyp}{9}{chapter.3} | |||
\contentsline {section}{\numberline {3.1}Organisation}{9}{section.3.1} | |||
\contentsline {subsection}{\numberline {3.1.1}Verwaltung im Administrator-Backend}{9}{subsection.3.1.1} | |||
\contentsline {subsection}{\numberline {3.1.2}Berechtigung der User}{9}{subsection.3.1.2} | |||
\contentsline {section}{\numberline {3.2}Funktion}{9}{section.3.2} | |||
\contentsline {subsection}{\numberline {3.2.1}Abonnieren}{9}{subsection.3.2.1} | |||
\contentsline {subsection}{\numberline {3.2.2}Filtern}{9}{subsection.3.2.2} | |||
\contentsline {subsection}{\numberline {3.2.3}Benachrichtigung}{9}{subsection.3.2.3} | |||
\contentsline {chapter}{\numberline {4}Ergebnis}{11}{chapter.4} | |||
\contentsline {subsection}{\numberline {4.0.1}Evaluierung}{11}{subsection.4.0.1} | |||
\contentsline {chapter}{\numberline {5}Zusammenfassung und Ausblick}{13}{chapter.5} | |||
\contentsline {chapter}{Referenzen}{15}{chapter*.7} | |||
\contentsline {subsection}{\numberline {2.1.1}Besonderheiten}{7}{subsection.2.1.1} | |||
\contentsline {section}{\numberline {2.2}Erweiterungen}{8}{section.2.2} | |||
\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{8}{subsection.2.2.1} | |||
\contentsline {section}{\numberline {2.3}Bootstrap}{9}{section.2.3} | |||
\contentsline {chapter}{\numberline {3}Prototyp}{11}{chapter.3} | |||
\contentsline {section}{\numberline {3.1}Organisation}{11}{section.3.1} | |||
\contentsline {subsection}{\numberline {3.1.1}Verwaltung im Administrator-Backend}{11}{subsection.3.1.1} | |||
\contentsline {subsection}{\numberline {3.1.2}Berechtigung der User}{11}{subsection.3.1.2} | |||
\contentsline {section}{\numberline {3.2}Funktion}{11}{section.3.2} | |||
\contentsline {subsection}{\numberline {3.2.1}Abonnieren}{11}{subsection.3.2.1} | |||
\contentsline {subsection}{\numberline {3.2.2}Filtern}{11}{subsection.3.2.2} | |||
\contentsline {subsection}{\numberline {3.2.3}Benachrichtigung}{11}{subsection.3.2.3} | |||
\contentsline {chapter}{\numberline {4}Ergebnis}{13}{chapter.4} | |||
\contentsline {subsection}{\numberline {4.0.1}Evaluierung}{13}{subsection.4.0.1} | |||
\contentsline {chapter}{\numberline {5}Zusammenfassung und Ausblick}{15}{chapter.5} | |||
\contentsline {chapter}{Referenzen}{17}{chapter*.9} |
@@ -1,7 +1,7 @@ | |||
\relax | |||
\providecommand\hyper@newdestlabel[2]{} | |||
\@setckpt{chapters/ausblick}{ | |||
\setcounter{page}{12} | |||
\setcounter{page}{14} | |||
\setcounter{equation}{0} | |||
\setcounter{enumi}{0} | |||
\setcounter{enumii}{0} |
@@ -4,7 +4,7 @@ | |||
\@writefile{lof}{\addvspace {10\p@ }} | |||
\@writefile{lot}{\addvspace {10\p@ }} | |||
\@writefile{toc}{\contentsline {section}{\numberline {1.1}Ausgangssituation}{3}{section.1.1}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {1.2}Ziel der Arbeit}{3}{section.1.2}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {1.2}Ziel der Arbeit}{4}{section.1.2}} | |||
\@setckpt{chapters/einleitung}{ | |||
\setcounter{page}{5} | |||
\setcounter{equation}{0} |
@@ -1,12 +1,12 @@ | |||
\relax | |||
\providecommand\hyper@newdestlabel[2]{} | |||
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Ergebnis}{11}{chapter.4}} | |||
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Ergebnis}{13}{chapter.4}} | |||
\@writefile{lof}{\addvspace {10\p@ }} | |||
\@writefile{lot}{\addvspace {10\p@ }} | |||
\newlabel{ch:ergebnis}{{4}{11}{Ergebnis}{chapter.4}{}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {4.0.1}Evaluierung}{11}{subsection.4.0.1}} | |||
\newlabel{ch:ergebnis}{{4}{13}{Ergebnis}{chapter.4}{}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {4.0.1}Evaluierung}{13}{subsection.4.0.1}} | |||
\@setckpt{chapters/ergebnis}{ | |||
\setcounter{page}{12} | |||
\setcounter{page}{14} | |||
\setcounter{equation}{0} | |||
\setcounter{enumi}{0} | |||
\setcounter{enumii}{0} |
@@ -1,11 +1,11 @@ | |||
\relax | |||
\providecommand\hyper@newdestlabel[2]{} | |||
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Zusammenfassung und Ausblick}{13}{chapter.5}} | |||
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Zusammenfassung und Ausblick}{15}{chapter.5}} | |||
\@writefile{lof}{\addvspace {10\p@ }} | |||
\@writefile{lot}{\addvspace {10\p@ }} | |||
\newlabel{ch:zusammenfassung}{{5}{13}{Zusammenfassung und Ausblick}{chapter.5}{}} | |||
\newlabel{ch:zusammenfassung}{{5}{15}{Zusammenfassung und Ausblick}{chapter.5}{}} | |||
\@setckpt{chapters/fazit}{ | |||
\setcounter{page}{14} | |||
\setcounter{page}{16} | |||
\setcounter{equation}{0} | |||
\setcounter{enumi}{0} | |||
\setcounter{enumii}{0} |
@@ -5,14 +5,16 @@ | |||
\@writefile{lot}{\addvspace {10\p@ }} | |||
\newlabel{ch:framework}{{2}{5}{Framework}{chapter.2}{}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {2.1}Django}{5}{section.2.1}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP\relax }}{5}{figure.caption.5}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP\relax }}{6}{figure.caption.5}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks\relax }}{6}{figure.caption.6}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.1}Besonderheiten}{6}{subsection.2.1.1}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Erweiterungen}{7}{section.2.2}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{7}{subsection.2.2.1}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {2.3}Bootstrap}{7}{section.2.3}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.1}Besonderheiten}{7}{subsection.2.1.1}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Erweiterungen}{8}{section.2.2}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{8}{subsection.2.2.1}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {2.3}Bootstrap}{9}{section.2.3}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.3}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{9}{figure.caption.7}} | |||
\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{10}{figure.caption.8}} | |||
\@setckpt{chapters/framework}{ | |||
\setcounter{page}{8} | |||
\setcounter{page}{11} | |||
\setcounter{equation}{0} | |||
\setcounter{enumi}{0} | |||
\setcounter{enumii}{0} | |||
@@ -27,7 +29,7 @@ | |||
\setcounter{subsubsection}{0} | |||
\setcounter{paragraph}{0} | |||
\setcounter{subparagraph}{0} | |||
\setcounter{figure}{2} | |||
\setcounter{figure}{4} | |||
\setcounter{table}{0} | |||
\setcounter{float@type}{8} | |||
\setcounter{parentequation}{0} |
@@ -1,18 +1,18 @@ | |||
\relax | |||
\providecommand\hyper@newdestlabel[2]{} | |||
\@writefile{toc}{\contentsline {chapter}{\numberline {3}Prototyp}{9}{chapter.3}} | |||
\@writefile{toc}{\contentsline {chapter}{\numberline {3}Prototyp}{11}{chapter.3}} | |||
\@writefile{lof}{\addvspace {10\p@ }} | |||
\@writefile{lot}{\addvspace {10\p@ }} | |||
\newlabel{ch:prototyp}{{3}{9}{Prototyp}{chapter.3}{}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {3.1}Organisation}{9}{section.3.1}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.1}Verwaltung im Administrator-Backend}{9}{subsection.3.1.1}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.2}Berechtigung der User}{9}{subsection.3.1.2}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Funktion}{9}{section.3.2}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}Abonnieren}{9}{subsection.3.2.1}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}Filtern}{9}{subsection.3.2.2}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3}Benachrichtigung}{9}{subsection.3.2.3}} | |||
\newlabel{ch:prototyp}{{3}{11}{Prototyp}{chapter.3}{}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {3.1}Organisation}{11}{section.3.1}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.1}Verwaltung im Administrator-Backend}{11}{subsection.3.1.1}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.2}Berechtigung der User}{11}{subsection.3.1.2}} | |||
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Funktion}{11}{section.3.2}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}Abonnieren}{11}{subsection.3.2.1}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}Filtern}{11}{subsection.3.2.2}} | |||
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3}Benachrichtigung}{11}{subsection.3.2.3}} | |||
\@setckpt{chapters/prototyp}{ | |||
\setcounter{page}{10} | |||
\setcounter{page}{12} | |||
\setcounter{equation}{0} | |||
\setcounter{enumi}{0} | |||
\setcounter{enumii}{0} |
@@ -1,5 +1,5 @@ | |||
\RequirePackage[ngerman=ngerman-x-latest]{hyphsubst} | |||
\documentclass[11pt,a4paper,openright,twoside]{report} | |||
\documentclass[12pt,a4paper,openright,twoside]{report} | |||
%------------------------------------------------------------------------------ | |||
% preambule | |||
\include{preambule/thesis.preamble} |
@@ -2,6 +2,8 @@ | |||
\label{ch:framework} | |||
Um die Website-Erweiterung realisieren zu können, wird zunächst festgelegt welche Programmierschnittstellen verwendet werden. Im Web-Backend fällt die Wahl auf die objektorientierte Sprache Python, die ausschlie"slich Serverseitig anwendbar ist. Der Programmaufbau Pythons macht den Code leicht lesbar und der einfache Syntax ermöglicht einen strukturierte Implementierung der Website([Ndu17]). Ein entscheidender Vorteil hierbei ist das dazugehörige Framework Django, auf das im folgenden Kapitel genauer eingegangen wird. | |||
\section{Django} | |||
Django ist ein Web-Framework, das auf einer Model-View-Presenter (MVP) Architektur basiert. Ähnlich wie der Model-View-Controller sind die Interaktionen zwischen Model und View die Auswahl und Ausführung von Befehlen und das Auslösen von Ereignissen (vgl. Abbildung 2.1). Da die View aber hier bereits den Gro"steil des Controllers übernimmt, ist der MVP eine Überarbeitung. Der Teil, der Elemente des Modells auswählt, Operationen durchführt und alle Ereignisse kapselt, ergibt die Presenter-Klasse([She09]). Durch die direkte Bindung von Daten und View, geregelt durch den Presenter, wird die Codemenge der Applikation stark reduziert. | |||
@@ -12,21 +14,47 @@ Django ist ein Web-Framework, das auf einer Model-View-Presenter (MVP) Architekt | |||
\hfill | |||
\end{figure} | |||
Der Prozess vom Anfragen der URL über den Server, bis hin zur fertig gerenderten Website kann wie folgt vereinfacht darstellen. Der User gibt eine URL im Browser ein und sendet sie an den Web-Server. Das Interface WSGI am Web-Server leitet den Request zum passenden Objekt einer Applikation weiter. Da das Framework über eine explizite Zuweisung der verschiedenen Seiten verfügt, iteriert der urlresolver über die vorhandene URL-Struktur im Code (url.py). Gibt es eine Übereinstimmung, wird die damit verknüpfte Funktion in der View (view.py) aufgerufen. Hier ist die gesamte Logik der Website lokalisiert. Wie bereits erwähnt, ist es möglich unter Anderem auf die Datenbank der Applikation zuzugreifen und Eingaben des Users über eine Form zu verarbeiten. Nachdem werden die Informationen der View an das Template weitergereicht. Es handelt sich dabei um eine einfache HTML-Seite in der der strukturelle Aufbau im Frontend festgelegt wird. Die Informationen der View können hier zwischen doppelt-geschweiften Klammern eingebunden werden und, wenn nötig, mit einfachen Python-Befehlen anpassen. Nun kann das Template einen Response an den Web-Server schicken und die fertige Seite wird beim Klienten im Browser gerendert (vgl. Abbildung 2.1). | |||
Der Prozess vom Anfragen der URL über den Server, bis hin zur fertig gerenderten Website kann wie folgt vereinfacht darstellen. Der User gibt eine URL im Browser ein und sendet sie an den Web-Server. | |||
\begin{figure}[!h] | |||
\centering | |||
\includegraphics[width=0.5\textwidth]{figures/request-response-cycle} | |||
\caption{Request-Response-Kreislauf des Django Frameworks} | |||
\hfill | |||
\end{figure} | |||
\end{figure} | |||
Das Interface WSGI am Web-Server verbindet diesen mit dem Web-Framework, indem es den Request zum passenden Objekt weiterleitet. Hier wird der Applikation eine Callback-Funktion zur Verfügung gestellt [Kin17]. Au"serdem werden folgende Schritte durchgeführt: | |||
\begin{itemize} | |||
\item Die Middleware-Klassen aus der settings.py werden geladen | |||
\item Die Methoden der Listen Request, View, Response und Excpetion werden geladen | |||
\item Die angeforderte URL wird aufgelöst | |||
\end{itemize} | |||
Der WSGI-Handler fungiert also als Pförtner und Manager zwischen dem Web-Server und dem Django-Projekt. | |||
Um die URL, wie weiter oben erwähnt, aufzulösen, benötigt WSGI einen urlresolver. Durch die explizite Zuweisung der vorhandenen Seiten, kann dieser über die regulären Ausdrücke der url.py-Datei iterieren. Gibt es eine Übereinstimmung, wird die damit verknüpfte Funktion in der View (view.py) aufgerufen. Hier ist die gesamte Logik der Website lokalisiert. Wie bereits erwähnt, ist es möglich unter Anderem auf die Datenbank der Applikation zuzugreifen und Eingaben des Users über eine Form zu verarbeiten. Nachdem werden die Informationen der View an das Template weitergereicht. Es handelt sich dabei um eine einfache HTML-Seite in der der strukturelle Aufbau im Frontend festgelegt wird. Die Informationen der View können hier zwischen doppelt-geschweiften Klammern eingebunden und, wenn nötig, mit einfachen Python-Befehlen angepasst werden. Nun kann das Template, die vom WSGI-Framework zur Verfügung gestellte Callback-Funktion befüllen und einen Response an den Web-Server schicken. Die fertige Seite ist beim Klienten im Browserfenster zum rendern bereit (vgl. Abbildung 2.1). | |||
\subsection {Besonderheiten} | |||
Das Django-Framework bringt einige Besonderheiten mit sich, die beim implementiern des Prototypen von Bedeutung sind. Diese werden im Folgenden beschrieben. | |||
Die Administratoroberfläche ist eines der hilfreichsten Werkzeugen des gesamten Frameworks. Es stellt die Metadaten der Modelle aus dem Code visuell dar. Verifizierte Benutzer können die Daten nicht nur schnell erfassen, sondern diese auch editieren und verwalten. Das Recht, das Admin-Backend uneingeschränkt zu benutzen, ist dem sogenannten superuser vorenthalten. Dieser kann beim erstmaligen zuweisen nur über die Kommandozeile eingerichtet werden. Ist bereits ein superuser vorhanden, kann dieser im Admin-Backend weiteren Benutzern den gleichen Handlungsfreiraum einräumen. Zudem gibt es noch weitere Stufen der Zugangsberechtigungen, Staff- und Active-Status, die für eine breitere Gruppe von Benutzern geeignet ist. | |||
Um die gestaffelten Zugangsberechtigungen auch auf der Website umsetzen zu können, stellt Django ... zur Verfügung. | |||
Natürlich lassen sich die Dekorator auch für andere Zwecke vor Funktionen paltzieren. | |||
Sicherheit | |||
Um die gestaffelten Zugangsberechtigungen auch auf der Website umsetzen zu können, stellt Django verschiedene Decorator zur Verfügung. Soll eine bestimmte Seite nur von eingeloggten Benutzern besucht werden dürfen, so importiert man die Decorator des, von Django zur Verfügung gestellten, Authentifizierungssystems mit | |||
\\ | |||
\noindent\hspace*{10mm}% | |||
from django.contrib.auth.decorators import login\_required | |||
\\ | |||
Direkt über den Beginn der Funktion in view.py, oder auch single-view-function, wird zudem folgende Zeile ergänzt: | |||
\\ | |||
\noindent\hspace*{10mm}% | |||
\makeatletter @login\_required | |||
\\ | |||
Natürlich lassen sich die Decoratoren auch für andere Zwecke vor Funktionen platzieren. Begrenzte Zugänge zu den Views können durch die Art der Anfrage realisiert werden. Der Benutzer muss also zum Beispiel durch GET auf eine Seite zugreifen wollen um Einsicht zu erhalten. | |||
Benutzerdefinierte Decorator sind im Django-Framework möglich, darauf wird hier aber nicht weiter eingegangen. | |||
\section{Erweiterungen} | |||
@@ -35,24 +63,57 @@ Durch das hohe Ansehen, dass Django in der Branche genie"st ist der Pool an Erwe | |||
pip? | |||
allg Erweiterungen und dann genauer Taggable Manager | |||
\subsection {Taggable-Manager} | |||
Django-taggit ist eine Erweiterung von Alex Gaynor, einem Entwickler aus Washingtion DC. Das Add-on ermöglicht das Verwenden von Tags die automatisch mit einem eindeutigen Slug versehen werden. Um dieses zu installieren wird der folgende Befehl in die Kommandozeile eingefügt: | |||
Django-taggit ist eine Erweiterung von Alex Gaynor, einem Entwickler aus Washingtion DC. Das Add-on ermöglicht das Verwenden von Tags die automatisch mit einem eindeutigen Slug versehen werden. Der darin enthaltene Taggable Manager verwendet Django's Contenttype Framework, welches per Default verwendet wird, um die Modelle der Applikation zu verfolgen und diese durch generische Beziehungen zu verknüpfen. Die Felder app\_label und model machen die Modelle eindeutig zuweisbar. Instanzen des Contenttypes präsentieren und speichern die Informationen und Erstellen automatisch neue Instanzen, wenn Modelle hinzugefügt werden. Zudem stehen Methoden zur Verfügung, die das Abrufen und Arbeiten mit Instanzen der einzelnen Modelle erleichtern. | |||
Der Taggable-Manager ist jedoch nicht an das Contenttype-Framework gebunden ([Her16]). Durch die Verwendung eines echten Fremdschlüssels, kann zum Beispiel die Performance und Referenzgarantie verwirklicht werden. Dazu ist lediglich die Erstellung einer eigenen lookup-Tabelle notwendig, die die Entitäten zweier Tabellen direkt verlinkt, anstatt diese generische zu verbinden. Weiterführend können Modelle in einem benutzerdefinierten Modell vereint werden, sodass er Zugriff auf diese einheitlich geschieht. Außerdem ist es möglich Primary-Keys zu verwenden, die nicht aus ganzen Zahlen bestehen, sondern aus Buchstaben und Wörtern. | |||
Um django-taggit zu installieren wird der folgende Befehl in die Kommandozeile eingefügt([Gay10]): | |||
\\ | |||
\noindent\hspace*{10mm}% | |||
\$ pip install django-taggit | |||
\\ | |||
Im model.py wird das Feld tag neu erstellt und als Taggable Manager definiert. | |||
Au"serdem muss taggit in der settings.py Datei unter INSTALLED\_APPS ergänzt werden. Um dem Programm zu sagen, dass nun eine neue Liste der Datenbank hinzugefügt werden muss, werden folgende Befehle in die Kommandozeile eingefügt: | |||
Au"serdem muss taggit in der settings.py unter INSTALLED\_APPS ergänzt werden. Um dem Programm zu sagen, dass nun eine neue Liste der Datenbank hinzugefügt werden muss, werden folgende Befehle in die Kommandozeile eingefügt: | |||
\\ | |||
\noindent\hspace*{10mm}% | |||
\$ python3 manage.py makemigrations \\ | |||
\noindent\hspace*{10mm}% | |||
\$ python3 manage.py migrate | |||
\\ | |||
Im Admin-Backend kann nun geprüft werden, ob das neue Feld in die Datenbank integriert wurde. Neue Tags können in das Textfeld eingetragen werden. Der Parser verarbeitet jedes Wort, dass durch ein Komma oder ein Leerzeichen getrennt ist als ein Tag. Soll ein dieses jedoch aus mehreren Wörtern bestehen so müssen diese zwischen Anführungszeichen stehen. Standardmäßig unterscheidet der Taggable Manager zwischen Groß- und Kleinschreibung, ist also case sensitive. Ändern kann man das, indem der Boolean TAGGIT\_CASE\_INSENSITIVE in der settings.py auf True gestellt wird. | |||
Im Admin-Backend kann nun geprüft werden, ob das neue Feld in die Datenbank integriert wurde. Neue Tags können in das Textfeld eingetragen werden. Der Parser verarbeitet jedes Wort, dass durch ein Komma oder ein Leerzeichen getrennt ist als ein Tag. Soll dieses jedoch aus mehreren Wörtern bestehen so müssen diese mit Anführungszeichen umfasst werden. Standardmäßig unterscheidet der Taggable Manager zwischen Groß- und Kleinschreibung, Tags sind also case sensitive. Ändern kann man das, indem der Boolean TAGGIT\_CASE\_INSENSITIVE in der settings.py auf True gestellt wird. | |||
\section{Bootstrap} | |||
Eine umfangreiche Website einheitlich zu gestalten ist oft sehr komplex und zeitaufwendig. Die Entwickler von Twitter haben deshalb, zunächst Firmenintern, an einem neuen Verwaltungswerkzeug gearbeitet, das mehrere Bibliotheken zusammenführen sollte. Sie merkten, das die neue Bibliothek, die daraus entstand, nicht nur auf Ihre eigene Website anwendbar, sondern so flexible ist, dass jede Art von Website davon profitieren könnte. 2011 entschieden Sie sich Bootstrap für die Öffentlichkeit frei zugänglich zu machen. Die Open-Source-Bibliothek, die auf GitHub abrufbar ist, wird seitdem von vielen interessierten Programmierern weiterentwickelt und ist somit stark gewachsen. Version 2.0 verfügt au"serdem über die Fähigkeit Websites responsive auf verschiedenste mobile Endgeräte anzupassen. | |||
Das Bootstrap-Paket beinhaltet vorgefertigte Cascading Stylesheets, kurz CSS, die Farben, Schriftarten und viele weitere Stildefinitionen. Zudem befinden sich auch Erweiterungen des JavaScript-Frameworks jQuery in der Bibliothek, die weiterführende Funktionen beinhalten wie zum Beispiel Filter oder Dropdown-Menüs. Das Paket kann einfach eingebunden werden im head-tag einer HTML-Datei (vgl. Abbildung 2.3). | |||
\begin{figure}[!h] | |||
\centering | |||
\includegraphics[width=1\textwidth]{figures/bootstrap-head-tag} | |||
\caption{Einbindung von Bootstrap in einer HTML-Datei} | |||
\hfill | |||
\end{figure} | |||
Durch das Einbinden von Bootstrap in einer HTML-Datei werden einige Styles bereits automatisch auf die darin vorkommenden Tags, wie Links und Überschriften, angewandt. Dies ist jedoch nur ein sehr kleiner Teil den die Bibliothek zur Verfügung stellt. Möchte man Bootstrap umfangreich nutzen so lassen sich die Stildefinitionen mit Klassen oder ID's in diverse HTML-Tags eintragen (vlg. Abbildung 2.4.). | |||
\begin{figure}[!h] | |||
\centering | |||
\includegraphics[width=1\textwidth]{figures/bootstrap-class-example} | |||
\caption{Bootstrap-Klassen in HTML-Tag} | |||
\hfill | |||
\end{figure} | |||
Möchte man bestimmte gestalterische Eigenschaften von Bootstrap überschreiben muss eine eigens verfasste CSS-Datei nach der Verlinkung von Bootstrap in die Website eingebunden werden. Der Parser liest die Datei von oben nach unten, Links nach Rechts. Liest dieser also zu erst die Bootstrap Bibliothek und speichert diese, so überschreiben die Styles die danach kommen, die bereits gelesenen Eingaben. Die Styles, die inline auf ein Tag angewendet werden sind somit die bestimmenden Eigenschaften. Natürlich sollten Stildefinitionen niemals inline eingepflegt werden, da dies zu einem sehr unübersichtlichen und wartungsintensiven Code führen. | |||
@@ -1,19 +1,43 @@ | |||
@article{Verdam, | |||
@article{Leipner, | |||
author = "Ingo Leipner", | |||
title = "Stress für Beschäftigte: Wie kann man die E-Mail-Flut bekämpfen", | |||
year = "2013", | |||
note = "http://www.mz-web.de/wirtschaft/e-mail-flut-mails-bearbeiten-kommunikation-stress-zeit-sparen" } | |||
note = "http://www.mz-web.de/wirtschaft/e-mail-flut-mails-bearbeiten-kommunikation-stress-zeit-sparen" | |||
} | |||
@article{Ndukwe, | |||
@article{Ndukwe, | |||
author = "Nnenna Ndukwe", | |||
title = "Python is the back-end programming language of the future and here’s why", | |||
year = "2017", | |||
note = "https://medium.com/@nnennahacks/https-medium-com-nnennandukwe-python-is-the-back-end-programming-language-of-the-future-heres-why" } | |||
note = "https://medium.com/@nnennahacks/https-medium-com-nnennandukwe-python-is-the-back-end-programming-language-of-the-future-heres-why" | |||
} | |||
@article{Shelest, | |||
@article{Shelest, | |||
author = "Alexy Shelest", | |||
title = "Model View Controller, Model View Presenter, and Model View ViewModel Design Patterns", | |||
year = "2009", | |||
note = "https://www.codeproject.com/Articles/42830/Model-View-Controller-Model-View-Presenter-and-Mod" } | |||
note = "https://www.codeproject.com/Articles/42830/Model-View-Controller-Model-View-Presenter-and-Mod" | |||
} | |||
@article{Gaynor, | |||
author = "Alex Gaynor", | |||
title = "Exploring Django-Taggit’s Data Model", | |||
year = "2010", | |||
note = "https://django-taggit.readthedocs.io/en/latest/getting\_started" | |||
} | |||
@article{Herzog, | |||
author = "Stephan Herzog", | |||
title = "Model View Controller, Model View Presenter, and Model View ViewModel Design Patterns", | |||
year = "2016", | |||
note = "https://medium.com/sthzg/a-short-exploration-of-django-taggit-bb869ea5051f" | |||
} | |||
@article{King, | |||
author = "Adam King", | |||
title = "Django Middlewares and the Request/Response Cycle", | |||
year = "2017", | |||
note = "https://medium.com/zeitcode/django-middlewares-and-the-request-response-cycle-fcbf8efb903f" | |||
} | |||