Browse Source

edited framework chapter

master
Esther Kleinhenz 5 years ago
parent
commit
f5afb1e012

+ 4
- 2
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.aux View File

@@ -39,14 +39,15 @@
\bibcite{Computer}{{Com18}{}{{}}{{}}}
\bibcite{Oracle}{{Coo10}{}{{}}{{}}}
\bibcite{Dixit}{{Dix18}{}{{}}{{}}}
\bibcite{Djangogirls}{{Dja18}{}{{}}{{}}}
\bibcite{Djangogirls}{{Dja18a}{}{{}}{{}}}
\bibcite{Djangogirls-2}{{Dja18b}{}{{}}{{}}}
\bibcite{Fiok}{{Fio14}{}{{}}{{}}}
\bibcite{Schlede}{{FMS17}{}{{}}{{}}}
\bibcite{Django-4}{{Fou18a}{}{{}}{{}}}
\bibcite{Django}{{Fou18b}{}{{}}{{}}}
\bibcite{Django-2}{{Fou18c}{}{{}}{{}}}
\bibcite{Django-3}{{Fou18d}{}{{}}{{}}}
\@writefile{toc}{\contentsline {chapter}{Referenzen}{29}{chapter*.20}}
\bibcite{Django-3}{{Fou18d}{}{{}}{{}}}
\bibcite{Python}{{Fou18e}{}{{}}{{}}}
\bibcite{Gaynor}{{Gay10}{}{{}}{{}}}
\bibcite{Sario}{{Gmb18}{}{{}}{{}}}
@@ -55,6 +56,7 @@
\bibcite{Leipner}{{Lei13}{}{{}}{{}}}
\bibcite{Microsoft}{{Mic18}{}{{}}{{}}}
\bibcite{Ndukwe}{{Ndu17}{}{{}}{{}}}
\bibcite{Nevius}{{Nev15}{}{{}}{{}}}
\bibcite{Ong}{{Ong18}{}{{}}{{}}}
\bibcite{Otto}{{Ott11}{}{{}}{{}}}
\bibcite{Otto-2}{{Ott12}{}{{}}{{}}}

+ 14
- 2
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.bbl View File

@@ -25,12 +25,18 @@ Chitrank Dixit.
\newblock
https://www.datacamp.com/community/tutorials/pep8-tutorial-python-code.

\bibitem[Dja18]{Djangogirls}
\bibitem[Dja18a]{Djangogirls}
Djangogirls.
\newblock Creating a blog post model.
\newblock 2018.
\newblock https://tutorial.djangogirls.org/en/django\_models/.

\bibitem[Dja18b]{Djangogirls-2}
Djangogirls.
\newblock Was passiert, wenn jemand eine webseite beim server anfordert?
\newblock 2018.
\newblock https://tutorial.djangogirls.org/de/django/.

\bibitem[Fio14]{Fiok}
Marzena Fiok.
\newblock E-mail-flut sorgt für kostenlawine.
@@ -126,9 +132,15 @@ Nnenna Ndukwe.
\newblock
https://medium.com/@nnennahacks/https-medium-com-nnennandukwe-python-is-the-back-end-programming-language-of-the-future-heres-why.

\bibitem[Nev15]{Nevius}
Ryan Nevius.
\newblock django-post\_office git repository.
\newblock 2015.
\newblock https://ryannevius.com.

\bibitem[Ong18]{Ong}
Selwin Ong.
\newblock django-post\_office git repository.
\newblock Django request-response cycle.
\newblock 2018.
\newblock https://github.com/ui/django-post\_office/blob/master/AUTHORS.rst.


+ 37
- 39
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.blg View File

@@ -11,15 +11,12 @@ 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
Repeated entry---line 78 of file ../references/References_2.bib
: @article{Ong
: ,
I'm skipping whatever remains of this entry
Warning--empty journal in Bootstrap
Warning--empty journal in Computer
Warning--empty journal in Oracle
Warning--empty journal in Dixit
Warning--empty journal in Djangogirls
Warning--empty journal in Djangogirls-2
Warning--empty journal in Fiok
Warning--empty journal in Schlede
Warning--empty journal in Django-4
@@ -34,6 +31,7 @@ Warning--empty journal in King
Warning--empty journal in Leipner
Warning--empty journal in Microsoft
Warning--empty journal in Ndukwe
Warning--empty journal in Nevius
Warning--empty journal in Ong
Warning--empty journal in Otto
Warning--empty journal in Otto-2
@@ -42,45 +40,45 @@ Warning--empty journal in Shelest
Warning--empty journal in Solutions
Warning--empty journal in Timm
Warning--empty publisher in Weigend
You've used 27 entries,
You've used 29 entries,
2543 wiz_defined-function locations,
703 strings with 8340 characters,
and the built_in function-call counts, 7356 in all, are:
= -- 726
> -- 216
< -- 27
+ -- 58
- -- 54
* -- 355
:= -- 1287
add.period$ -- 108
call.type$ -- 27
change.case$ -- 134
chr.to.int$ -- 23
cite$ -- 54
duplicate$ -- 380
empty$ -- 546
format.name$ -- 106
if$ -- 1436
int.to.chr$ -- 5
712 strings with 8545 characters,
and the built_in function-call counts, 7898 in all, are:
= -- 780
> -- 232
< -- 29
+ -- 63
- -- 58
* -- 381
:= -- 1381
add.period$ -- 116
call.type$ -- 29
change.case$ -- 144
chr.to.int$ -- 24
cite$ -- 58
duplicate$ -- 408
empty$ -- 586
format.name$ -- 114
if$ -- 1542
int.to.chr$ -- 6
int.to.str$ -- 0
missing$ -- 28
newline$ -- 165
num.names$ -- 81
pop$ -- 163
missing$ -- 30
newline$ -- 177
num.names$ -- 87
pop$ -- 175
preamble$ -- 1
purify$ -- 162
purify$ -- 174
quote$ -- 0
skip$ -- 293
skip$ -- 314
stack$ -- 0
substring$ -- 189
substring$ -- 203
swap$ -- 1
text.length$ -- 27
text.prefix$ -- 25
text.length$ -- 29
text.prefix$ -- 27
top$ -- 0
type$ -- 212
warning$ -- 27
while$ -- 54
width$ -- 33
write$ -- 353
(There was 1 error message)
type$ -- 228
warning$ -- 29
while$ -- 58
width$ -- 35
write$ -- 379
(There were 29 warnings)

+ 4
- 4
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.lof View File

@@ -3,10 +3,10 @@
\addvspace {10\p@ }
\addvspace {10\p@ }
\contentsline {figure}{\numberline {2.1}{\ignorespaces Vereinfachter MVP [She09]\relax }}{6}{figure.caption.5}
\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks [Nev15]\relax }}{7}{figure.caption.6}
\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal\relax }}{8}{figure.caption.7}
\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees [Orc10]\relax }}{9}{figure.caption.8}
\contentsline {figure}{\numberline {2.5}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{12}{figure.caption.9}
\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks [Nev15].\relax }}{7}{figure.caption.6}
\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal.\relax }}{8}{figure.caption.7}
\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees [Orc10].\relax }}{9}{figure.caption.8}
\contentsline {figure}{\numberline {2.5}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei.\relax }}{13}{figure.caption.9}
\contentsline {figure}{\numberline {2.6}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{13}{figure.caption.10}
\addvspace {10\p@ }
\contentsline {figure}{\numberline {3.1}{\ignorespaces Forschungsdesign\relax }}{15}{figure.caption.11}

+ 130
- 117
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.log View File

@@ -1,4 +1,4 @@
This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex 2018.6.7) 18 NOV 2018 22:38
This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018) (preloaded format=xelatex 2018.6.7) 19 NOV 2018 10:53
entering extended mode
\write18 enabled.
file:line:error style messages enabled.
@@ -1346,11 +1346,11 @@ File: figures/request-response-cycle.png Graphic file (type bmp)
LaTeX Warning: `!h' float specifier changed to `!ht'.

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 35.
(babel) in language on input line 36.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 35.
(babel) in language on input line 36.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 35.
(babel) in language on input line 36.

Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt.
@@ -1358,18 +1358,27 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt):
This may cause the page layout to be inconsistent, however.

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 38.
(babel) in language on input line 39.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 38.
(babel) in language on input line 39.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 38.
(babel) in language on input line 39.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 38.
(babel) in language on input line 39.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 38.
(babel) in language on input line 39.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 38.
(babel) in language on input line 39.
[6]
Underfull \hbox (badness 10000) in paragraph at lines 39--42

