Како створити пројекат помоћу Дјанга

Сада када знамо како да креирамо виртуелно окружење и користимо пип, можемо започети изградњу нашег пројекта. У овом чланку ћемо створити наш први Дјанго пројекат, написати тестове и покренути наш развојни сервер.

Стварање виртуелног окружења

Прво, креирајмо ново виртуелно окружење за овај пројекат. (Ако већ нисте, деактивирајте претходни виртуаленв укуцавањем deactivateтерминала). За више информација о виртуелним окружењима и начину њиховог коришћења посетите ову страницу.

Дођите до директорија у којем желите пројекат Дјанго и укуцајте следеће у терминал:

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

Можда ћете морати да промените своју Питхон путању ако изгледа другачије од оне горе.

Шкољка командне линије сада би требала изгледати као испод, што указује на то да сте у виртуелном окружењу.

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

Ако то не изгледа тако, само откуцајте:

workon taskplanner

Сада можемо инсталирати Дјанго:

pip install Django

Креирајте наш Дјанго пројекат

Са инсталираним Дјанго-ом можемо створити наш пројекат:

django-admin.py startproject taskplanner

Затим уђите у наш нови пројекат тако што ћете откуцати:

cd taskplanner

Пре него што било шта учинимо, поставимо овај директоријум као наш радни директоријум помоћу виртуаленввраппер:

setvirtualenvproject

Сиденоте : За листу команди виртуаленввраппер унесите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

Функционално испитивање

Развој вођен тестом је широко коришћена најбоља пракса у развоју софтвера. У основи, прво желимо да напишемо тест који ће сигурно пропасти, а затим напишемо најмању могућу количину кода да бисмо положили тај тест. Наш циљ је са Дјанго-ом да напишемо и функционалне тестове (познате и као; интеграциони тестови, тестови од краја до краја, итд.) И јединствене тестове током целог развоја. Не знојите се, тестирање није тако тешко као што се чини!

Али прво, морамо створити ново виртуелно окружење посвећено тестирању. Отворите нову картицу на терминалу, идите до директорија пројекта вашег планера задатака и унесите:

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

Сада би на вашем терминалу требало да буду отворене 2 картице, једна у виртуелном окружењу (планера задатака), а друга у виртуелном окружењу (задатак плана планера).

Ако укуцате pip freezeнаше ново окружење за тестирање (таскпланнер_тест), приметићете да се ништа не појављује. То је зато што још увек нисмо ништа инсталирали у нашем новом окружењу.

Дакле, хајде да прво инсталирамо Дјанго у наше окружење за тестирање (таскпланнер_тест):

pip install Django

Да бисмо креирали своје функционалне тестове, требаће нам неколико ствари. Прво, у нашој машини мора бити инсталиран веб прегледач Фирефок. Ако немате Фирефок, инсталирајте га сада.

Сиденоте : Можете да користите Цхроме за тестирање интеграције, али овде морате да преузмете управљачки програм и следите ово питање о преливању стека. Фирефок је имао историјски боље перформансе од хрома приликом покретања интеграционих тестова, што је веома важно због тога што су у поређењу са јединственим тестовима интеграциони тестови изузетно спори.

То је зато што интеграциони тестови тестирају читав систем, а не „јединице“ (мале компоненте). У стварном свету је понекад најбоље избегавати интеграционе тестове због дугог времена израде за њихово креирање, спорог времена рада, двосмислених грешака и других разлога које бисте открили на време.

Међутим, они су и даље вредни нашег разматрања при развоју апликације из стварног света и могу бити врло корисни у погледу поузданости упркос лошим перформансама.

Даље, морамо да инсталирамо пакет под називом Селениум. Овај пакет ће нам пружити ВебДривер како бисмо могли да контролишемо прегледач помоћу наших тестова. Селен се обично користи за аутоматизацију вашег прегледача.

pip install selenium

Сада када смо то инсталирали, требат ће нам директоријум за израду наших тестова:

mkdir functional_tests

У taskplannerдиректоријуму би сада требало да видите следеће:

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

Сада треба да креирамо неколико датотека у нашој functional_testsфасцикли. Направићемо __init__.pyдатотеку (ово ће рећи питхону да се понаша functional_testsкао пакет) и test_all_users.pyдатотеку која садржи наше тестове.

Урадимо то сада:

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

Сиденоте :__init__.pyје готово увек празна датотека. За више информација о томе за шта се користи погледајте овај одговор на стацковерфлов.

Напокон можемо почети са писањем нашег првог функционалног теста! Функционални тестови служе за тестирање делова функционалности наше веб апликације. ТДД са Питхоном описује функционалне тестове као „како апликација функционише са становишта корисника“.

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

Можете уштедети много времена покретањем вашег пројекта дјанго почетним предлошком. Ови пројекти користе најбоље праксе које ће вам уштедети главобољу касније када ваш пројекат расте. Неки од најпопуларнијих пројеката су

  • Резач колачића
  • Хацкатхон стартер
  • Ивица