Django учебник
Начало работы с Django
Поиск…
замечания
Django рекламирует себя как «веб-инфраструктуру для перфекционистов с предельными сроками», а «Django упрощает создание лучших веб-приложений быстрее и с меньшим количеством кода». Его можно рассматривать как архитектуру MVC. В его основе он имеет:
- легкий и автономный веб-сервер для разработки и тестирования
- система сериализации и проверки формы, которая может переводить между HTML-формами и значениями, подходящими для хранения в базе данных
- система шаблонов, использующая концепцию наследования, заимствованную из объектно-ориентированного программирования
- структура кэширования, которая может использовать любой из нескольких методов кеширования для классов промежуточного программного обеспечения, которые могут вмешиваться на разных этапах обработки запроса и выполнять пользовательские функции
- внутренняя диспетчерская система, которая позволяет компонентам приложения передавать события друг другу через заранее определенные сигналы
- система интернационализации, включая перевод собственных компонентов Django на различные языки
- система сериализации, которая может создавать и читать XML и / или JSON-представления экземпляров модели Django
- система для расширения возможностей механизма шаблонов
- интерфейс к встроенной платформе тестирования Python
Версии
Версия | Дата выхода |
---|---|
1,11 | 2017-04-04 |
1,10 | 2016-08-01 |
1,9 | 2015-12-01 |
1,8 | 2015-04-01 |
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 |
Запуск проекта
Django - это основа веб-разработки на основе Python. Django 1.11 (последняя стабильная версия) требует установки Python 2.7 , 3.4 , 3.5 или 3.6 . Предполагая, что pip
доступен, установка выполняется так же просто, как выполнение следующей команды. Имейте в виду, что, опуская версию, как показано ниже, будет установлена последняя версия django:
$ pip install django
Для установки конкретной версии django предположим, что версия django 1.10.5 , выполните следующую команду:
$ pip install django==1.10.5
Веб-приложения, созданные с использованием Django, должны находиться в проекте Django. Вы можете использовать команду django-admin
для запуска нового проекта в текущем каталоге:
$ django-admin startproject myproject
где myproject
- это имя, которое однозначно идентифицирует проект и может состоять из цифр , букв и подчеркиваний .
Это создаст следующую структуру проекта:
myproject/
manage.py
myproject/
__init__.py
settings.py
urls.py
wsgi.py
Чтобы запустить приложение, запустите сервер разработки
$ cd myproject
$ python manage.py runserver
Теперь, когда сервер работает, посетите http://127.0.0.1:8000/
с помощью вашего веб-браузера. Вы увидите следующую страницу:
По умолчанию команда runserver
запускает сервер разработки на внутреннем IP- runserver
на порту 8000
. Этот сервер будет автоматически перезагружаться при внесении изменений в ваш код. Но если вы добавите новые файлы, вам придется вручную перезапустить сервер.
Если вы хотите изменить порт сервера, передайте его как аргумент командной строки.
$ python manage.py runserver 8080
Если вы хотите изменить IP-адрес сервера, передайте его вместе с портом.
$ python manage.py runserver 0.0.0.0:8000
Обратите внимание, что runserver
работает только для отладки и локального тестирования. Специализированные серверные программы (такие как Apache) всегда должны использоваться в производстве.
Добавление приложения Django
Проект Django обычно содержит несколько apps
. Это просто способ структурирования вашего проекта в небольших поддерживаемых модулях. Чтобы создать приложение, перейдите в свою папку проекта (где находится файл manage.py
) и запустите команду startapp
(измените myapp на все, что вы хотите):
python manage.py startapp myapp
Это создаст для вас папку myapp и некоторые необходимые файлы, например models.py
и views.py
.
Чтобы Django узнал о myapp , добавьте его в свой файл settings.py
:
# myproject/settings.py
# Application definition
INSTALLED_APPS = [
...
'myapp',
]
Папка-структура проекта Django может быть изменена в соответствии с вашими предпочтениями. Иногда папка проекта переименовывается в /src
чтобы избежать повторения имен папок. Типичная структура папок выглядит так:
Концепции Django
django-admin - это инструмент командной строки, который поставляется с Django. Он поставляется с несколькими полезными командами для начала и управления проектом Django. Команда такая же, как ./manage.py
, с той разницей, что вам не нужно находиться в каталоге проекта. DJANGO_SETTINGS_MODULE
быть установлена переменная среды DJANGO_SETTINGS_MODULE
.
Проект Django представляет собой кодовую базу Python, содержащую файл настроек Django. Проект может быть создан администратором Django с помощью команды django-admin startproject NAME
. Обычно проект имеет файл manage.py
на верхнем уровне и файл корневого URL-адреса, называемый urls.py
manage.py
- это версия django-admin
конкретного проекта и позволяет запускать команды управления в этом проекте. Например, чтобы запустить проект локально, используйте python manage.py runserver
. Проект состоит из приложений Django.
Приложение Django представляет собой пакет Python, содержащий файл моделей (по умолчанию - models.py
) и другие файлы, такие как URL-адреса приложений и представления. Приложение можно создать с помощью команды django-admin startapp NAME
(эта команда должна запускаться из вашей директории проекта). Чтобы приложение было частью проекта, оно должно быть включено в список INSTALLED_APPS
в settings.py
. Если вы использовали стандартную конфигурацию, Django поставляется с несколькими приложениями своих собственных предустановленных приложений, которые будут обрабатывать вас как аутентификацию . Приложения могут использоваться в нескольких проектах Django.
Django ORM собирает все модели баз данных, определенные в models.py
и создает таблицы базы данных на основе этих классов моделей. Для этого сначала настройте свою базу данных, изменив параметр DATABASES
в settings.py
. Затем, как только вы определили свои модели баз данных , запустите python manage.py makemigrations
за которым следует python manage.py migrate
чтобы создать или обновить схему вашей базы данных на основе ваших моделей.
Полный пример приветствия.
Шаг 1 Если у вас уже установлен Django, вы можете пропустить этот шаг.
pip install Django
Шаг 2 Создайте новый проект
django-admin startproject hello
Это создаст папку с именем hello
которая будет содержать следующие файлы:
hello/
├── hello/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
Шаг 3 Внутри модуля hello
(папка, содержащая __init.py__
) создайте файл с именем views.py
:
hello/
├── hello/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── views.py <- here
│ └── wsgi.py
└── manage.py
и добавьте следующее содержание:
from django.http import HttpResponse
def hello(request):
return HttpResponse('Hello, World')
Это называется функцией просмотра.
Шаг 4 Отредактируйте hello/urls.py
следующим образом:
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)
]
который связывает функцию вида hello()
с URL-адресом.
Шаг 5 Запустите сервер.
python manage.py runserver
Шаг 6
Просмотрите http://localhost:8000/
в браузере, и вы увидите:
Привет, мир
Виртуальная среда
Хотя это и не требуется строго, настоятельно рекомендуется начать свой проект в «виртуальной среде». Виртуальная среда - это контейнер (каталог), который содержит определенную версию Python и набор модулей (зависимостей) и который не мешает родному Python операционной системы или другим проектам на одном компьютере.
Путем настройки другой виртуальной среды для каждого проекта, над которым вы работаете, различные проекты Django могут запускаться на разных версиях Python и могут поддерживать собственные наборы зависимостей без риска конфликтов.
Python 3.3+
Python 3.3+ уже включает стандартный модуль venv
, который вы обычно можете назвать pyvenv
. В средах, где команда pyvenv
недоступна, вы можете получить доступ к тем же функциям, напрямую вызвав модуль как python3 -m venv
.
Чтобы создать виртуальную среду:
$ pyvenv <env-folder>
# Or, if pyvenv is not available
$ python3 -m venv <env-folder>
Python 2
Если вы используете Python 2, вы можете сначала установить его как отдельный модуль из pip:
$ pip install virtualenv
Затем создайте среду, используя команду virtualenv
:
$ virtualenv <env-folder>
Активировать (любая версия)
Теперь виртуальная среда настроена. Чтобы использовать его, он должен быть активирован в терминале, который вы хотите использовать.
Чтобы «активировать» виртуальную среду (любую версию Python)
Linux:
$ source <env-folder>/bin/activate
Windows:
<env-folder>\Scripts\activate.bat
Это изменяет ваше приглашение, чтобы указать, что виртуальная среда активна. (<env-folder>) $
Отныне все, установленное с помощью pip
будет установлено в вашу виртуальную папку env, а не в масштабе всей системы.
Чтобы deactivate
виртуальную среду, deactivate
:
(<env-folder>) $ deactivate
Альтернативно: используйте virtualenvwrapper
Вы также можете рассмотреть возможность использования virtualenvwrapper, который делает создание и активацию virtualenv очень удобным, а также отделяет его от вашего кода:
# Create a virtualenv
mkvirtualenv my_virtualenv
# Activate a virtualenv
workon my_virtualenv
# Deactivate the current virtualenv
deactivate
Альтернативно: используйте pyenv + pyenv-viritualenv
В средах, где вам нужно обрабатывать несколько версий Python, вы можете использовать virtualenv вместе с pyenv-virtualenv:
# 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
При использовании virtualenvs часто бывает полезно установить PYTHONPATH
и DJANGO_SETTINGS_MODULE
в сценарии 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"
Укажите путь к проекту
Часто также полезно указать путь к проекту в специальном файле .project
расположенном в вашей базе <env-folder>
. При этом каждый раз, когда вы активируете свою виртуальную среду, она будет изменять активный каталог на указанный путь.
Создайте новый файл с именем <env-folder>/.project
. Содержимое файла должно быть ТОЛЬКО в качестве пути к каталогу проекта.
/path/to/project/directory
Теперь инициируйте свою виртуальную среду (используя source <env-folder>/bin/activate
или workon my_virtualenv
), и ваш терминал изменит каталоги в каталог /path/to/project/directory
.
Пример простого файла Hello World
В этом примере вы покажете минимальный способ создания страницы Hello World в Django. Это поможет вам понять, что django-admin startproject example
проекта django-admin startproject example
основном создает кучу папок и файлов и что вам не обязательно нужна эта структура для запуска вашего проекта.
Создайте файл с именем
file.py
Скопируйте и вставьте следующий код в этот файл.
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)
Перейдите к терминалу и запустите файл с помощью этой команды
python file.py runserver
.Откройте браузер и перейдите к 127.0.0.1:8000 .
Дружественный к развертыванию проект с поддержкой Docker.
Шаблон проекта Django по умолчанию подходит, но как только вы доберетесь до развертывания своего кода, и, например, дефолты положили руки на проект, все становится беспорядочным. Что вы можете сделать, это отделить исходный код от остальных, которые должны быть в вашем репозитории.
Вы можете найти подходящий шаблон проекта Django на GitHub .
Структура проекта
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
Мне нравится сохранять service
каталог с именем service
для каждого проекта, благодаря Dockerfile
я могу использовать один и тот же Dockerfile
во всех моих проектах. Разделение требований и настроек уже хорошо описано здесь:
Использование нескольких файлов требований
Использование нескольких настроек
Dockerfile
С предположением, что только разработчики используют Docker (не каждый dev ops доверяет ему в эти дни). Это может быть devel.dockerfile
dev:
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"]
При добавлении только требований будет использоваться кеш докеров при построении - вам нужно будет только перестроить при изменении требований.
компоновать
Docker compomp пригодится - особенно когда у вас есть несколько сервисов для локального запуска. 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
Ваша среда разработки должна быть как можно ближе к среде prod, поэтому мне нравится использовать Nginx с самого начала. Вот пример файла конфигурации nginx:
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/;
}
}
использование
$ 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