[]


Underfull \hbox (badness 10000) in paragraph at lines 43--46

[]


Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt.
@@ -1377,32 +1386,32 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt):
This may cause the page layout to be inconsistent, however.

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 50.
(babel) in language on input line 46.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 50.
(babel) in language on input line 46.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 50.
(babel) in language on input line 46.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 50.
(babel) in language on input line 46.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 50.
(babel) in language on input line 46.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 50.
(babel) in language on input line 46.
[7]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 54.
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 54.
(babel) in language on input line 52.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 54.
(babel) in language on input line 52.
File: figures/virt-env-terminal.png Graphic file (type bmp)
<figures/virt-env-terminal.png>
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 67.
(babel) in language on input line 65.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 67.
(babel) in language on input line 65.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 67.
(babel) in language on input line 65.


Package Fancyhdr Warning: \headheight is too small (12.0pt):
@@ -1411,26 +1420,26 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt):
This may cause the page layout to be inconsistent, however.

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 70.
(babel) in language on input line 68.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 70.
(babel) in language on input line 68.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 70.
(babel) in language on input line 68.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 70.
(babel) in language on input line 68.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 70.
(babel) in language on input line 68.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 70.
(babel) in language on input line 68.
[8]
File: figures/ldap-tree.png Graphic file (type bmp)
<figures/ldap-tree.png>
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 78.
(babel) in language on input line 76.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 78.
(babel) in language on input line 76.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 78.
(babel) in language on input line 76.


Package Fancyhdr Warning: \headheight is too small (12.0pt):
@@ -1452,21 +1461,17 @@ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 85.
[9]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 86.
(babel) in language on input line 89.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 86.
(babel) in language on input line 89.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 86.
(babel) in language on input line 89.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 90.
(babel) in language on input line 93.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 90.
(babel) in language on input line 93.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 90.

Underfull \hbox (badness 10000) in paragraph at lines 95--97

[]
(babel) in language on input line 93.


Package Fancyhdr Warning: \headheight is too small (12.0pt):
@@ -1475,28 +1480,34 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt):
This may cause the page layout to be inconsistent, however.

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 97.
(babel) in language on input line 95.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 97.
(babel) in language on input line 95.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 97.
(babel) in language on input line 95.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 97.
(babel) in language on input line 95.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 97.
(babel) in language on input line 95.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 97.
(babel) in language on input line 95.
[10]
Underfull \hbox (badness 10000) in paragraph at lines 98--101
Underfull \hbox (badness 10000) in paragraph at lines 98--100

[]


Underfull \hbox (badness 10000) in paragraph at lines 101--104

[]

Missing character: There is no ˜ in font aer12!
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 106.
(babel) in language on input line 109.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 106.
(babel) in language on input line 109.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 106.
(babel) in language on input line 109.

Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt.
@@ -1517,18 +1528,11 @@ Package babel Info: Redefining german shorthand "~
(babel) in language on input line 113.
[11]
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 115.
(babel) in language on input line 117.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 115.
(babel) in language on input line 117.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 115.
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'.
(babel) in language on input line 117.


Package Fancyhdr Warning: \headheight is too small (12.0pt):
@@ -1537,18 +1541,23 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt):
This may cause the page layout to be inconsistent, however.

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 137.
(babel) in language on input line 123.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 137.
(babel) in language on input line 123.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 137.
(babel) in language on input line 123.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 137.
(babel) in language on input line 123.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 137.
(babel) in language on input line 123.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 137.
[12])
(babel) in language on input line 123.
[12]
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>
)

Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 14.49998pt.
@@ -1639,8 +1648,8 @@ Package babel Info: Redefining german shorthand "|
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 33.

Overfull \hbox (6.31879pt too wide) in paragraph at lines 36--38
\T1/aer/m/n/12 Codes dem Com-pi-ler mit-zu-tei-len, dass ei-ne In-te-gra-ti-on statt-fin-den muss (vgl. [Dja18]).
Overfull \hbox (12.1867pt too wide) in paragraph at lines 36--38
\T1/aer/m/n/12 Codes dem Com-pi-ler mit-zu-tei-len, dass ei-ne In-te-gra-ti-on statt-fin-den muss (vgl. [Dja18a]).
[]


