Урок за Django: Започнете с Django 2.0

Django е универсална уеб рамка на Python, която е вдъхновена от Ruby on Rails и използва много от същите метафори, за да направи уеб разработката бърза и лесна. Напълно зареден и гъвкав, Django се превърна в една от най-широко използваните уеб рамки на Python.

Django включва практически всичко необходимо за изграждане на уеб приложение с всякакъв размер и неговата популярност улеснява намирането на примери и помощ за различни сценарии. Плюс Django предоставя инструменти, които позволяват на приложението ви да се развива и добавя елегантно функции и да мигрира неговата схема за данни (ако има такава).

Django също има репутацията на сложен, с много компоненти и необходима доста конфигурация „под капака“. В интерес на истината можете да получите просто приложение, което да работи в сравнително кратък ред, след което да разширите неговата функционалност от там, ако е необходимо.

В това ръководство ще разгледаме създаването на елементарно приложение Django 2.0 и ще разгледаме накратко най-важните функции, които предоставя за уеб разработчиците.

Надстройка от Django 1.x

Ако имате опит с по-ранна версия 1.x на Django, това са най-важните промени, които трябва да имате предвид:

  • Django 2.0 поддържа само Python 3.4 и по-нови версии. Python 2.x няма да се поддържа в бъдещите версии на Django.
  • Django 2 следва модела на Python 3 за използване на собствени Unicode низове, където е възможно. Някои функции на Django вече няма да приемат bytestings като вход. 

Има много други несъвместими назад промени, но те са две от най-значимите, особено при стартиране на нови проекти.

Инсталиране на основните библиотеки на Django

За да инсталирате Django 2.0, ще ви трябва Python 3.4 или по-нова. Тогава най-лесният начин да инсталирате Django е чрез pipпомощната програма на Python :

pip install django

Това инсталира основните библиотеки на Django и django-adminпомощната програма на командния ред, използвани за управление на проекти на Django.

Ако искате да работите с множество версии на Django една до друга, създайте виртуална среда, инсталирайте желаната версия на Django там и я използвайте за въпросния проект Django.

Имайте предвид, че не е необходимо да използвате виртуални среди, за да създавате множество проекти с един екземпляр на Django. Нужни са ви само за да използвате различни ревизии на точки на рамката на Django  с различни проекти.

Създаване на нов проект на Django

Екземплярите на Django са организирани на две нива: проекти и приложения .

  • А проект е пример за Django с неговите собствени конфигурационни данни, настройки и приложения. Най-добре е да мислите за проект като място за съхранение на всички конфигурации на ниво сайт, които ще използвате.
  • Едно приложение е подразделение на даден проект, със свой собствен маршрут и оказване логика. В един проект на Django могат да се поставят множество приложения. 

За да създадете нов проект на Django от нулата, въведете директорията, където искате да съхраните проекта, и напишете:

django-admin startproject

където е името както на проекта, така и на поддиректорията, където ще се съхранява проектът. Не забравяйте да изберете име, което е малко вероятно да се сблъска с име, използвано от Python или Django вътрешно. Име като myprojще работи добре.

Получената директория трябва да съдържа  manage.pyфайл, който се използва за управление на поведението на приложението от командния ред, и друга поддиректория (също с името на проекта), която съдържа следните файлове:

  • Един __init__.pyфайл, който се използва от Python да посочи поддиректория като код модул.
  • settings.py, който съдържа настройките, използвани за проекта. Много от най-често срещаните настройки ще бъдат предварително попълнени за вас.
  • urls.py, в който са изброени маршрутите или URL адресите, достъпни за вашия проект Django, или за които проектът ще върне отговори.
  • wsgi.py, който се използва от WSGI-съвместими уеб сървъри, като Apache HTTP или Nginx, за да обслужва приложенията на вашия проект.

Преди нещо друго, тествайте проекта, за да се уверите, че той функционира. От командния ред в директорията, съдържаща manage.pyфайла на вашия проект , изпълнете:

python manage.py runserver

Това трябва да стартира уеб сървър за разработка, достъпен на //127.0.0.1:8000/. Посетете тази връзка и ще видите проста страница за посрещане, която ви казва, че инсталацията е била успешна.

Имайте предвид, че уеб сървърът за разработка не трябва да се използва за обслужване на проект на Django за обществеността. Няма да се мащабира, за да се справи с необходимия трафик.

Създаване на приложение на Django

След това трябва да създадем приложение в този проект. Придвижете се до същата директория като manage.pyи издайте тази команда:

python manage.py startapp myapp

Това създава поддиректория за приложение с име, myapp което съдържа следното:

  • А migrationsдиректория. Съдържа код, използван за мигриране на сайта между версии на неговата схема на данни.
  • admin.py. Съдържа обекти, използвани от вградените инструменти за администриране на Django. Ако приложението ви има администраторски интерфейс или привилегировани потребители, ще конфигурирате свързаните обекти тук.
  • apps.py. Предоставя информация за конфигурацията на приложението на проекта като AppConfigобект.
  • models.py. Съдържа обекти, които дефинират структури от данни, използвани от вашето приложение за взаимодействие с бази данни.
  • tests.py. Съдържа всички тестове, използвани, за да се гарантира, че функциите и модулите на вашия сайт работят по предназначение.
  • views.py. Съдържа функции, които показват и връщат отговори.

За да започнем да работим с приложението, първо трябва да го регистрираме в проекта. За да направите това, редактирайте myproj/settings.pyи добавете ред в горната част на INSTALLED_APPSсписъка:

