So erstellen Sie ein Projekt mit Django

Nachdem wir nun wissen, wie man virtuelle Umgebungen erstellt und pip verwendet, können wir mit dem Aufbau unseres Projekts beginnen. In diesem Artikel erstellen wir unser erstes Django-Projekt, schreiben Tests und starten unseren Entwicklungsserver.

Erstellen der virtuellen Umgebung

Lassen Sie uns zunächst eine neue virtuelle Umgebung für dieses Projekt erstellen. (Wenn Sie dies noch nicht getan haben, deaktivieren Sie die vorherige virtuelle Umgebung, indem Sie deactivatedas Terminal eingeben .) Weitere Informationen zu virtuellen Umgebungen und deren Verwendung finden Sie auf dieser Seite.

Navigieren Sie zu dem Verzeichnis, in dem Sie das Django-Projekt möchten, und geben Sie Folgendes in das Terminal ein:

mkvirtualenv taskplanner --python=/usr/bin/python3

Möglicherweise müssen Sie Ihren Python-Pfad ändern, wenn er anders aussieht als der oben beschriebene.

Die Befehlszeilen-Shell sollte nun wie folgt aussehen und anzeigen, dass Sie sich in einer virtuellen Umgebung befinden.

(taskplanner)[email protected] ~/workspace] $

Wenn es nicht so aussieht, geben Sie einfach Folgendes ein:

workon taskplanner

Wir können jetzt Django installieren:

pip install Django

Erstellen Sie unser Django-Projekt

Mit Django können wir unser Projekt erstellen:

django-admin.py startproject taskplanner

Navigieren Sie als Nächstes in unser neues Projekt, indem Sie Folgendes eingeben:

cd taskplanner

Bevor wir etwas unternehmen, legen wir dieses Verzeichnis mit virtualenvwrapper als Arbeitsverzeichnis fest:

setvirtualenvproject

Nebenbemerkung : Geben Sievirtualenvwrapperin Ihr Terminal ein, umeine Liste der virtualenvwrapper-Befehle anzuzeigen.

Wenn wir uns jetzt in unserer virtuellen Umgebung befinden, können wir eingeben cdproject, um direkt zu unserem Arbeitsverzeichnis zu navigieren.

Ihr Projektverzeichnis sollte ungefähr so ​​aussehen:

taskplanner // our main working directory |--- manage.py // similar to the django-admin script, you will see this used a // lot throughout our project |--- taskplanner |--- __init__.py // this just tells python to treat this directory as a package |--- settings.py // main configuration file for our project |--- urls.py // we will use this to configure urls |--- wsgi.py // this is used for deploying our project to a production server

Funktionsprüfung

Testgetriebene Entwicklung ist eine weit verbreitete Best Practice bei der Entwicklung von Software. Grundsätzlich möchten wir zuerst einen Test schreiben, der fehlschlagen muss, und dann die geringstmögliche Menge an Code schreiben, um diesen Test zu bestehen. Unser Ziel bei Django ist es, sowohl Funktionstests (auch als Integrationstests, End-to-End-Tests usw. bekannt) als auch Komponententests während der gesamten Entwicklung zu schreiben. Schwitzen Sie nicht, das Testen ist nicht so schwierig, wie es scheint!

Aber zuerst müssen wir eine neue virtuelle Umgebung erstellen, die dem Testen gewidmet ist. Öffnen Sie eine neue Registerkarte in Ihrem Terminal, navigieren Sie zu Ihrem Taskplaner-Projektverzeichnis und geben Sie Folgendes ein:

mkvirtualenv taskplanner_test --python=/usr/bin/python3

Jetzt sollten in Ihrem Terminal zwei Registerkarten geöffnet sein, eine in der virtuellen Umgebung (Taskplanner) und die andere in der virtuellen Umgebung (Taskplanner_test).

Wenn Sie pip freezeunsere neue Testumgebung (taskplanner_test) eingeben, werden Sie feststellen, dass nichts angezeigt wird. Dies liegt daran, dass wir noch nichts in unserer neuen Umgebung installieren müssen.

Lassen Sie uns also zuerst Django in unserer Testumgebung (taskplanner_test) installieren:

pip install Django

Um unsere Funktionstests zu erstellen, benötigen wir einige Dinge. Zunächst muss der Firefox-Webbrowser auf unserem Computer installiert sein. Wenn Sie Firefox nicht haben, installieren Sie es jetzt.

Nebenbemerkung : Sie können Chrome für Integrationstests verwenden, müssen jedoch den Treiber hier herunterladen und dieser Frage zum Stapelüberlauf folgen. Firefox hat beim Ausführen von Integrationstests eine historisch bessere Leistung als Chrome erzielt. Dies ist eine sehr wichtige Überlegung, da Integrationstests im Vergleich zu Komponententests extrem langsam sind.

Dies liegt daran, dass Integrationstests das gesamte System testen und nicht "Einheiten" (kleine Komponenten). In der realen Welt ist es manchmal am besten, Integrationstests zu vermeiden, da die Entwicklungszeit lang ist, um sie zu erstellen, die Laufzeit verlangsamt wird, mehrdeutige Fehler auftreten und andere Gründe, die Sie rechtzeitig entdecken würden.