@@ -2089,30 +2098,20 @@ Underfull \hbox (badness 10000) in paragraph at lines 29--33
[]


Underfull \hbox (badness 10000) in paragraph at lines 35--40
Underfull \hbox (badness 10000) in paragraph at lines 41--46
[]\T1/aer/m/n/12 Marzena Fiok. E-mail-flut sorgt für ko-sten-la-wi-ne.
[]


Underfull \hbox (badness 10000) in paragraph at lines 35--40
Underfull \hbox (badness 10000) in paragraph at lines 41--46
\T1/aer/m/n/12 2014. https://www.tecchannel.de/a/e-mail-flut-sorgt-fuer-
[]


Underfull \hbox (badness 10000) in paragraph at lines 61--66
Underfull \hbox (badness 10000) in paragraph at lines 67--72
\T1/aer/m/n/12 https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-
[]


Underfull \hbox (badness 8056) in paragraph at lines 68--73
[]\T1/aer/m/n/12 Django Soft-ware Foun-da-ti-on. Working with forms. 2018.
[]


Underfull \hbox (badness 10000) in paragraph at lines 68--73
\T1/aer/m/n/12 https://docs.djangoproject.com/en/dev/topics/forms/#using-a-form-
[]

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 73.
Package babel Info: Redefining german shorthand "|
@@ -2130,14 +2129,23 @@ Package babel Info: Redefining german shorthand "~


]
Underfull \hbox (badness 8056) in paragraph at lines 74--79
[]\T1/aer/m/n/12 Django Soft-ware Foun-da-ti-on. Working with forms. 2018.
[]


Underfull \hbox (badness 10000) in paragraph at lines 74--79
\T1/aer/m/n/12 https://docs.djangoproject.com/en/dev/topics/forms/#using-a-form-
[]

Missing character: There is no ’ in font aer12!

Underfull \hbox (badness 10000) in paragraph at lines 87--91
Underfull \hbox (badness 10000) in paragraph at lines 93--97
[]\T1/aer/m/n/12 Sario Mar-ke-ting GmbH. Tag-ging. 2018.
[]


Underfull \hbox (badness 2717) in paragraph at lines 101--106
Underfull \hbox (badness 2717) in paragraph at lines 107--112
[]\T1/aer/m/n/12 Adam King. Djan-go midd-le-wa-res and the re-quest/-re-spon-se cy-
[]

@@ -2146,38 +2154,28 @@ 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 122--128
Underfull \hbox (badness 10000) in paragraph at lines 128--134
\T1/aer/m/n/12 medium-com-nnennandukwe-python-is-the-back-end-programming-
[]


Underfull \hbox (badness 10000) in paragraph at lines 130--134
[]\T1/aer/m/n/12 Selwin Ong. django-post_office git re-po-si-to-ry. 2018.
[]


Underfull \hbox (badness 10000) in paragraph at lines 136--141
[]\T1/aer/m/n/12 Mark Ot-to. Boot-strap from twit-ter. 2011.
[]


Underfull \hbox (badness 10000) in paragraph at lines 136--141
\T1/aer/m/n/12 https://blog.twitter.com/developer/en_us/a/2011/bootstrap-
Underfull \hbox (badness 10000) in paragraph at lines 136--140
[]\T1/aer/m/n/12 Ryan Ne-vi-us. django-post_office git re-po-si-to-ry. 2015.
[]


Underfull \hbox (badness 10000) in paragraph at lines 143--148
[]\T1/aer/m/n/12 Mark Ot-to. Say hel-lo to boot-strap 2.0. 2012.
Underfull \hbox (badness 10000) in paragraph at lines 142--146
[]\T1/aer/m/n/12 Selwin Ong. Djan-go request-response cy-cle. 2018.
[]


Overfull \hbox (38.1438pt too wide) in paragraph at lines 143--148
\T1/aer/m/n/12 https://web.archive.org/web/20120203191214/https://dev.twitter.com/blog/say-
Underfull \hbox (badness 10000) in paragraph at lines 148--153
[]\T1/aer/m/n/12 Mark Ot-to. Boot-strap from twit-ter. 2011.
[]


Underfull \hbox (badness 10000) in paragraph at lines 150--154
[]\T1/aer/m/n/12 Shabda. Un-der-stan-ding de-co-ra-tors. 2009.
Underfull \hbox (badness 10000) in paragraph at lines 148--153
\T1/aer/m/n/12 https://blog.twitter.com/developer/en_us/a/2011/bootstrap-
[]


@@ -2187,29 +2185,44 @@ Package Fancyhdr Warning: \headheight is too small (12.0pt):
This may cause the page layout to be inconsistent, however.

Package babel Info: Redefining german shorthand "f
(babel) in language on input line 154.
(babel) in language on input line 153.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 154.
(babel) in language on input line 153.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 154.
(babel) in language on input line 153.
Package babel Info: Redefining german shorthand "f
(babel) in language on input line 154.
(babel) in language on input line 153.
Package babel Info: Redefining german shorthand "|
(babel) in language on input line 154.
(babel) in language on input line 153.
Package babel Info: Redefining german shorthand "~
(babel) in language on input line 154.
(babel) in language on input line 153.
[30]
Underfull \hbox (badness 10000) in paragraph at lines 156--162
Underfull \hbox (badness 10000) in paragraph at lines 155--160
[]\T1/aer/m/n/12 Mark Ot-to. Say hel-lo to boot-strap 2.0. 2012.
[]


Overfull \hbox (38.1438pt too wide) in paragraph at lines 155--160
\T1/aer/m/n/12 https://web.archive.org/web/20120203191214/https://dev.twitter.com/blog/say-
[]


Underfull \hbox (badness 10000) in paragraph at lines 162--166
[]\T1/aer/m/n/12 Shabda. Un-der-stan-ding de-co-ra-tors. 2009.
[]


Underfull \hbox (badness 10000) in paragraph at lines 168--174
[]\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 156--162
Underfull \hbox (badness 10000) in paragraph at lines 168--174
\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 156--162
Underfull \hbox (badness 10000) in paragraph at lines 168--174
\T1/aer/m/n/12 https://www.codeproject.com/Articles/42830/Model-View-Controller-
[]

