Django Tutorial
Erste Schritte mit Django
Suche…
Bemerkungen
Django wirbt selbst als "das Web-Framework für Perfektionisten mit Fristen" und "Django macht es einfacher, bessere Web-Apps schneller und mit weniger Code zu erstellen". Es kann als MVC-Architektur betrachtet werden. Im Kern hat es:
- ein leichter und eigenständiger Webserver für Entwicklung und Test
- ein Formular-Serialisierungs- und -Validierungssystem, das HTML-Formulare und für die Speicherung in der Datenbank geeignete Werte übersetzen kann
- ein Vorlagensystem, das das Konzept der Vererbung nutzt, das der objektorientierten Programmierung entlehnt ist
- Ein Caching-Framework, das mehrere Cache-Methoden verwenden kann, unterstützt Middleware-Klassen, die in verschiedenen Phasen der Anforderungsverarbeitung eingreifen und benutzerdefinierte Funktionen ausführen können
- ein internes Dispatcher-System, das es den Komponenten einer Anwendung ermöglicht, Ereignisse über vordefinierte Signale miteinander zu kommunizieren
- ein Internationalisierungssystem, das Übersetzungen der eigenen Komponenten von Django in verschiedene Sprachen umfasst
- ein Serialisierungssystem, das XML- und / oder JSON-Repräsentationen von Django-Modellinstanzen erzeugen und lesen kann
- ein System zur Erweiterung der Fähigkeiten der Template Engine
- eine Schnittstelle zu Pythons eingebautem Unit-Test-Framework
Versionen
Ausführung | Veröffentlichungsdatum |
---|---|
1.11 | 2017-04-04 |
1.10 | 2016-08-01 |
1,9 | 2015-12-01 |
1.8 | 01.04.2015 |
1.7 | 2014-09-02 |
1.6 | 2013-11-06 |
1,5 | 2013-02-26 |
1.4 | 2012-03-23 |
1.3 | 2011-03-23 |
1.2 | 2010-05-17 |
1.1 | 2009-07-29 |
1,0 | 2008-09-03 |
Projekt starten
Django ist ein auf Python basierendes Webentwicklungs-Framework. Django 1.11 (die neueste stabile Version) erfordert die Installation von Python 2.7 , 3.4 , 3.5 oder 3.6 . Vorausgesetzt, pip
ist verfügbar, ist die Installation so einfach wie das Ausführen des folgenden Befehls. Denken Sie daran, wenn Sie die Version wie unten gezeigt weglassen, wird die neueste Version von django installiert:
$ pip install django
Nehmen Sie zur Installation einer bestimmten Version von django an, dass die Version django 1.10.5 ist. Führen Sie den folgenden Befehl aus:
$ pip install django==1.10.5
Webanwendungen, die mit Django erstellt wurden, müssen sich in einem Django-Projekt befinden. Sie können den Befehl django-admin
, um ein neues Projekt im aktuellen Verzeichnis zu starten:
$ django-admin startproject myproject
Dabei ist myproject
Projekt ein Name, der das Projekt eindeutig identifiziert und aus Zahlen , Buchstaben und Unterstrichen bestehen kann .
Dadurch wird die folgende Projektstruktur erstellt:
myproject/
manage.py
myproject/
__init__.py
settings.py
urls.py
wsgi.py
Starten Sie den Entwicklungsserver, um die Anwendung auszuführen
$ cd myproject
$ python manage.py runserver
Nun, da der Server läuft, besuchen Sie http://127.0.0.1:8000/
mit Ihrem Webbrowser. Sie sehen die folgende Seite:
runserver
Befehl runserver
startet standardmäßig den Entwicklungsserver auf der internen IP- runserver
an Port 8000
. Dieser Server wird automatisch neu gestartet, wenn Sie Änderungen an Ihrem Code vornehmen. Falls Sie jedoch neue Dateien hinzufügen, müssen Sie den Server manuell neu starten.
Wenn Sie den Port des Servers ändern möchten, übergeben Sie ihn als Befehlszeilenargument.
$ python manage.py runserver 8080
Wenn Sie die IP des Servers ändern möchten, übergeben Sie diese zusammen mit dem Port.
$ python manage.py runserver 0.0.0.0:8000
Der runserver
ist nur für runserver
und lokale Tests runserver
. Spezielle Serverprogramme (wie Apache) sollten in der Produktion immer verwendet werden.
Hinzufügen einer Django-App
Ein Django-Projekt enthält normalerweise mehrere apps
. Dies ist einfach eine Möglichkeit, Ihr Projekt in kleinere, wartbare Module zu strukturieren. Um eine App zu erstellen, gehen Sie zu Ihrem Projektordner (dort, wo sich manage.py
befindet) und führen Sie den Befehl startapp
(ändern Sie myapp in einen beliebigen Bereich)
python manage.py startapp myapp
Daraufhin werden der myapp- Ordner und einige für Sie notwendige Dateien wie models.py
und views.py
.
Um Django auf myapp aufmerksam zu machen , fügen Sie es zu Ihren settings.py
hinzu.py :
# myproject/settings.py
# Application definition
INSTALLED_APPS = [
...
'myapp',
]
Die Ordnerstruktur eines Django-Projekts kann nach Ihren Wünschen geändert werden. Manchmal wird der Projektordner in /src
, um die Wiederholung von /src
zu vermeiden. Eine typische Ordnerstruktur sieht folgendermaßen aus:
Django-Konzepte
django-admin ist ein Befehlszeilentool, das mit Django geliefert wird. Es enthält mehrere nützliche Befehle, um ein Django-Projekt zu beginnen und zu verwalten. Der Befehl ist dasselbe wie ./manage.py
, mit dem Unterschied, dass Sie sich nicht im Projektverzeichnis befinden müssen. Die Umgebungsvariable DJANGO_SETTINGS_MODULE
muss gesetzt werden.
Ein Django-Projekt ist eine Python-Codebasis, die eine Django-Einstellungsdatei enthält. Ein Projekt kann vom Django-Administrator mit dem Befehl django-admin startproject NAME
. Das Projekt hat normalerweise eine Datei namens manage.py
auf der obersten Ebene und eine Stamm-URL-Datei namens urls.py
manage.py
ist eine projektspezifische Version von django-admin
, mit der Sie Verwaltungsbefehle für dieses Projekt ausführen können. Verwenden Sie beispielsweise python manage.py runserver
, um Ihr Projekt lokal python manage.py runserver
. Ein Projekt besteht aus Django-Apps.
Eine Django-App ist ein Python-Paket, das eine Models-Datei ( models.py
standardmäßig) und andere Dateien wie app-spezifische URLs und Ansichten enthält. Eine App kann mit dem Befehl django-admin startapp NAME
(dieser Befehl sollte in Ihrem Projektverzeichnis ausgeführt werden). Damit eine App Teil eines Projekts ist, muss sie in der Liste INSTALLED_APPS
in der INSTALLED_APPS
settings.py
. Wenn Sie die Standardkonfiguration verwendet haben, werden bei Django mehrere Apps seiner eigenen Apps vorinstalliert, die beispielsweise Authentifizierung für Sie erledigen. Apps können in mehreren Django-Projekten verwendet werden.
Der Django-ORM erfasst alle in models.py
definierten models.py
und erstellt basierend auf diesen Modellklassen Datenbanktabellen. Richten Sie dazu zunächst Ihre Datenbank ein, indem Sie die Einstellung DATABASES
in settings.py
DATABASES
. python manage.py makemigrations
Sie Ihre Datenbankmodelle definiert haben, führen Sie anschließend python manage.py makemigrations
gefolgt von python manage.py migrate
, um das Schema Ihrer Datenbank basierend auf Ihren Modellen zu erstellen oder zu aktualisieren.
Ein komplettes Hallo Weltbeispiel.
Schritt 1 Wenn Sie Django bereits installiert haben, können Sie diesen Schritt überspringen.
pip install Django
Schritt 2 Erstellen Sie ein neues Projekt
django-admin startproject hello
Daraufhin wird ein Ordner mit dem Namen hello
der die folgenden Dateien enthält:
hello/
├── hello/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
Schritt 3 Im Inneren des hello
- Modul (der Ordner , die enthalten __init.py__
) erstellen eine Datei namens views.py
:
hello/
├── hello/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── views.py <- here
│ └── wsgi.py
└── manage.py
und füge folgenden Inhalt hinzu:
from django.http import HttpResponse
def hello(request):
return HttpResponse('Hello, World')
Dies wird als Ansichtsfunktion bezeichnet.
Schritt 4 Bearbeiten Sie hello/urls.py
wie folgt:
from django.conf.urls import url
from django.contrib import admin
from hello import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.hello)
]
welche die View-Funktion hello()
mit einer URL verknüpft.
Schritt 5 Starten Sie den Server.
python manage.py runserver
Schritt 6
Navigieren Sie in einem Browser zu http://localhost:8000/
und Sie werden sehen:
Hallo Welt
Virtuelle Umgebung
Obwohl dies nicht unbedingt erforderlich ist, wird dringend empfohlen, Ihr Projekt in einer "virtuellen Umgebung" zu starten. Eine virtuelle Umgebung ist ein Container (ein Verzeichnis), das eine bestimmte Version von Python und eine Reihe von Modulen (Abhängigkeiten) enthält und der native Python des Betriebssystems oder andere Projekte auf demselben Computer nicht beeinträchtigt.
Durch das Einrichten einer anderen virtuellen Umgebung für jedes Projekt, an dem Sie arbeiten, können verschiedene Django-Projekte auf verschiedenen Python-Versionen ausgeführt werden und können ihre eigenen Abhängigkeiten beibehalten, ohne dass dies zu Konflikten führt.
Python 3.3+
Python 3.3+ enthält bereits ein Standard- venv
Modul, das Sie normalerweise als pyvenv
aufrufen pyvenv
. In Umgebungen, in denen der Befehl pyvenv
nicht verfügbar ist, können Sie auf die gleiche Funktionalität zugreifen, indem Sie das Modul direkt als python3 -m venv
.
So erstellen Sie die virtuelle Umgebung:
$ pyvenv <env-folder>
# Or, if pyvenv is not available
$ python3 -m venv <env-folder>
Python 2
Wenn Sie Python 2 verwenden, können Sie es zunächst als separates Modul von pip installieren:
$ pip install virtualenv
Erstellen Sie anschließend die Umgebung mit dem Befehl virtualenv
:
$ virtualenv <env-folder>
Aktivieren (beliebige Version)
Die virtuelle Umgebung ist jetzt eingerichtet. Um es verwenden zu können, muss es in dem Terminal aktiviert werden, das Sie verwenden möchten.
So aktivieren Sie die virtuelle Umgebung (jede Python-Version)
Linux wie:
$ source <env-folder>/bin/activate
Windows wie:
<env-folder>\Scripts\activate.bat
Dadurch wird Ihre Aufforderung geändert, um anzuzeigen, dass die virtuelle Umgebung aktiv ist. (<env-folder>) $
Von jetzt an wird alles, was mit pip
installiert wurde, in Ihrem virtuellen Ordner env installiert, nicht systemweit.
Um die virtuelle Umgebung zu verlassen, deactivate
:
(<env-folder>) $ deactivate
Alternativ: Verwenden Sie virtualenvwrapper
Sie können auch den Einsatz von virtualenvwrapper in Betracht ziehen, was die Erstellung und Aktivierung von virtualenv sehr praktisch macht und von Ihrem Code trennt:
# Create a virtualenv
mkvirtualenv my_virtualenv
# Activate a virtualenv
workon my_virtualenv
# Deactivate the current virtualenv
deactivate
Alternativ: Verwenden Sie pyenv + pyenv-viritualenv
In Umgebungen, in denen Sie mit mehreren Python-Versionen arbeiten müssen, können Sie gemeinsam mit pyenv-virtualenv von virtualenv profitieren:
# Create a virtualenv for specific Python version
pyenv virtualenv 2.7.10 my-virtual-env-2.7.10
# Create a vritualenv for active python verion
pyenv virtualenv venv34
# Activate, deactivate virtualenv
pyenv activate <name>
pyenv deactivate
Bei der Verwendung von Virtualenvs ist es oft nützlich, PYTHONPATH
und DJANGO_SETTINGS_MODULE
im postactivate
Skript postactivate
.
#!/bin/sh
# This hook is sourced after this virtualenv is activated
# Set PYTHONPATH to isolate the virtualenv so that only modules installed
# in the virtualenv are available
export PYTHONPATH="/home/me/path/to/your/project_root:$VIRTUAL_ENV/lib/python3.4"
# Set DJANGO_SETTINGS_MODULE if you don't use the default `myproject.settings`
# or if you use `django-admin` rather than `manage.py`
export DJANGO_SETTINGS_MODULE="myproject.settings.dev"
Legen Sie Ihren Projektpfad fest
Oft ist es auch hilfreich, den Projektpfad in einer speziellen .project
, die sich in Ihrem <env-folder>
. Bei jeder Aktivierung Ihrer virtuellen Umgebung ändert das aktive Verzeichnis den angegebenen Pfad.
Erstellen Sie eine neue Datei mit dem Namen <env-folder>/.project
. Der Inhalt der Datei sollte NUR der Pfad des Projektverzeichnisses sein.
/path/to/project/directory
workon my_virtualenv
nun Ihre virtuelle Umgebung (entweder mit dem workon my_virtualenv
source <env-folder>/bin/activate
workon my_virtualenv
source <env-folder>/bin/activate
workon my_virtualenv
oder workon my_virtualenv
), und Ihr Terminal wechselt in das Verzeichnis /path/to/project/directory
.
Hello World-Beispiel für eine Datei
Dieses Beispiel zeigt Ihnen, wie Sie in Django eine Hello World-Seite erstellen. Dies hilft Ihnen zu erkennen, dass der Beispielbefehl django-admin startproject example
Wesentlichen eine Reihe von Ordnern und Dateien erstellt und dass Sie nicht unbedingt diese Struktur zum Ausführen Ihres Projekts benötigen.
Erstellen Sie eine Datei namens
file.py
Kopieren Sie den folgenden Code und fügen Sie ihn in diese Datei ein.
import sys from django.conf import settings settings.configure( DEBUG=True, SECRET_KEY='thisisthesecretkey', ROOT_URLCONF=__name__, MIDDLEWARE_CLASSES=( 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ), ) from django.conf.urls import url from django.http import HttpResponse # Your code goes below this line. def index(request): return HttpResponse('Hello, World!') urlpatterns = [ url(r'^$', index), ] # Your code goes above this line if __name__ == "__main__": from django.core.management import execute_from_command_line execute_from_command_line(sys.argv)
Gehen Sie zum Terminal und führen Sie die Datei mit dem folgenden Befehl aus:
python file.py runserver
.Öffnen Sie Ihren Browser und gehen Sie zu 127.0.0.1:8000 .
Bereitstellungsfreundliches Projekt mit Docker-Unterstützung.
Die Standardvorlage für das Django-Projekt ist in Ordnung, aber sobald Sie Ihren Code bereitstellen können, und zum Beispiel Devops ihre Hände auf das Projekt legen, wird es unordentlich. Was Sie tun können, ist, Ihren Quellcode von dem Rest zu trennen, der für Ihr Repository erforderlich ist.
Sie finden eine verwendbare Django-Projektvorlage auf GitHub .
Projektstruktur
PROJECT_ROOT
├── devel.dockerfile
├── docker-compose.yml
├── nginx
│ └── project_name.conf
├── README.md
├── setup.py
└── src
├── manage.py
└── project_name
├── __init__.py
└── service
├── __init__.py
├── settings
│ ├── common.py
│ ├── development.py
│ ├── __init__.py
│ └── staging.py
├── urls.py
└── wsgi.py
Ich möchte das service
namens service
für jedes Projekt behalten, da ich in allen meinen Projekten dieselbe Dockerfile
kann. Die Aufteilung der Anforderungen und Einstellungen ist hier bereits gut dokumentiert:
Verwendung mehrerer Anforderungsdateien
Mehrere Einstellungen verwenden
Dockerfile
Mit der Annahme, dass nur Entwickler Docker verwenden (heutzutage vertraut nicht jeder Entwickler). Dies könnte eine devel.dockerfile
:
FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /run/service
ADD . /run/service
WORKDIR /run/service
RUN pip install -U pip
RUN pip install -I -e .[develop] --process-dependency-links
WORKDIR /run/service/src
ENTRYPOINT ["python", "manage.py"]
CMD ["runserver", "0.0.0.0:8000"]
Wenn Sie nur Anforderungen hinzufügen, wird der Docker-Cache während der Erstellung genutzt. Sie müssen nur bei geänderten Anforderungen neu aufgebaut werden.
Komponieren
Docker Compose ist praktisch - vor allem, wenn Sie mehrere Dienste lokal ausführen müssen. docker-compose.yml
:
version: '2'
services:
web:
build:
context: .
dockerfile: devel.dockerfile
volumes:
- "./src/{{ project_name }}:/run/service/src/{{ project_name }}"
- "./media:/run/service/media"
ports:
- "8000:8000"
depends_on:
- db
db:
image: mysql:5.6
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE={{ project_name }}
nginx:
image: nginx
ports:
- "80:80"
volumes:
- "./nginx:/etc/nginx/conf.d"
- "./media:/var/media"
depends_on:
- web
Nginx
Ihre Entwicklungsumgebung sollte so nah wie möglich an der Produktumgebung sein, daher mag ich Nginx von Anfang an. Hier ist eine Beispiel-Nginx-Konfigurationsdatei:
server {
listen 80;
client_max_body_size 4G;
keepalive_timeout 5;
location /media/ {
autoindex on;
alias /var/media/;
}
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Ssl on;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_pass http://web:8000/;
}
}
Verwendungszweck
$ cd PROJECT_ROOT
$ docker-compose build web # build the image - first-time and after requirements change
$ docker-compose up # to run the project
$ docker-compose run --rm --service-ports --no-deps # to run the project - and be able to use PDB
$ docker-compose run --rm --no-deps <management_command> # to use other than runserver commands, like makemigrations
$ docker exec -ti web bash # For accessing django container shell, using it you will be inside /run/service directory, where you can run ./manage shell, or other stuff
$ docker-compose start # Starting docker containers
$ docker-compose stop # Stopping docker containers