[PYTHON] Testgetriebene Entwicklung mit Django Teil 3

Testgetriebene Entwicklung mit Django Teil 3

Dies ist eine Lernnotiz zum Verständnis von Test Driven Development (TDD) in Django.

Referenzen sind [** Testgetriebene Entwicklung mit Python: Befolgen Sie die Testziege: Verwenden von Django, Selen und JavaScript (englische Ausgabe) 2. Ausgabe **](https://www.amazon.co.jp/dp/B074HXXXLS Wir werden mit dem Lernen basierend auf / ref = dp-kindle-redirect? _ Encoding = UTF8 & btkr = 1) fortfahren.

In diesem Buch führen wir Funktionstests mit der Django 1.1-Serie und FireFox durch. Dieses Mal werden wir jedoch Funktionstests mit der Djagno 3-Serie und Google Chrome durchführen. Ich habe auch einige persönliche Änderungen vorgenommen (z. B. das Ändern des Projektnamens in Config), aber es gibt keine wesentlichen Änderungen.

⇒⇒ Klicken Sie hier für Teil 1 - Kapitel 1 ⇒⇒ Klicken Sie hier für Teil 2 - Kapitel 2

Part1. The Basics of TDD and Django

Capter3. Testing as Simple Home Page with Unit Tests

In Kapitel 2 haben wir einen Funktionstest mit unittest.TestCase geschrieben und getestet, ob der Seitentitel ein" To-Do "enthält. Dieses Mal starten wir die Anwendung und führen TDD durch.

Our First Django App, and Our First Unit Test

Django besteht darin, mehrere Anwendungen unter einem Projekt zu erstellen. Lassen Sie uns sofort eine Django-Anwendung erstellen. Hier erstellen wir eine Anwendung mit dem Namen ** Listen **.

$ python manage.py startapp lists

Unit Tests, and How They Differ from Functional Tests

Funktionstests testen die Anwendung von außen (aus Sicht des Benutzers), um festzustellen, ob sie ordnungsgemäß funktioniert. Unit Tests testen, ob die Anwendung von innen funktioniert (aus Sicht des Entwicklers). TDD ist erforderlich, um Funktionstests und Komponententests abzudecken, und das Entwicklungsverfahren ist wie folgt.

** Schritt 1. ** Schreiben Sie einen Funktionstest (Erläuterung neuer Funktionen aus Sicht des Benutzers).

** Schritt 2. ** Wenn der Funktionstest fehlschlägt, überlegen Sie, wie Sie den Code schreiben, um den Test zu bestehen (schreiben Sie ihn nicht plötzlich). Fügen Sie einen Komponententest hinzu, um zu definieren, wie sich Ihr Code verhalten soll.

** Schritt 3. ** Wenn der Komponententest fehlschlägt, schreiben Sie den Mindestanwendungscode, den der Komponententest bestehen wird.

** Schritt 4. ** Wiederholen Sie Schritt 2 und Schritt 3, um schließlich zu überprüfen, ob der Funktionstest bestanden wurde.

Unit Testing in Django

Ich werde den Test der Ansicht der Homepage in lists / tests.py schreiben. Lassen Sie uns zuerst hier überprüfen.

# lists/tests.py

from django.test import TestCase

# Create your tests here.

Als ich mir das ansah, stellte ich fest, dass ich mit der von Django bereitgestellten TestCase-Klasse einen Komponententest schreiben konnte. djagno.test.TestCase ist eine Erweiterung des im Funktionstest verwendeten Standardmoduls unittest.TestCase. Ich werde einen Unit-Test als Test schreiben.

# lists/tests.py

from django.test import TestCase


class SmokeTest(TestCase):

    def test_bad_maths(self):
        self.assertEqual(1 + 1, 3)

Django verfügt über eine Testrunner-Funktion, die Tests für jede Anwendung sucht und ausführt. Beginnen wir mit Djangos Testläufer.

$ python manage.py test

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F
======================================================================
FAIL: test_bad_maths (lists.tests.SmokeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\--your_pass--\django-TDD\lists\tests.py", line 9, in test_bad_maths
    self.assertEqual(1 + 1, 3)
AssertionError: 2 != 3

----------------------------------------------------------------------
Ran 1 test in 0.005s

FAILED (failures=1)
Destroying test database for alias 'default'...

Ich konnte bestätigen, dass listen / tests.py ausgeführt wurde und fehlgeschlagen ist. Ich werde hier festlegen.

$ git status
$ git add lists
$ git commit -m "Add app for lists, with deliberately failing unit test"

Django's MVC, URLs, and View Functions

Django muss definieren, was mit einer bestimmten URL geschehen soll. Der Django-Workflow sieht folgendermaßen aus:

  1. HTTP / Anfrage kommt zu einer bestimmten URL

  2. Da die Regel festgelegt wurde, welche Ansicht für HTTP / Anforderung ausgeführt werden soll, führen Sie die Ansicht gemäß der Regel aus.

  3. View verarbeitet die Anforderung und gibt HTTP / Antwort zurück.

Daher haben wir zwei Dinge zu tun:

  1. Ist es möglich, die URL zwischen URL und Ansicht aufzulösen?

  2. Kann View den HTML-Code ändern, der den Funktionstest bestehen kann?

Öffnen wir nun lists / tests.py und schreiben einen kleinen Test.

# lists/tests.py

from django.urls import resolve  #hinzufügen
from django.test import TestCase
from lists.views import home_page  #hinzufügen

class HomePageTest(TestCase):

    def test_root_url_resolve_to_home_page_view(self):
        found = resolve('/')
        self.assertEqual(found.func, home_page)

django.urls.resolve ist ein Modul zum Auflösen von URLs, die intern von django verwendet werden. from lists.views import home_page ist die Ansicht, die als nächstes beschrieben wird. Sie können sehen, dass dies unten beschrieben wird. Lass es uns testen.

$ python manage.py test

System check identified no issues (0 silenced).
E
======================================================================
ERROR: lists.tests (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: lists.tests
Traceback (most recent call last):
  File "C:\--your_user_name--\AppData\Local\Programs\Python\Python37\lib\unittest\loader.py", line 436, in _find_test_path
    module = self._get_module_from_name(name)
  File "C:\--your_user_name--\AppData\Local\Programs\Python\Python37\lib\unittest\loader.py", line 377, in _get_module_from_name
    __import__(name)
  File "C:\--your_path--\django-TDD\lists\tests.py", line 5, in <module>
    from lists.views import home_page
ImportError: cannot import name 'home_page' from 'lists.views' (C:\Users\--your_path--\django-TDD\lists\views.py)


----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

ImportError ist erschienen. Wenn ich mir den Inhalt anschaue, erfahre ich, dass home_page nicht aus lists.views importiert werden kann. Schreiben wir nun home_page in lists.views.

# lists/views.py

from django.shortcuts import render

home_page = None

Es klingt wie ein Witz, aber dies sollte den "ImportError" lösen. Denken Sie daran, dass TDD Lust hat, den kleinsten Code zu schreiben, um einen Fehler zu beheben.

Lassen Sie es uns noch einmal testen.

$ python manage.py test

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
E
======================================================================
ERROR: test_root_url_resolve_to_home_page_view (lists.tests.SmokeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\--your_path--\django-TDD\lists\tests.py", line 10, in test_root_url_resolve_to_home_page_view
    found = resolve('/')
  File "C:\--your_path--\django-TDD\venv-tdd\lib\site-packages\django\urls\base.py", line 25, in resolve
    return get_resolver(urlconf).resolve(path)
  File "C:\--your_path--\django-TDD\venv-tdd\lib\site-packages\django\urls\resolvers.py", line 575, in resolve
    raise Resolver404({'tried': tried, 'path': new_path})
django.urls.exceptions.Resolver404: {'tried': [[<URLResolver <URLPattern list> (admin:admin) 'admin/'>]], 'path': ''}

----------------------------------------------------------------------
Ran 1 test in 0.005s

FAILED (errors=1)
Destroying test database for alias 'default'...

Sicher, der "ImportError" wurde behoben, aber der Test schlug erneut fehl. Wenn Sie Traceback aktivieren, können Sie sehen, dass Django einen 404-Fehler zurückgibt, selbst wenn "Auflösen" / "" behoben wird. Dies bedeutet, dass Django "/" nicht auflösen konnte.

urls.py

Django hat urls.py, das URLs Ansichten zuordnet. config / urls.py ist die Haupt-urls.py. Lassen Sie uns hier überprüfen.

# config/urls.py

"""config URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

Wenn Sie den Inhalt überprüfen, erfahren Sie, wie Sie eine URL-Zuordnung mit dem Namen "config URL Configuration" schreiben. Lesen Sie sie daher. Dieses Mal fügen wir die Zuordnung zwischen "/" und "home_page" zu "urlpatterns" hinzu, indem wir Funciton-Ansichten schreiben. Außerdem habe ich "admin /" noch nicht verwendet, also kommentiere es aus.

# config/urls.py

from django.contrib import admin
from django.urls import path
from lists import views


urlpatterns = [
    # path('admin/', admin.site.urls),  #Auskommentieren
    path('', views.home_page, name='home')
]

Das Mapping ist abgeschlossen. Mach einen Test.

$ python manage.py test
[...]
TypeError: view must be a callable or a list/tuple in the case of include().

Ich habe die URL-Zuordnung hinzugefügt, damit der "404-Fehler" behoben wurde, aber ich habe einen "TypeError" erhalten. Es scheint, dass dies daran liegt, dass beim Aufrufen von "home_page" aus "lists.view" nichts mit "home_page = None" zurückgegeben wird. Lassen Sie uns dies beheben, indem Sie lists / views.py bearbeiten.

# lists/views.py

from django.shortcuts import render

def home_page():
    pass

Ich werde es testen.

$ python manage.py test

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.003s

OK
Destroying test database for alias 'default'...

Ich konnte den Unit Test bestehen. Ich werde hier festlegen.

$ git add .
$ git status
$ git commit -m "First unit test and url mapping, dummy view"

Wir werden list / tests.py neu schreiben, damit wir testen können, ob die aktuelle list / views.py tatsächlich HTML zurückgibt.

# lists/tests.py

from django.urls import resolve
from django.test import TestCase
from django.http import HttpRequest

from lists.views import home_page


class HomePageTest(TestCase):

    def test_root_url_resolve_to_home_page_view(self):
        found = resolve('/')
        self.assertEqual(found.func, home_page)

    def test_home_page_returns_current_html(self):  #hinzufügen
        request = HttpRequest()
        response = home_page(request)
        html = response.content.decode('utf8')
        self.assertTrue(html.startswith.('<html>'))
        self.assertIn('<title>To-Do lists</title>', html)
        self.assertTrue(html.endwith('</html>'))

test_root_url_resolve_to_home_page_view prüft, ob die URL-Zuordnung korrekt ist. Ich überprüfe, ob der richtige HTML-Code mit test_home_page_returns_current_html zurückgegeben werden kann. Wir haben einen neuen Komponententest hinzugefügt. Testen wir ihn also sofort.

$ python manage.py test

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
E.
======================================================================
ERROR: test_home_page_returns_current_html (lists.tests.SmokeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\--your_path--\django-TDD\lists\tests.py", line 18, in test_home_page_returns_current_html
    response = home_page(request)
TypeError: home_page() takes 0 positional arguments but 1 was given

----------------------------------------------------------------------
Ran 2 tests in 0.005s

FAILED (errors=1)
Destroying test database for alias 'default'...

Ich habe einen TypeError. Wenn ich den Inhalt überprüfe, heißt es, dass "home_page () 0 Positionsargumente akzeptiert, aber 1 angegeben wurde". Sie können sehen, dass die Definition von "home_page ()" keine Argumente angibt ("0 Positionsargumente"), aber es ist seltsam mit den angegebenen Argumenten ("1 wurde angegeben").

Daher möchte ich listen / views.py neu schreiben.

# lists/views.py

from django.shortcuts import render


def home_page(request):  #Veränderung
    pass

Das Argument request wurde zur Funktion home_page () hinzugefügt. Lassen Sie uns damit testen.

$ python manage.py test

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
E.
======================================================================
ERROR: test_home_page_returns_current_html (lists.tests.SmokeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\--your_path--\django-TDD\lists\tests.py", line 19, in test_home_page_returns_current_html
    html = response.content.decode('utf8')
AttributeError: 'NoneType' object has no attribute 'content'

----------------------------------------------------------------------
Ran 2 tests in 0.005s

FAILED (errors=1)
Destroying test database for alias 'default'...

Der TypeError wurde behoben, aber das nächste Mal bekomme ich einenAttributeError. Da "NoneType" -Objekt kein Attribut "content" hat, scheint die Ursache darin zu liegen, dass der Rückgabewert von "home_page (request)" "None" ist. Ändern Sie list / views.py.

# lists/views.py

from django.shortcuts import render
from django.http import HttpResponse  #hinzufügen


def home_page(request):
    return HttpResponse()

Es wurde ein Fehler behoben, der "django.http.HttpResponse" zurückgab. Lass es uns testen.

$ python manage.py test

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F.
======================================================================
FAIL: test_home_page_returns_current_html (lists.tests.SmokeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\--your_path--\django-TDD\lists\tests.py", line 20, in test_home_page_returns_current_html
    self.assertTrue(html.startswith('<html>'))
AssertionError: False is not true

----------------------------------------------------------------------
Ran 2 tests in 0.005s

FAILED (failures=1)
Destroying test database for alias 'default'...

Der AttributeError wurde behoben und ein AssertionError ist aufgetreten. Sie können sehen, dass die Meldung "Falsch ist nicht sicher" angezeigt wird, weil "html.startwith (" ")" "Falsch" ist. Ändern Sie list / views.py.

# lists/views.py

from django.shortcuts import render
from django.http import HttpResponse


def home_page(request):
    return HttpResponse('<html>')  #Veränderung
$ python manage.py test

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F.
======================================================================
FAIL: test_home_page_returns_current_html (lists.tests.SmokeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\--your_path--\django-TDD\lists\tests.py", line 21, in test_home_page_returns_current_html
    self.assertIn('<title>To-Do lists</title>', html)
AssertionError: '<title>To-Do lists</title>' not found in '<html>'

----------------------------------------------------------------------
Ran 2 tests in 0.005s

FAILED (failures=1)
Destroying test database for alias 'default'...

Es ist auch "AssertionError". Es wird gesagt, dass " To-Do-Listen </ title>" nicht gefunden werden können. Ändern Sie list / views.py.</p> <pre><code class="language-python"># lists/views.py from django.shortcuts import render from django.http import HttpResponse def home_page(request): return HttpResponse('<html><title>To-Do lists</title>') #Veränderung </code></pre> <pre><code class="language-sh">$ python manage.py test Creating test database for alias 'default'... System check identified no issues (0 silenced). F. ====================================================================== FAIL: test_home_page_returns_current_html (lists.tests.SmokeTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\--your_path--\django-TDD\lists\tests.py", line 22, in test_home_page_returns_current_html self.assertTrue(html.endswith('</html>')) AssertionError: False is not true ---------------------------------------------------------------------- Ran 2 tests in 0.013s FAILED (failures=1) Destroying test database for alias 'default'... </code></pre> <p>Es ist auch "AssertionError". Es wird gesagt, dass "</ html>" nicht gefunden werden kann. Ändern Sie list / views.py.</p> <pre><code class="language-python"># lists/views.py from django.shortcuts import render from django.http import HttpResponse def home_page(request): return HttpResponse('<html><title>To-Do lists</title></html>') #Veränderung </code></pre> <p>Das sollte endlich klappen.</p> <pre><code class="language-sh">$ python manage.py test Creating test database for alias 'default'... System check identified no issues (0 silenced). .. ---------------------------------------------------------------------- Ran 2 tests in 0.004s OK Destroying test database for alias 'default'... </code></pre> <p>Es ging gut. Nachdem der Komponententest bestanden wurde, starten wir den Entwicklungsserver und führen dann den Funktionstest aus.</p> <pre><code class="language-sh">#Starten Sie den Entwicklungsserver $ python manage.py runserver #Starten Sie ein weiteres cmd und führen Sie einen Funktionstest durch $ python functional_tests.py DevTools listening on ws://127.0.0.1:51108/devtools/browser/9d1c6c55-8391-491b-9b14-6130c3314bba F ====================================================================== FAIL: test_can_start_a_list_and_retrieve_it_later (__main__.NewVisitorTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "functional_tests.py", line 21, in test_can_start_a_list_and_retrieve_it_later self.fail('Finish the test!') AssertionError: Finish the test! ---------------------------------------------------------------------- Ran 1 test in 7.244s FAILED (failures=1) </code></pre> <p>Der Funktionstest ist fehlgeschlagen, da ich ".fail" in "unittest.TestCase" verwendet habe, um sicherzustellen, dass ein Fehler auftritt, auch wenn der Test erfolgreich ist. Daher können Sie sehen, dass der Funktionstest erfolgreich war!</p> <p>Lassen Sie uns begehen.</p> <pre><code class="language-sh">$ git add . $ git commit -m "Basic view now return minimal HTML" </code></pre> <h4>Kapitel 3 Zusammenfassung</h4> <p>Stellen Sie sicher, dass Sie es bisher abgedeckt haben.</p> <ul> <li> <p>Die Django-Anwendung wurde gestartet.</p> </li> <li> <p>Ich habe Djangos Unit Test Runner verwendet.</p> </li> <li> <p>Ich verstehe den Unterschied zwischen einem Funktionstest und einem Unit-Test.</p> </li> </ul> <p>--Erstellte eine Ansicht mit Djangos Anforderungs- und Antwortobjekten</p> <ul> <li>Zurückgegebenes grundlegendes HTML.</li> </ul> <p>Ich konnte den Prozess der Funktionserstellung durch Drehen des Komponententests und des Code-Additions- / Korrekturzyklus bestätigen.</p> <!-- ENDDDDDDDDDDDDDDDDDDDDDDDDDDDDD --> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- post_new_ui_horiz --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5469278205356604" data-ad-slot="4209814965" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <div style="margin-top: 30px;"> <div class="link-top" style="margin-top: 1px;"></div> <p> <font size="4">Recommended Posts</font> <!-- BEGIN LINK ************************* --> <div style="margin-top: 10px;"> <a href="/de/0057b55c8ba763bda6ca">Testgetriebene Entwicklung mit Django Teil 3</a> </div> <div style="margin-top: 10px;"> <a href="/de/148b42f070be478f6e23">Testgetriebene Entwicklung mit Django Teil 4</a> </div> <div style="margin-top: 10px;"> <a href="/de/25668d8d53f0c099388f">Testgetriebene Entwicklung mit Django Teil 6</a> </div> <div style="margin-top: 10px;"> <a href="/de/58dc509e8f681da73199">Testgetriebene Entwicklung mit Django Teil 2</a> </div> <div style="margin-top: 10px;"> <a href="/de/dd7abd24961250208c7c">Testgetriebene Entwicklung mit Django Teil 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/f431c13531ced5b3d2f3">Testgetriebene Entwicklung mit Django Teil 5</a> </div> <div style="margin-top: 10px;"> <a href="/de/52335515344b181bed31">Testgetriebenes Entwicklungsstart mit PySide & Pytest</a> </div> <div style="margin-top: 10px;"> <a href="/de/0e15f6c150caa13ca34c">Entwicklungsverdauung mit Django</a> </div> <div style="margin-top: 10px;"> <a href="/de/3b3265d745aef36f26ff">Django-Test</a> </div> <div style="margin-top: 10px;"> <a href="/de/ae41a2c1f49bb920cf58">[Test Driven Development (TDD)] Kapitel 21 Zusammenfassung</a> </div> <div style="margin-top: 10px;"> <a href="/de/96bedd0b9d9a0ed9b01b">App-Entwicklung mit SQLite mit Django (PTVS)</a> </div> <div style="margin-top: 10px;"> <a href="/de/218b4a4918cf4fb2079d">Django startete Teil 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/344666a0d77503b05b1b">Erleben Sie Teil I "Multinationale Währung" des Buches "Test Driven Development" mit Python</a> </div> <div style="margin-top: 10px;"> <a href="/de/4f59f154b7a4b111fe0d">Internationalisierung mit Django</a> </div> <div style="margin-top: 10px;"> <a href="/de/5a4495e4df24d395bec4">Django startete Teil 4</a> </div> <div style="margin-top: 10px;"> <a href="/de/ab7f0eeeaec0e60d6b92">CRUD mit Django</a> </div> <div style="margin-top: 10px;"> <a href="/de/d616a74f931babae4566">Erste Django-Entwicklung</a> </div> <div style="margin-top: 10px;"> <a href="/de/1ab36e3d5365e8ca2942">Erstellen Sie solche Testdaten mit Python (Teil 1)</a> </div> <div style="margin-top: 10px;"> <a href="/de/60bc24dba80688d5d03a">[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung</a> </div> <div style="margin-top: 10px;"> <a href="/de/932b14dee0ec2efbf1a7">Django Erste Schritte Teil 2 mit dem Eclipse Plugin (PyDev)</a> </div> <div style="margin-top: 10px;"> <a href="/de/943093d15db9a55e7b4c">Erstellen Sie mit der Doker Toolbox eine Django-Entwicklungsumgebung</a> </div> <div style="margin-top: 10px;"> <a href="/de/005109fa4d9ad9736eb1">Authentifizieren Sie Google mit Django</a> </div> <div style="margin-top: 10px;"> <a href="/de/03c5bd710221a8145dbf">Django 1.11 wurde mit Python3.6 gestartet</a> </div> <div style="margin-top: 10px;"> <a href="/de/03c6ddf42e6edd584a07">Primzahlbeurteilung mit Python</a> </div> <div style="margin-top: 10px;"> <a href="/de/06c52ecfd3c40cbbe522">Laden Sie Dateien mit Django hoch</a> </div> <div style="margin-top: 10px;"> <a href="/de/1613b2ac40caad14d62f">Mit Codetest stärken ⑦</a> </div> <div style="margin-top: 10px;"> <a href="/de/201d278ee52e81cf4eee">PDF mit Django ausgeben</a> </div> <div style="margin-top: 10px;"> <a href="/de/20c4b459b9fc52aef062">Mit Codetest stärken ⑨</a> </div> <div style="margin-top: 10px;"> <a href="/de/262590c2d1b727052aea"></a> </div> <div style="margin-top: 10px;"> <a href="/de/271b38ef2c6610f40929">Markdown-Ausgabe mit Django</a> </div> <div style="margin-top: 10px;"> <a href="/de/42d6029e8f8eec510118">Verwenden Sie Gentelella mit Django</a> </div> <div style="margin-top: 10px;"> <a href="/de/4c9edec8fbefb3116bf6">Twitter OAuth mit Django</a> </div> <div style="margin-top: 10px;"> <a href="/de/58052e820a384d6dcb47">Mit Codetest stärken ⑤</a> </div> <div style="margin-top: 10px;"> <a href="/de/5df4bde4435d9d0b2a1a">Mit Codetest stärken ④</a> </div> <div style="margin-top: 10px;"> <a href="/de/6e044550435796ef09c5">Erste Schritte mit Django 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/715cdd6c2830e2aca0f6">Primzahlbeurteilung mit Python</a> </div> <div style="margin-top: 10px;"> <a href="/de/82454eaedbf94273c4f1">Mail mit Django senden</a> </div> <div style="margin-top: 10px;"> <a href="/de/897221c051bd673471cb">Sandkasten mit neo4j Teil 10</a> </div> <div style="margin-top: 10px;"> <a href="/de/8da746e150d1e0947107">Webanwendung erstellt mit Python3.4 + Django (Teil.1 Umgebungskonstruktion)</a> </div> <div style="margin-top: 10px;"> <a href="/de/8f94095a1e58e2d5cb21">Datei-Upload mit Django</a> </div> <div style="margin-top: 10px;"> <a href="/de/9d3e3db6706dd69407c6">Mit Codetest stärken ②</a> </div> <div style="margin-top: 10px;"> <a href="/de/abaf2a920ce60339a87f">Verwenden Sie WENIGER mit Django</a> </div> <div style="margin-top: 10px;"> <a href="/de/b98ee1d1aa59fc12866e">Pooling mechanisieren mit Django</a> </div> <div style="margin-top: 10px;"> <a href="/de/c9dbc320a0e0e84093da">Verwenden Sie MySQL mit Django</a> </div> <div style="margin-top: 10px;"> <a href="/de/d14cc2b97ea595a13045">Mit Codetest stärken ①</a> </div> <div style="margin-top: 10px;"> <a href="/de/dde20a965e212ab449b2">Erstellen Sie eine Entwicklungsumgebung mit Poetry Django Docker Pycharm</a> </div> <div style="margin-top: 10px;"> <a href="/de/ecae39fe75b412d44e89">[Memo] Django-Entwicklungsumgebung</a> </div> <div style="margin-top: 10px;"> <a href="/de/ed64190a12a4498b9446">Artikel, die die Systementwicklung mit Django (Python) ermöglichen _Einführung</a> </div> <div style="margin-top: 10px;"> <a href="/de/edb561ceae1c4abdd16a">Django ab heute</a> </div> <div style="margin-top: 10px;"> <a href="/de/f696723ee7ac9c3796cd">Erste Schritte mit Django 2</a> </div> <div style="margin-top: 10px;"> <a href="/de/fbf614250f13b50dac7e">Mit Codetest stärken ⑧</a> </div> <div style="margin-top: 10px;"> <a href="/de/fdd86d6166533c1070ef">Mit Codetest stärken ⑨</a> </div> <div style="margin-top: 10px;"> <a href="/de/1665099685f9a05820ce">Tutorial für die testgetriebene Entwicklung (TDD) mit Flask-2-Dekorateuren</a> </div> <div style="margin-top: 10px;"> <a href="/de/242367a83c313a5e46bf">Erstellen Sie mit Docker eine Django-Entwicklungsumgebung! (Docker-compose / Django / postgreSQL / nginx)</a> </div> <div style="margin-top: 10px;"> <a href="/de/371881a6b8ecfa768606">[Memo] Erstellen Sie mit Docker eine Entwicklungsumgebung für Django + Nuxt.js</a> </div> <div style="margin-top: 10px;"> <a href="/de/82678e1cd59c925846b4">[Django] Erstellen Sie mit PyCharm schnell eine Entwicklungsumgebung für Django-Container (Docker)</a> </div> <div style="margin-top: 10px;"> <a href="/de/8b55d1e134f29b8a8dcd">Erstellen Sie mit Django eine Bulletin-Board-App von Grund auf neu. (Teil 2)</a> </div> <!-- END LINK ************************* --> </p> </div> </div> </div> <div class="footer text-center" style="margin-top: 40px;"> <!-- <p> Licensed under cc by-sa 3.0 with attribution required. </p> --> </div> <script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js"></script> <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.1.2/build/highlight.min.js"></script> <script> $(document).ready(function() { var cfg_post_height = 60; var cfg_per = 0.51; var ads_obj = $('<ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-5469278205356604" data-ad-slot="7950405964"></ins>'); $('pre code').each(function(i, e) {hljs.highlightBlock(e)}); function getDocumentOffsetPosition( el ) { var _x = 0; var _y = 0; while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) { _x += el.offsetLeft - el.scrollLeft; _y += el.offsetTop - el.scrollTop; el = el.offsetParent; } return { top: _y, left: _x }; } if ( $( "#article202011" ).length ) { var h1_pos = getDocumentOffsetPosition($('h1')[0]); var footer_pos = getDocumentOffsetPosition($('.link-top')[0]); var post_distance = footer_pos.top - h1_pos.top; // console.log('h1_pos: '+ h1_pos.top); // console.log(cfg_post_height) if((post_distance/h1_pos.top)>=cfg_post_height) { // console.log('tesssssssssssssssssssssssssssssssss'); $( ".container p" ).each(function( index ) { var p_tag_pos = $(this).position().top; var dis = p_tag_pos - h1_pos.top; var per = dis/post_distance; if(per>cfg_per) { ads_obj.insertAfter($(this)); (adsbygoogle = window.adsbygoogle || []).push({}); console.log( index + ": " + $( this ).text() ); return false; } }); } } }); </script> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <!-- ads --> <script data-ad-client="ca-pub-5469278205356604" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" type="d7540fe192d881abe59fcf57-text/javascript"></script> <!-- end ads --> </body> </html>