@@ -2249,10 +2262,10 @@ Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 78.
)
(\end occurred when \ifnum on line 5 was incomplete)
Here is how much of TeX's memory you used:
27411 strings out of 492970
490688 string characters out of 6133939
562061 words of memory out of 5000000
30977 multiletter control sequences out of 15000+600000
27417 strings out of 492970
490793 string characters out of 6133939
563107 words of memory out of 5000000
30983 multiletter control sequences out of 15000+600000
563921 words of font info for 80 fonts, out of 8000000 for 9000
1348 hyphenation exceptions out of 8191
58i,18n,50p,10437b,960s stack positions out of 5000i,500n,10000p,200000b,80000s

BIN
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.synctex.gz View File


+ 1
- 1
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/bachelorabeit_EstherKleinhenz.toc View File

@@ -9,7 +9,7 @@
\contentsline {section}{\numberline {2.1}Django}{5}{section.2.1}
\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Djangos}{7}{subsection.2.1.1}
\contentsline {subsection}{\numberline {2.1.2}Virtuelle Umgebung}{8}{subsection.2.1.2}
\contentsline {subsection}{\numberline {2.1.3}Lightweight Directory Access Protocol}{8}{subsection.2.1.3}
\contentsline {subsection}{\numberline {2.1.3}Lightweight Directory Access Protocol}{9}{subsection.2.1.3}
\contentsline {subsection}{\numberline {2.1.4}Sicherheit}{9}{subsection.2.1.4}
\contentsline {section}{\numberline {2.2}Erweiterungen}{10}{section.2.2}
\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{10}{subsection.2.2.1}

+ 1
- 1
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/ausblick.aux View File

@@ -27,7 +27,7 @@
\setcounter{r@tfl@t}{0}
\setcounter{AM@survey}{0}
\setcounter{Item}{0}
\setcounter{Hfootnote}{5}
\setcounter{Hfootnote}{18}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{27}
\setcounter{NAT@ctr}{0}

+ 1
- 1
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/ergebnis.aux View File

@@ -32,7 +32,7 @@
\setcounter{r@tfl@t}{0}
\setcounter{AM@survey}{0}
\setcounter{Item}{0}
\setcounter{Hfootnote}{5}
\setcounter{Hfootnote}{18}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{27}
\setcounter{NAT@ctr}{0}

+ 1
- 1
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/fazit.aux View File

@@ -31,7 +31,7 @@
\setcounter{r@tfl@t}{0}
\setcounter{AM@survey}{0}
\setcounter{Item}{0}
\setcounter{Hfootnote}{5}
\setcounter{Hfootnote}{18}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{28}
\setcounter{NAT@ctr}{0}

+ 7
- 7
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/framework.aux View File