Sie sind jedoch bei der Entwicklung einer realen App immer noch eine Überlegung wert und können trotz der Leistungseinbußen hinsichtlich der Zuverlässigkeit sehr nützlich sein.

Als nächstes müssen wir ein Paket namens Selenium installieren. Dieses Paket stellt uns einen WebDriver zur Verfügung, damit wir mit unseren Tests einen Browser steuern können. Selen wird normalerweise verwendet, um Ihren Browser zu automatisieren.

pip install selenium

Nachdem wir das installiert haben, benötigen wir ein Verzeichnis, um unsere Tests zu erstellen:

mkdir functional_tests

Im taskplannerVerzeichnis sollte nun Folgendes angezeigt werden:

taskplanner |-- functional_tests |--- manage.py |--- taskplanner ...

Wir müssen jetzt einige Dateien in unserem functional_testsOrdner erstellen . Wir werden eine __init__.pyDatei erstellen (dies functional_testsweist Python an, wie ein Paket zu behandeln ) und eine test_all_users.pyDatei, die unsere Tests enthält.

Machen wir das jetzt:

touch functional_tests/__init__.py touch functional_tests/test_all_users.py

Nebenbemerkung :__init__.pyist fast immer eine leere Datei. Weitere Informationen zu den Verwendungszwecken finden Sie in dieser Antwort zum Stapelüberlauf.

Wir können endlich anfangen, unseren ersten Funktionstest zu schreiben! Funktionstests dienen zum Testen von Funktionsblöcken in unserer Webanwendung. TDD mit Python beschreibt Funktionstests als "wie die Anwendung aus Sicht des Benutzers funktioniert".

So let’s open the test_all_users.py file in our text editor. First, we want to import selenium’s webdriver, and to make this a lot easier, Django provides something known as StaticLiveServerTestCase for live testing. Let’s import both of those now:

from selenium import webdriver from django.contrib.staticfiles.testing import StaticLiveServerTestCase

Since we are testing from the users perspective, let’s name these tests NewVisitorTest. Add the following:

class NewVisitorTest(StaticLiveServerTestCase): def setUp(self): self.browser = webdriver.Firefox() self.browser.implicitly_wait(2) def tearDown(self): self.browser.quit()

First, we create a StaticLiveServerTestCase class named NewVisitorTest, this will contain our tests that we want to run for a new visitor. Then, we have two methods named setUp and tearDown. The setUp method is initialized when we run our tests. So, for each test we run, we open Firefox and wait 2 seconds for the page to load. tearDown runs after each test is finished, this method closes the browser for us after each test.

Now we can write our first test, and have Firefox open and close automatically for us. Let’s write our test now below the tearDown method.

 def test_home_title(self): self.browser.get('//localhost:8000') self.assertIn('Welcome to Django', self.browser.title)

Our first test, how exciting! Let’s walk through it. Every test we want to create must start with ‘test’. For example, if I wanted to create a test for my css, I would call the method test_h2_css. So here, we named the test test_home_title. That’s pretty self-explanatory, which is exactly what we want for our tests. The method first brings Firefox to the url //localhost:8000, and then it checks if ‘Welcome to Django’ is in the html head tags title.

Let’s run this test now and see what happens:

python manage.py test functional_tests

First, what exactly are we typing here? The manage.py script provides us with something called ‘test’, we will use this to run all of our tests. Here we are running it on our functional_tests package that we created with the __init__.py file.

After running this you should see something like the following in your terminal:

F ====================================================================== FAIL: test_home_title (functional_tests.test_all_users.NewVisitorTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/username/url/to/project/taskplanner/functional_tests/test_all_users.py", line 15, in test_home_title self.assertIn('Welcome to Django', self.browser.title) AssertionError: 'Welcome to Django' not found in 'Problem loading page' ---------------------------------------------------------------------- Ran 1 test in 4.524s FAILED (failures=1)

So it failed, but it gave us some handy advice. First, the AssertionError. ‘Welcome to Django’ not found in ‘Problem loading page’. So that means the title of //localhost:8000 was ‘Problem loading page’. If you navigate to the url, you will see that the web page was not available.

Let’s try running our Django server to get the test to pass. Switch back to the terminal tab that is in the taskplanner virtual environment and run our server.

python manage.py runserver

You should see something like the following:

Performing system checks... System check identified no issues (0 silenced). You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them. March 06, 2016 - 20:53:38 Django version 1.9.4, using settings 'taskplanner.settings' Starting development server at //127.0.0.1:8000/ Quit the server with CONTROL-C.

Don’t worry about the unapplied migrations message yet.

Now that we have a server running on //localhost:8000, lets run our test again.

Go back to the other terminal tab that is in the taskplanner_test virtual environment and run the following once more:

python manage.py test functional_tests

You should see the following.

Creating test database for alias 'default'... . ---------------------------------------------------------------------- Ran 1 test in 4.033s OK Destroying test database for alias 'default'...

What We’ve Done So Far

Our first passing test!

We’ve covered a lot in this article. We created our first project, set up virtual environments for both development and testing purposes, wrote our first functional test, and followed the Test-driven development process by writing a failing test, and then making it making it pass.

Using starter templates

You can save yourself a lot of time by kickstarting your project with a django starter template. These projects use best practices that will save you headaches later when your project grows. Some of the more popular projects are

  • Cookiecutter
  • Hackathon starter
  • Edge