INSTALLED_APPS = [ ‘myapp.apps.MyappConfig’, ‘django.contrib.admin’, ... 

Ако погледнете myapp.apps, ще видите предварително генериран обект с име MyappConfig, на което се позоваваме тук.

Добавяне на маршрути и изгледи към вашето приложение Django

Приложенията на Django следват основен модел за обработка на заявки:

  • Когато се получи входяща заявка, Django анализира URL адреса за маршрут, към който да го приложи.
  • Маршрутите са дефинирани в urls.py, като всеки маршрут е свързан с изглед , т.е. функция, която връща данните, които трябва да бъдат изпратени обратно на клиента. Изгледите могат да бъдат разположени навсякъде в проект на Django, но те са най-добре организирани в собствени модули.
  • Views can contain the results of a template, i.e. code that formats requested data according to a certain design.

To get an idea of how all these pieces fit together, let’s modify the default route of our sample app to return a custom message.

Routes are defined in urls.py in a list named urlpatterns. If you open the sample urls.py, you’ll see urlpatterns already predefined:

urlpatterns = [ path(‘admin/’, admin.site.urls), ] 

The path function—a Django built-in—takes a route and a view function as arguments and generates a reference to a URL path. By default, Django creates an admin path that is used for site administration, but we need to create our own routes.

Add another entry, so that the whole file looks like:

from django.contrib import admin from django.urls import include, path urlpatterns = [ path(‘admin/’, admin.site.urls), path(‘myapp/’, include(‘myapp.urls’)) ] 

The include function tells Django to look for more route pattern information in the file myapp.urls. All of the routes found in that file will be attached to the top-level route myapp (e.g., //127.0.0.1:8080/myapp).

Next, create a new urls.py in myapp and add the following:

from django.urls import path from . import views urlpatterns = [ path(‘’, views.index) ] 

Django prepends a slash to the beginning of each URL, so to specify the root of the site (/), we just supply a blank string as the URL.

Now edit the file myapp/views.py so it looks like this:

from django.http import HttpResponse def index(request): return HttpResponse(“Hello, world!”) 

django.http.HttpResponse is a Django built-in that generates an HTTP response from a supplied string. Note that request, which contains the information for an incoming HTTP request, must be passed as the first parameter to a view function.

Stop and restart the development server, and navigate to //127.0.0.1:8000/myapp/. You should see Hello, world! appear in the browser.

Adding routes with variables in Django

Django can accept routes that incorporate variables as part of their syntax. Let’s say you wanted to accept URLs that had the format year/. You could accomplish that by adding the following entry to urlpatterns:

path(‘year/’, views.year) 

The view function views.year would then be invoked through routes like year/1996, year/2010, and so on, with the variable year passed as a parameter to views.year.

To try this out for yourself, add the above urlpatterns entry to myapp/urls.py, then add this function to myapp/views.py:

def year(request, year): return HttpResponse(‘Year: {}’.format(year)) 

If you navigate to /myapp/year/2010 on your site, you should see Year: 2010 displayed in response. Note that routes like /myapp/year/rutabaga will yield an error, because the int: constraint on the variable year allows only an integer in that position. Many other formatting options are available for routes.

Earlier versions of Django had a more complex and difficult-to-parse syntax for routes. If you still need to add routes using the old syntax—for instance, for backward compatibility with an old Django project—you can do so by using the django.urls.re_path function.

Django templates

Django’s built-in template language can be used to generate web pages from data.

Templates used by Django apps are stored in a directory that is central to the project: /templates//. For our myapp project, the directory would be myapp/templates/myapp/. This directory structure may seem a little awkward, but Django can look for templates in multiple places, so this avoids name collisions between templates with the same names across multiple apps.

In your myapp/templates/myapp/ directory, create a file named year.html with the following content:

Year: {{year}} 

Any value within double curly braces in a template is treated as a variable. Everything else is treated literally.

Modify myapp/views.py to look like this:

from django.shortcuts import render from django.http import HttpResponse def index(request): return HttpResponse(“Hello, world!”) def year(request, year): data = {’year’:year} return render(request, ‘myapp/year.html’, data) 

The render function, a Django “shortcut” (a combination of multiple built-ins for convenience), takes the existing request object, looks for the template myapp/year.html in the list of available template locations, and passes the dictionary data to it as context for the template.

The amount of processing you can perform on data within Django templates is intentionally quite limited. Django’s philosophy is to enforce separation of presentation and business logic whenever possible. Thus you can loop through an iterable object, and you can perform if/then/else tests, but modifying the data within a template is frowned upon.

For instance, a simple “if” test can be encoded this way:

{% if year > 2000 %} 21st century year: {{year}} {% else %} Pre-21st century year: {{year}} {% endif %} 

The {% and %} markers delimit blocks of code that can be executed in Django’s template language.

If you want to use a more sophisticated template processing language, you can swap in others, such as Jinja2 or Mako. Django includes back-end integration for Jinja2, but any template language that returns a string can be used—for instance, by returning that string in a HttpResponse object as in the case of our ”Hello, world!” route.

Next steps with Django

What we’ve seen here covers only the most basic elements of a Django application. Django includes a great many other components that can be employed in a web project. All of these are worth discussing in detail separately, but I will leave you with a brief overview:

  • Databases and data models. Django’s built-in ORM can be used to define data structures and relationships between them for your app, as well as migration paths between versions of those structures.

  • Форми . Django осигурява последователен начин за изгледите да предоставят входни формуляри на потребител, да извличат данни, да нормализират резултатите и да осигуряват последователно докладване за грешки.

  • Сигурност и комунални услуги . Django включва много вградени функции за кеширане, регистриране, обработка на сесии, обработка на статични файлове и нормализиране на URL адреси. Той също така обединява инструменти за общи нужди за сигурност, като например използване на криптографски сертификати или предпазване от защита от фалшифициране между страници или щракване.