@@ -6,18 +6,18 @@
\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 [She09]\relax }}{6}{figure.caption.5}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks [Nev15]\relax }}{7}{figure.caption.6}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.2}{\ignorespaces Request-Response-Kreislauf des Django Frameworks [Nev15].\relax }}{7}{figure.caption.6}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.1}Besonderheiten Djangos}{7}{subsection.2.1.1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.2}Virtuelle Umgebung}{8}{subsection.2.1.2}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal\relax }}{8}{figure.caption.7}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.3}Lightweight Directory Access Protocol}{8}{subsection.2.1.3}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees [Orc10]\relax }}{9}{figure.caption.8}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.3}{\ignorespaces Erstellen der virtuelle Umgebung im Terminal.\relax }}{8}{figure.caption.7}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.3}Lightweight Directory Access Protocol}{9}{subsection.2.1.3}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces Beispiel eines LDAP-Trees [Orc10].\relax }}{9}{figure.caption.8}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1.4}Sicherheit}{9}{subsection.2.1.4}}
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Erweiterungen}{10}{section.2.2}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1}Taggable-Manager}{10}{subsection.2.2.1}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.2}Hilfsbibliotheken}{11}{subsection.2.2.2}}
\@writefile{toc}{\contentsline {section}{\numberline {2.3}Bootstrap}{12}{section.2.3}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.5}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei\relax }}{12}{figure.caption.9}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.5}{\ignorespaces Einbindung von Bootstrap in einer HTML-Datei.\relax }}{13}{figure.caption.9}}
\@writefile{lof}{\contentsline {figure}{\numberline {2.6}{\ignorespaces Bootstrap-Klassen in HTML-Tag\relax }}{13}{figure.caption.10}}
\@setckpt{chapters/framework}{
\setcounter{page}{14}
@@ -26,7 +26,7 @@
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{footnote}{13}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{2}
@@ -46,7 +46,7 @@
\setcounter{r@tfl@t}{0}
\setcounter{AM@survey}{0}
\setcounter{Item}{0}
\setcounter{Hfootnote}{0}
\setcounter{Hfootnote}{13}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{15}
\setcounter{NAT@ctr}{0}

+ 1
- 1
doc/bachelorarbeit_EstherKleinhenz/.texpadtmp/chapters/prototyp.aux View File

@@ -49,7 +49,7 @@
\setcounter{r@tfl@t}{0}
\setcounter{AM@survey}{0}
\setcounter{Item}{0}
\setcounter{Hfootnote}{5}
\setcounter{Hfootnote}{18}
\setcounter{Hy@AnnotLevel}{0}
\setcounter{bookmark@seq@number}{25}
\setcounter{NAT@ctr}{0}

BIN
doc/bachelorarbeit_EstherKleinhenz/bachelorabeit_EstherKleinhenz.pdf View File


+ 37
- 33
doc/bachelorarbeit_EstherKleinhenz/chapters/framework.tex View File

@@ -4,7 +4,7 @@ Um die Website-Erweiterung realisieren zu können, wird zunächst festgelegt wel
Das dazugehörige Framework Django reduziert den Entwicklungsaufwand eines Prototypen erheblich und ist daher als zielführendes Framework die beste Wahl.

\section{Django}
Django ist ein Web-Framework, das eine schnelle, strukturierte Entwicklung ermöglicht und dabei ein einfaches Design beibehält. Der darin enthaltene Model-View-Presenter (MVP) kann, ähnlich wie der Model-View-Controller, die Interaktionen zwischen Model und View, die Auswahl und Ausführung von Befehlen und das Auslösen von Ereignissen steuern (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 (vgl. [She09]). Durch die direkte Bindung von Daten und View, geregelt durch den Presenter, wird die Codemenge der Applikation stark reduziert.
Django ist ein Web-Framework, das eine schnelle, strukturierte Entwicklung ermöglicht und dabei ein einfaches Design beibehält. Der darin enthaltene Model-View-Presenter (MVP) kann, ähnlich wie der Model-View-Controller, die Interaktionen zwischen Model und View, die Auswahl und Ausführung von Befehlen und das Auslösen von Ereignissen steuern (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 (vgl. [She09]). Durch die direkte Bindung von Daten und View, geregelt durch den Pfresenter, wird die Codemenge der Applikation stark reduziert.

\begin{figure}[!h]
\centering
@@ -13,7 +13,7 @@ Django ist ein Web-Framework, das eine schnelle, strukturierte Entwicklung ermö
\hfill
\end{figure}

Der Prozess vom Anfragen der URL über den Server, bis hin zur fertig gerenderten Website kann wie folgt vereinfacht dargestellt werden.
Der Prozess vom Anfragen der URL über den Server, bis hin zur fertig gerenderten Website kann wie folgt vereinfacht dargestellt werden.

Der User gibt eine URL im Browser ein und sendet sie an den Web-Server. 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 (vgl. [Kin17]). Au"serdem werden folgende Schritte durchgeführt:
\begin{itemize}
@@ -23,29 +23,27 @@ Der User gibt eine URL im Browser ein und sendet sie an den Web-Server. Das Inte
\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 \textit {urlresolver}(vgl. ). 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. Es ist 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. [Kin17], Abbildung 2.2.).
Um die URL, wie weiter oben erwähnt, aufzulösen, benötigt WSGI einen \textit {urlresolver}\footnote{ Urlsresolver verknüpft Url-Muster mit den passenden Views.}
(vgl. [Dja18b]). 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 (views.py) aufgerufen. Hier ist die gesamte Logik der Website lokalisiert. Es ist 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 Front-end festgelegt wird. Die Informationen der View können hier zwischen doppelt-geschweiften Klammern eingebunden und, wenn nötig, mit einfachen Python-Befehlen angepasst werden. Das Template kann dann 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. [Kin17], Abbildung 2.2.).

\begin{figure}[!h]
\centering
\includegraphics[width=0.5\textwidth]{figures/request-response-cycle}
\caption{Request-Response-Kreislauf des Django Frameworks [Nev15]}
\caption{Request-Response-Kreislauf des Django Frameworks [Nev15].}
\hfill
\end{figure}

\subsection {Besonderheiten Djangos}
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 verschiedene Decorator zur Verfügung. Soll eine bestimmte Seite nur von eingeloggten Benutzern besucht werden, 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
\\
Vor der Definition der Funktion wird dann folgende Zeile ergänzt:
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 \textit{Superuser}\footnote{ Superuser ist ein Benutzer der alle Zugangsrechte im Framework erhält.} 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 verschiedene Decorator zur Verfügung. Soll eine bestimmte Seite nur von authentifizierten Benutzern besucht werden, kann die Funktion mit einem Decorator versehen werden:
\\
\begin{addmargin}[0pt]{0pt}
\noindent\hspace*{10mm}%
\makeatletter @login\_required
\texttt{\makeatletter @login\_required}
\\
\end{addmargin}
Natürlich lassen sich Decorator auch für andere Zwecke vor Funktionen platzieren. Unter Anderem werden so die Views vor möglichen Angriffen, wie Cross-Site-Scripting, geschützt.

Durch den einfachen Aufbau ist es au"serdem möglich diese selbst zu implementieren. Ein einfaches Beispiel wäre das prüfen des, an die Funktion übergebenen, Parameter. Sollen nur positive Zahlen verarbeitet werden, so kann der Decorator alle anderen Eingaben abfangen.
@@ -53,44 +51,49 @@ Durch den einfachen Aufbau ist es au"serdem möglich diese selbst zu implementie

\subsection{Virtuelle Umgebung}

Wird eine prototypische Anwendung gestartet, ist es notwendig, verschiedensten Module zu verwenden und zu testen. Die Versionen dieser spielen hierbei eine entscheidende Rolle, um Konflikte zu vermeiden [Fou18]. Um diesem Problem vorzubeugen, wird eine virtuelle Umgebung implementiert. Sie besitzt einen eigenen Projektpfad, beinhaltet alle nötigen Pakete und Bibliotheken, und lässt sich nach dem Einrichten im Terminal starten. Die folgende Abbildung (2.4) zeigt das Erstellen eines neuen Ordners, das Erstellen der virtuellen Umgebung und den Aktivierungsbefehl. Ist der Name des Environment in Klammern am Kommandozeilenanfang, bedeutet das, diese ist jetzt aktiv.
Wird eine prototypische Anwendung gestartet, ist es notwendig, verschiedensten Module zu verwenden und zu testen. Die Versionen dieser spielen hierbei eine entscheidende Rolle, um Konflikte zu vermeiden (vgl. [Fou18]). Um diesem Problem vorzubeugen, wird eine virtuelle Umgebung implementiert. Sie besitzt einen eigenen Projektpfad, beinhaltet alle nötigen Pakete und Bibliotheken, und lässt sich nach dem Einrichten im Terminal starten. Die folgende Abbildung 2.4. zeigt das Erstellen eines neuen Ordners, das Erstellen der virtuellen Umgebung und den Aktivierungsbefehl. Ist der Name des Environment in Klammern am Kommandozeilenanfang, bedeutet das, diese ist jetzt aktiv.

\begin{figure}[!h]
\centering
\includegraphics[width=0.7\textwidth]{figures/virt-env-terminal}
\caption{Erstellen der virtuelle Umgebung im Terminal}
\caption{Erstellen der virtuelle Umgebung im Terminal.}
\hfill
\end{figure}

Um die Pakete und Module kollisionsfrei zu installieren ist es empfehlenswert einen Package-Manager zu verwenden. Mit pip, \glqq rekursives Akronym für pip Install Packages" (vgl. [Wei17, K. 23.1]), können diese installiert, geupdated und gelöscht werden. Au"serdem kann der Manager Abhängigkeiten, wenn nötig, überschreiben und optimieren. Falls ein, sich von der neuesten Version unterscheidendes, Programm installiert werden soll, so ist dies ebenso möglich.
Um die Pakete und Module kollisionsfrei zu installieren ist es empfehlenswert einen Package-Manager zu verwenden. Mit \textit{pip}\footnote{ pip ist das rekursive Akronym für pip Install Packages. } (vgl. [Wei17, K. 23.1]), können diese installiert, geupdated und gelöscht werden. Au"serdem kann der Manager Abhängigkeiten, wenn nötig, überschreiben und optimieren. Falls ein, sich von der neuesten Version unterscheidendes, Programm installiert werden soll, so ist dies ebenso möglich.

\subsection{Lightweight Directory Access Protocol}

Das ldap, Lightweight Directory Access Protocol, muss als Erweiterung in die hier bearbeitende Bachelor-Arbeit eingebunden werden, um später die Login-Daten im Hochschulinternen Netz abfragen zu können. Dies ist ein Internetprotokoll, welches die Kommunikation mit dem Active Directory verwaltet. Es wird eingesetzt um Benutzer so schnell und effizient wie möglich durch eine bereits existierende Datenbank abzufragen und zu authentifizieren. Der Aufbau ist mit einem Baum zu vergleichen (vgl. Abbildung 2.4.). Die Wurzel besteht aus sehr allgemeinen Informationen, umso näher man den Blättern kommt, umso spezifischer werden diese. Ein Objekt in der Struktur wird durch einen einmaligen Namen identifiziert, der aus den gesamten hinterlegten Informationen besteht. Der Name für den in der Abbildung 2.4 dargestellten Baum wäre \glqq cn=John Doe, ou=People, dc=sun.com\grqq (vgl. [Sch17]).
Das ldap, Lightweight Directory Access Protocol, muss als Erweiterung in die hier bearbeitende Bachelor-Arbeit eingebunden werden, um später die Login-Daten im Hochschulinternen Netz abfragen zu können. Dies ist ein Internetprotokoll, welches die Kommunikation mit dem Active Directory verwaltet. Es wird eingesetzt um Benutzer so schnell und effizient wie möglich durch eine bereits existierende Datenbank abzufragen und zu authentifizieren. Der Aufbau ist mit einem Baum zu vergleichen (vgl. Abbildung 2.4.). Die Wurzel besteht aus sehr allgemeinen Informationen, umso näher man den Blättern kommt, umso spezifischer werden diese. Ein Objekt in der Struktur wird durch einen einmaligen Namen identifiziert, der aus den gesamten hinterlegten Informationen besteht. Der Name für den in der Abbildung 2.4 dargestellten Baum wäre \texttt{cn=John Doe, ou=People, dc=sun.com} (vgl. [Sch17]).

\begin{figure}[!h]
\centering
\includegraphics[width=0.5\textwidth]{figures/ldap-tree}
\caption{Beispiel eines LDAP-Trees [Orc10]}
\caption{Beispiel eines LDAP-Trees [Orc10].}
\hfill
\end{figure}

\subsection{Sicherheit}
Beim Implementieren einer Website ist das Absichern vor schädlichen Attacken heutzutage unabdingbar. Django aktiviert einige Funktionen zum Schutz bereits beim Projektstart automatisch. Dazu gehört das Abwehren von \textit{Cross-Site-Scripting}, \textit{SQL-Injektion}, \textit{Clickjacking} und die Sicherstellung der \textit{Session-Security}.
Beim Implementieren einer Website ist das Absichern vor schädlichen Attacken heutzutage unabdingbar. Django aktiviert einige Funktionen zum Schutz bereits beim Projektstart automatisch. Dazu gehört das Abwehren von \textit{Cross-Site-Scripting}\footnote{ Cross-Site-Scripting kann Webseiten verändern oder Passwörter abgreifen.}
, \textit{SQL-Injektion}\footnote{ SQL-Injection nutzt mangelnde Überprüfung von Metazeichen um Datenbankabfragen zu verändern.}
, \textit{Clickjacking}\footnote{ Clickjacking ist eine Überlagerung von Internetseiten um Klicks zu manipulieren.}
und die Sicherstellung der \textit{Session-Security}\footnote{ Session-Security setzen Cookies auch für Subdomäne beim Client. }
.

Sollen die Formulare des Prototypen gegen \textit{Cross-Site-Request-Forgery} geschützt werden, muss aktiv ein \textit{Token} im Template gesetzt werden.

Ein solcher Angriff tritt auf wenn über einen bösartigen Link, eine Formularschaltfläche oder einfach dem eingebettetem JavaScript-Code die Daten im Server verändert werden sollen. Hierbei nutzt der Angreifer die Rechte eines eingeloggten Benutzers und kann somit Informationen im Back-end verfälschen. Um dies zu verhindern wird im Template des Prototypen, zwischen den Form-Tags der \textit{crsf-Token} eingefügt. Der Token setzt einen Cookie mit einer verschlüsselten Zufallszahl. Das Gleiche passiert im Template, wo ein, für den Benutzer nicht sichtbares, Form-Feld die gleiche verschlüsselte Zufallszahl erhält. Beide Zahlen erhalten zudem einen \textit{Salt}, ein generierter Zusatzwert, der das entschlüsseln dieser um ein vielfaches erschwert. Wird ein Request gesendet, vergleicht eine von Django initzialisierte \textit{Middleware} beide Zahlen. Sind diese nicht gleich, hat ein Dritter also die Informationen manipuliert, wird der 403 HTTP-Standart-Statuscode gesendet, welcher besagt, dass der Server eine Anfrage erhalten hat, diese aber nicht erfüllen wird.
Der \textit{crsf-Token} greift nur wenn der POST-Request innerhalb der eigenen Website gesendet wird und nicht über URLs, die au"serhalb des Frameworks liegen (vgl. [Fou18a]).
Ein solcher Angriff tritt auf wenn über einen bösartigen Link, eine Formularschaltfläche oder einfach dem eingebettetem JavaScript-Code die Daten im Server verändert werden sollen. Hierbei nutzt der Angreifer die Rechte eines eingeloggten Benutzers und kann somit Informationen im Back-end verfälschen. Um dies zu verhindern wird im Template des Prototypen, zwischen den Form-Tags der \textit{crsf-Token}\footnote{ Token sind Komponente die eine Zugriffskontrolle von Benutzer druchführen können.}
eingefügt. Der Token setzt einen Cookie mit einer verschlüsselten Zufallszahl. Das Gleiche passiert im Template, wo ein, für den Benutzer nicht sichtbares, Form-Feld die gleiche verschlüsselte Zufallszahl erhält. Beide Zahlen erhalten zudem einen \textit{Salt}, ein generierter Zusatzwert, der das entschlüsseln dieser um ein vielfaches erschwert. Wird ein Request gesendet, vergleicht eine von Django initzialisierte \textit{Middleware}\footnote{ Middleware ist ein Plug-in, dass Anfrage- und Antwortverarbeitung durchführt.} beide Zahlen. Sind diese nicht gleich, hat also ein Dritter die Informationen manipuliert, wird der 403 HTTP-Standart-Statuscode gesendet, welcher besagt, dass der Server eine Anfrage erhalten hat, diese aber nicht erfüllen wird.
Der \texttt{crsf-Token} greift nur wenn der POST-Request innerhalb der eigenen Website gesendet wird und nicht über URLs, die au"serhalb des Frameworks liegen (vgl. [Fou18a]).

\section {Erweiterungen}
Django bringt viele hilfreiche Erweiterungen mit sich, die mit einem Packagemanager einfach in die virtuelle Umgebung geladen werden können. Um das passende Add-on für ein Projekt zu finden, bietet die Plattform djangopackages.org alle Erweiterungen in übersichtlichen Tabellen mit Eigenschaften und Bewertung an. Eine Vielzahl an Bibliotheken wurden für diese Arbeit getestet, aber wegen mangelnder Kompatibilität oder Funktionalität als nicht hilfreich erachtet und werden deshalb hier nicht weiter erwähnt.
Die im Folgenden aufgeführten Bibliotheken sind im Prototyp zur Anwendung gelangt.

\subsection {Taggable-Manager}
Django-taggit ist eine Erweiterung, die das Verwenden von Tags vereinfacht. 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.
Um die Artikel besser priorisieren und Informationsflut für Benutzer reduzieren zu können, wird im Prototyp mit Schlagwörtern gearbeitet. Django-taggit ist eine Erweiterung, die das Verwenden von Tags vereinfacht. 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 \texttt{app\_label} und \texttt{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 (vgl. [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"serdem ist es möglich Primary-Keys zu verwenden, die nicht aus ganzen Zahlen bestehen, sondern aus Buchstaben und Wörtern.
Der Taggable-Manager ist jedoch nicht an das Contenttype-Framework gebunden (vgl. [Her16]). Durch die Verwendung eines echten Fremdschlüssels, kann zum Beispiel die Performance und Referenzgarantie verwirklicht werden. Dazu ist lediglich die Erstellung einer eigenen \textit{Lookup-Tabelle}\footnote{ Eine Lookup-Tabelle speichert Daten statisch im Verhältnis zueinander.} 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 der Zugriff auf diese einheitlich geschieht. Au"serdem 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 (vgl. [Gay10]):
\\
@@ -99,28 +102,29 @@ Um django-taggit zu installieren wird der folgende Befehl in die Kommandozeile e
\texttt{\$ pip install django-taggit }
\\
\end{addmargin}
Im model.py wird das Feld tag neu erstellt und als Taggable Manager definiert.
Au"serdem muss taggit in der settings.py unter \texttt{INSTALLED\_APPS} ergänzt werden. Um dem Programm mitzuteilen, dass nun eine neue Liste der Datenbank hinzugefügt werden muss, werden über die Kommandozeile Migrations-Befehle ausgeführt, die im Kapitel Datenmodellierung genauer beschreiben werden.
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 \texttt{TAGGIT\_CASE\_INSENSITIVE} in der settings.py auf True gestellt wird.
Im ˜\texttt{model.py} wird das Feld \texttt{tag} neu erstellt und als Taggable Manager definiert.
Au"serdem muss taggit in der \texttt{settings.py} unter \texttt{INSTALLED\_APPS} ergänzt werden. Um dem Programm mitzuteilen, dass nun eine neue Liste der Datenbank hinzugefügt werden muss, werden über die Kommandozeile Migrations-Befehle ausgeführt, die im Kapitel Datenmodellierung genauer beschreiben werden.
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ä"sig unterscheidet der Taggable Manager zwischen Groß- und Kleinschreibung, Tags sind also case sensitive.

\subsection {Hilfsbibliotheken}
---warum habe ich diese bibs gealden (beschreibung evtl in prototyp)
Weitere Add-ons werden geladen um kleinere Funktionen der Website einfach umsetzen zu können. Zu diesen gehört \texttt{django-taggit-templatetags}, welches durch die Einbindung im HTML-File die Tags der Applikation als Liste ausgibt. Au"serdem lassen sich die eingepflegten Tags als Cloud visualisieren. Kommen bestimmte Tags öfters vor als andere, so werden sie entsprechend grö"ser dargestellt.
Weitere Add-ons werden geladen um kleinere Funktionen der Website einfach umsetzen zu können. Zu diesen gehört \texttt{django-taggit-templatetags}, welches durch die Einbindung im HTML-File die Tags der Applikation als Liste ausgibt. Au"serdem lassen sich die eingepflegten Tags als Cloud visualisieren. Kommen bestimmte Schlagwörter öfters vor als andere, so werden sie entsprechend grö"ser dargestellt.

Django-hitcount dient zum zählen der Besucher einer Seite (vgl. [Tim15]). Dies lässt sich auf drei verschiedene Arten in die Applikation einbinden. Der schnellste Weg ist die Darstellung der Besuche mit Hilfe eines Template Tags im HTML-File. Möchte man die Anzeige aber individueller gestalten so kann durch das integrieren der \texttt{HitCountDetailView} in views.py die Variable \texttt{hitcount} verwenden und im Frontend ausgeben. Eine weiter Möglichkeit ist das Erweitern oder neu Erstellen eines Models im Django Backend. Von dort kann auf das neue Feld im Django-Admin-Backend zugegriffen werden, ebenso wie in der View und im Template. Die im Add-on integrierten Einstellungen, die in der settings.py ergänzt werden müssen, ermöglichen unter Anderem das begrenzen der Lebensdauer des Zählers, bevor dieser zurück gesetzt wird.
\texttt{Django-hitcount} dient zum zählen der Besucher einer Seite (vgl. [Tim15]). Dies lässt sich auf drei verschiedene Arten in die Applikation einbinden. Der schnellste Weg ist die Darstellung der Besuche mit Hilfe eines Template Tags im HTML-File. Möchte man die Anzeige aber individueller gestalten so kann durch das integrieren der \texttt{HitCountDetailView} in \texttt{views.py} die Variable \texttt{hitcount} verwenden und im Frontend ausgeben. Eine weiter Möglichkeit ist das Erweitern oder neu Erstellen eines Models im Django Backend. Von dort kann auf das neue Feld im Django-Admin-Backend zugegriffen werden, ebenso wie in der View und im Template. Die im Add-on integrierten Einstellungen, die in der \texttt{settings.py} ergänzt werden müssen, ermöglichen unter Anderem das begrenzen der Lebensdauer des Zählers, bevor dieser zurück gesetzt wird.

Um das Versenden und Verwalten von E-Mails in Django zu realisieren eignet sich \texttt{django-post-office} (vgl. [Ong18]). Nach der Installation kann im Admin-Backend ein E-Mail-Templates angelegt werden, Anhänge verwaltet und das Senden dieser im Log überprüft werden. Die Benachrichtigungen können asynchron versendet werden mit einem integrierten Planungsmanager. Der Inhalt kann Text oder HTML-basiert sein und in mehreren Sprachen hinterlegt werden.
Um das Versenden und Verwalten von E-Mails in Django zu realisieren eignet sich \texttt{django-post-office} (vgl. [Ong18]). Nach der Installation kann im Admin-Backend ein E-Mail-Templates angelegt, Anhänge verwaltet und das Senden dieser im Log überprüft werden. Es ist möglich die Benachrichtigungen asynchron zu versenden mit Hilfe eines Shell-Skript des Frameworks \texttt{Cron}\footnote{ Cron dient zur zeitbasierten Ausführung von definierten Aufgaben.}. Der Inhalt kann Text oder HTML-basiert sein und in mehreren Sprachen hinterlegt werden.


\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 (vgl. [Ott11]). Die Open-Source-Bibliothek, die auf GitHub abrufbar ist, wird seitdem von vielen 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 (vgl. [Ott12]).
Um die Usability des Prototyps zu erhöhen, wird das Framework Bootstrap eingebunden.

Eine umfangreiche Website einheitlich zu gestalten ist oft sehr komplex und zeitaufwendig. Die Entwickler von Twitter haben deshalb an einem neuen Verwaltungswerkzeug gearbeitet, das mehrere Bibliotheken zusammenführen sollte (vgl. [Ott11]). Die Open-Source-Bibliothek, die auf GitHub abrufbar ist, wird seitdem von vielen Programmierern weiterentwickelt und ist somit stark gewachsen. Version 2.0 verfügt über die Fähigkeit Websites \textit{responsiv}\footnote{ Responsive Webseiten sind auf allen Endgeräten angepasst darstellbar.} auf verschiedenste mobile Endgeräte anzupassen (vgl. [Ott12]).

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). Das bedeutet, dass Media-Queries oder ähnliche Methoden nicht mehr nötig sind, nicht nur um eine Website mobilfähig zu machen, sondern auch kompatibel für die verschiedensten Browser (vgl. [Boo12]).
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.). Das bedeutet, dass \textit{Media-Queries}\footnote{ Media-Qeries setzen statische Umbrüche um Layouts verschiedener Endgeräte anzupassen.} oder ähnliche Methoden nicht mehr nötig sind, nicht nur um eine Website mobilfähig zu machen, sondern auch kompatibel für die verschiedensten Browser (vgl. [Boo12]).

\begin{figure}[!h]
\centering
\includegraphics[width=1\textwidth]{figures/bootstrap-head-tag}
\caption{Einbindung von Bootstrap in einer HTML-Datei}
\caption{Einbindung von Bootstrap in einer HTML-Datei.}
\hfill
\end{figure}

@@ -133,5 +137,5 @@ Durch das Einbinden von Bootstrap in einer HTML-Datei werden einige Styles berei
\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.
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.


+ 1
- 1
doc/bachelorarbeit_EstherKleinhenz/chapters/prototyp.tex View File

@@ -33,7 +33,7 @@ Um einen Einblick in den Aufbau eines Django-Projektes zu erlangen wird dies im
\subsection{Datenmodellierung}
Die Struktur der bereits bestehenden Datenbank im Django-Framework und die Erweiterungen dessen werden genauer erläutert. Zunächst wird auf die Ergänzung des bestehenden \texttt{UserModel} eingegangen, nachdem veranschaulicht der Abschnitt das \texttt{PostModel} und abschlie"send werden die Zusammenhänge dieser dargestellt.

Alle Modelle werden als Django-Modelle deklariert um beim kompilieren des Codes dem Compiler mitzuteilen, dass eine Integration stattfinden muss (vgl. [Dja18]). Mit der folgenden Eingabe
Alle Modelle werden als Django-Modelle deklariert um beim kompilieren des Codes dem Compiler mitzuteilen, dass eine Integration stattfinden muss (vgl. [Dja18a]). Mit der folgenden Eingabe
\\
\begin{addmargin}[0pt]{0pt}
\noindent\hspace*{10mm}%

+ 9
- 2
doc/bachelorarbeit_EstherKleinhenz/references/References_2.bib View File

@@ -70,12 +70,12 @@
@article{Ong,
author = "Selwin Ong",
title = "django-post\_office git Repository",
title = "Django Request-Response Cycle",
year = "2018",
note = "https://github.com/ui/django-post\_office/blob/master/AUTHORS.rst"
}
@article{Ong,
@article{Nevius,
author = "Ryan Nevius",
title = "django-post\_office git Repository",
year = "2015",
@@ -194,3 +194,10 @@
note = "https://www.textbroker.de/tagging"
}
@article{Djangogirls-2,
author = "Djangogirls",
title = "Was passiert, wenn jemand eine Webseite beim Server anfordert?",
year = "2018",
note = "https://tutorial.djangogirls.org/de/django/"
}

Loading…
Cancel
Save