freeCodeCamp/guide/russian/miscellaneous/creating-a-project-with-django/index.md

229 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: Creating a Project with Django
localeTitle: Создание проекта с помощью Django
---
Теперь, когда мы знаем, как создавать виртуальные среды и использовать pip, мы можем начать строить наш проект. В этой статье мы создадим наш первый проект Django, напишем тесты и запустим наш сервер разработки.
## Создание виртуальной среды
Во-первых, давайте создадим новую виртуальную среду для этого проекта. (Если вы еще этого не сделали, отключите предыдущий файл virtualenv, набрав в терминале `deactivate` ). Для получения дополнительной информации о виртуальных средах и способах их использования посетите эту страницу .
Перейдите в каталог, в котором вы хотите проект Django, и введите в терминал следующее:
```
mkvirtualenv taskplanner --python=/usr/bin/python3
```
Возможно, вам придется изменить свой путь Python, если он отличается от приведенного выше.
Оболочка командной строки теперь должна выглядеть ниже, указывая, что вы находитесь в виртуальной среде.
```
(taskplanner)<a href='https://sites.google.com/a/chromium.org/chromedriver/downloads' target='_blank' rel='nofollow'>munsterberg@Lenovo ~/workspace] $
```
Если это не похоже, просто введите:
```
workon taskplanner
```
Теперь мы можем установить Django:
```
pip install Django
```
## Создайте наш проект Django
С установленным Django мы можем создать наш проект:
```
django-admin.py startproject taskplanner
```
Затем перейдите в наш новый проект, набрав:
```
cd taskplanner
```
Прежде чем что-либо сделать, давайте установим этот каталог как наш рабочий каталог с помощью virtualenvwrapper:
```
setvirtualenvproject
```
**Sidenote** : для списка команд `virtualenvwrapper` введите `virtualenvwrapper` в ваш терминал.
Теперь, когда мы находимся в нашей виртуальной среде, мы можем ввести `cdproject` чтобы перейти прямо к нашей рабочей директории.
Каталог проектов должен выглядеть примерно так:
```
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
```
## Функциональное тестирование
Разработка, основанная на испытаниях, является широко используемой передовой практикой в ​​разработке программного обеспечения. Базисно, мы хотим сначала написать тест, который обязательно сработает, а затем записать наименьшее количество кода для прохождения этого теста. С Django наша цель - написать как функциональные тесты (также известные как интеграционные тесты, сквозные тесты и т. Д.), Так и модульные тесты в процессе разработки. Не потейте, тестирование не так сложно, как кажется!
Но сначала нам нужно создать новую виртуальную среду, предназначенную для тестирования. Откройте новую вкладку в своем терминале, перейдите в каталог проекта проекта и введите:
```
mkvirtualenv taskplanner_test --python=/usr/bin/python3
```
Теперь у вас должно быть 2 вкладки в вашем терминале, один в виртуальной среде (taskplanner), а другой в виртуальной среде (taskplanner\_test).
Если вы запишете `pip freeze` в нашей новой тестовой среде (taskplanner\_test), вы заметите, что ничего не появляется. Это связано с тем, что мы еще ничего не установили в нашей новой среде.
Итак, давайте начнем и сначала установим Django в нашу тестовую среду (taskplanner\_test):
```
pip install Django
```
Для создания наших функциональных тестов нам понадобится несколько вещей. Во-первых, нам нужно установить веб-браузер Firefox на нашем компьютере. Если у вас нет Firefox, установите это сейчас.
**Sidenote** : вы можете использовать Chrome для тестирования интеграции, но вам нужно скачать драйвер [здесь](https://sites.google.com/a/chromium.org/chromedriver/downloads) и выполнить [этот вопрос переполнения стека](http://stackoverflow.com/questions/13724778/how-to-run-selenium-webdriver-test-cases-in-chrome) . У Firefox была исторически более высокая производительность, чем хром при выполнении интеграционных тестов, что очень важно, поскольку по сравнению с модульными тестами интеграционные тесты очень медленные.
Это связано с тем, что интеграционные тесты проверяют **всю** систему, а не «единицы» (небольшие компоненты). В реальном мире иногда лучше избегать интеграционных тестов из-за длительного времени разработки для их создания, медленного времени выполнения, неоднозначных ошибок и других причин, которые вы могли бы обнаружить со временем.
Тем не менее, они по-прежнему заслуживают нашего внимания при разработке приложения реального мира и могут быть очень полезными с точки зрения надежности, несмотря на недостатки производительности.
Затем нам нужно установить пакет под названием [Selenium](http://selenium.googlecode.com/svn/trunk/docs/api/py/index.html) . Этот пакет предоставит нам WebDriver, чтобы мы могли контролировать браузер с помощью наших тестов. Selenium обычно используется для автоматизации вашего браузера.
```
pip install selenium
```
Теперь, когда мы установили это, нам понадобится каталог для создания наших тестов:
```
mkdir functional_tests
```
В каталоге `taskplanner` вы должны увидеть следующее:
```
taskplanner
|-- functional_tests
|--- manage.py
|--- taskplanner
...
```
Теперь нам нужно создать несколько файлов в нашей папке `functional_tests` . Мы создадим файл `__init__.py` (это скажет, что python будет рассматривать `functional_tests` такие как пакет) и файл `test_all_users.py` чтобы содержать наши тесты.
Давайте сделаем это сейчас:
```
touch functional_tests/__init__.py
touch functional_tests/test_all_users.py
```
**Sidenote** : `__init__.py` почти всегда пустой файл. Дополнительные сведения о том, для чего он используется, см. В [этом ответе stackoverflow.](http://stackoverflow.com/questions/448271/what-is-init-py-for)
Наконец, мы можем начать писать наш первый функциональный тест! Функциональные тесты предназначены для тестирования фрагментов функциональности в нашем веб-приложении. TDD с Python описывает функциональные тесты как «как приложение работает с точки зрения пользователя».
Итак, давайте `test_all_users.py` файл `test_all_users.py` в нашем текстовом редакторе. Во-первых, мы хотим импортировать webdriver selenium, и сделать это намного проще, Django предоставляет что-то известное как StaticLiveServerTestCase для тестирования в реальном времени. Давайте импортируем оба из них:
```
from selenium import webdriver
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
```
Поскольку мы тестируем с точки зрения пользователей, давайте назовем эти тесты NewVisitorTest. Добавьте следующее:
```
class NewVisitorTest(StaticLiveServerTestCase):
def setUp(self):
self.browser = webdriver.Firefox()
self.browser.implicitly_wait(2)
def tearDown(self):
self.browser.quit()
```
Во-первых, мы создаем класс StaticLiveServerTestCase с именем NewVisitorTest, это будет содержать наши тесты, которые мы хотим запустить для нового посетителя. Затем мы имеем два метода с именем setUp и tearDown. Метод setUp инициализируется при выполнении наших тестов. Итак, для каждого теста, который мы запускаем, мы открываем Firefox и ждем 2 секунды для загрузки страницы. tearDown запускается после завершения каждого теста, этот метод закрывает браузер для нас после каждого теста.
Теперь мы можем написать наш первый тест, и Firefox откроется и закроется автоматически для нас. Теперь напишем наш тест ниже метода tearDown.
```
def test_home_title(self):
self.browser.get('http://localhost:8000')
self.assertIn('Welcome to Django', self.browser.title)
```
Наш первый тест, как интересно! Давайте пройдем через это. Каждый тест, который мы хотим создать, должен начинаться с «теста». Например, если бы я хотел создать тест для моего css, я бы назвал метод `test_h2_css` . Итак, здесь мы назвали `test_home_title` . Это довольно самоочевидно, что мы и хотим для наших тестов. Сначала метод приводит Firefox к URL- `http://localhost:8000` , а затем проверяет, находится ли «Добро пожаловать в Django» в заголовок заголовка html.
Давайте проверим этот тест и посмотрим, что получится:
```
python manage.py test functional_tests
```
Во-первых, что именно мы печатаем здесь? Сценарий manage.py предоставляет нам что-то под названием «тест», мы будем использовать его для выполнения всех наших тестов. Здесь мы запускаем его в нашем пакете `functional_tests` , который мы создали с помощью файла `__init__.py` .
После запуска в вашем терминале вы увидите следующее:
```
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)
```
Так что это провалилось, но это дало нам удобный совет. Во-первых, AssertionError. «Добро пожаловать в Django» не найден в «Странице загрузки проблем». Таким образом, это означает, что заголовок `http://localhost:8000` был «Страница загрузки проблемы». Если вы перейдете к URL-адресу, вы увидите, что веб-страница недоступна.
Попробуем запустить наш сервер Django, чтобы пройти тест. Вернитесь на вкладку терминала, которая находится в виртуальной среде `taskplanner` и запустите наш сервер.
```
python manage.py runserver
```
Вы должны увидеть что-то вроде следующего:
```
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 http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```
Не беспокойтесь о сообщении о непримененной миграции.
Теперь, когда у нас есть сервер, запущенный на `http://localhost:8000` , снова запустите наш тест.
Вернитесь на другую вкладку терминала, `taskplanner_test` виртуальной среде `taskplanner_test` и выполните следующее:
```
python manage.py test functional_tests
```
Вы должны увидеть следующее.
```
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 4.033s
OK
Destroying test database for alias 'default'...
```
## Что мы сделали до сих пор
Наш первый тест!
Мы подробно рассмотрели эту статью. Мы создали наш первый проект, настроили виртуальные среды как для разработки, так и для тестирования, написали наш первый функциональный тест и следовали тестовому процессу разработки, написав неудачный тест, а затем заставив его пройти.
## Использование шаблонов стартера
Вы можете сэкономить много времени, отправив свой проект с шаблоном стартера django. Эти проекты используют лучшие методы, которые помогут вам сэкономить головные боли позже, когда ваш проект будет расти. Некоторые из наиболее популярных проектов:
* [Cookiecutter](https://github.com/pydanny/cookiecutter-django)
* [Hackathon starter](https://github.com/DrkSephy/django-hackathon-starter)
* [край](https://github.com/arocks/edge)