Looking for django Answers? Try Ask4KnowledgeBase
Looking for django Keywords? Try Ask4Keywords

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

Полный пример приветствия.

Шаг 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/ в браузере, и вы увидите:

Привет, мир

Дружественный к развертыванию проект с поддержкой 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
 

Концепции 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 чтобы создать или обновить схему вашей базы данных на основе ваших моделей.

Пример простого файла Hello World

В этом примере вы покажете минимальный способ создания страницы Hello World в Django. Это поможет вам понять, что django-admin startproject example проекта django-admin startproject example основном создает кучу папок и файлов и что вам не обязательно нужна эта структура для запуска вашего проекта.

  1. Создайте файл с именем file.py

  2. Скопируйте и вставьте следующий код в этот файл.

     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)
     
  3. Перейдите к терминалу и запустите файл с помощью этой команды python file.py runserver .

  4. Откройте браузер и перейдите к 127.0.0.1:8000 .

Запуск проекта

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 чтобы избежать повторения имен папок. Типичная структура папок выглядит так:

структура каталогов

Виртуальная среда

Хотя это и не требуется строго, настоятельно рекомендуется начать свой проект в «виртуальной среде». Виртуальная среда - это контейнер (каталог), который содержит определенную версию 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 .