Django 튜토리얼 : Django 2.0 시작하기

Django는 Ruby on Rails에서 영감을 얻은 단일 크기의 Python 웹 프레임 워크로, 웹 개발을 빠르고 쉽게 만들기 위해 동일한 은유를 많이 사용합니다. 완전히로드되고 유연한 Django는 Python에서 가장 널리 사용되는 웹 프레임 워크 중 하나가되었습니다.

Django에는 모든 크기의 웹 애플리케이션을 빌드하는 데 필요한 거의 모든 것이 포함되어 있으며 그 인기 덕분에 다양한 시나리오에 대한 예제와 도움말을 쉽게 찾을 수 있습니다. Plus Django는 애플리케이션이 정상적으로 기능을 발전 및 추가하고 데이터 스키마 (있는 경우)를 마이그레이션 할 수있는 도구를 제공합니다.

Django는 또한 많은 구성 요소와 많은 "내부"구성이 필요한 복잡한 것으로 유명합니다. 실제로 간단한 앱을 비교적 짧은 시간에 실행하고 필요에 따라 기능을 확장 할 수 있습니다.

이 가이드에서는 기본적인 Django 2.0 앱을 만드는 과정을 살펴보고 웹 개발자에게 제공하는 가장 중요한 기능에 대해 간략하게 설명합니다.

Django 1.x에서 업그레이드

이전 버전의 Django 1.x를 사용해 본 경험이 있다면 다음과 같은 주요 변경 사항을 염두에 두어야합니다.

  • Django 2.0 은 Python 3.4 이상 지원합니다. Python 2.x는 향후 Django 버전에서 지원되지 않습니다.
  • Django 2는 가능한 한 네이티브 유니 코드 문자열을 사용하는 Python 3의 패턴을 따릅니다. 일부 Django 함수는 더 이상 바이트 문자열을 입력으로 받아들이지 않습니다. 

이전 버전과 호환되지 않는 다른 많은 변경 사항이 있지만 특히 새 프로젝트를 시작할 때 가장 중요한 두 가지 변경 사항이 있습니다.

Django의 핵심 라이브러리 설치

Django 2.0을 설치하려면 Python 3.4 이상이 필요합니다. 그런 다음 Django를 설치하는 가장 쉬운 방법은 Python의 pip유틸리티를 사용하는 것입니다.

pip install django

이렇게하면 django-adminDjango 프로젝트 관리에 사용되는 핵심 Django 라이브러리와 명령 줄 유틸리티가 설치됩니다.

여러 버전의 Django를 나란히 사용하려면 가상 환경을 만들고 원하는 버전의 Django를 설치 한 다음 해당 Django 프로젝트에 사용하십시오.

Django의 단일 인스턴스로 여러 프로젝트 를 만들기 위해 가상 환경을 사용할 필요가 없습니다 .  서로 다른 프로젝트 에서 Django 프레임 워크 의 서로 다른 포인트 개정판을 사용하기 위해서만 필요합니다 .

새로운 Django 프로젝트 만들기

Django 인스턴스는 프로젝트앱의 두 계층으로 구성됩니다 .

  • 프로젝트는 자체 데이터베이스 구성, 설정 및 응용 프로그램과 장고의 인스턴스입니다. 프로젝트를 사용할 모든 사이트 수준 구성을 저장하는 장소로 생각하는 것이 가장 좋습니다.
  • 응용 프로그램은 자신의 경로 및 렌더링 로직, 프로젝트의 하위 구분입니다. 하나의 Django 프로젝트에 여러 앱을 배치 할 수 있습니다. 

새 Django 프로젝트를 처음부터 만들려면 프로젝트를 저장할 디렉토리를 입력하고 다음을 입력합니다.

django-admin startproject

여기서는 프로젝트와 프로젝트가 저장 될 하위 디렉토리의 이름입니다. Python 또는 Django에서 내부적으로 사용하는 이름과 충돌 할 가능성이없는 이름을 선택해야합니다. 같은 이름 myproj은 잘 작동합니다.

결과 디렉터리에는  manage.py명령 줄에서 앱의 동작을 제어하는 ​​데 사용되는 파일과 다음 파일이 포함 된 다른 하위 디렉터리 (프로젝트 이름 포함)가 포함되어야합니다.

  • __init__.py파이썬에서 사용되는 파일, 코드 모듈과 같은 서브 디렉토리를 지정.
  • settings.py, 프로젝트에 사용 된 설정을 보유합니다. 가장 일반적인 설정 중 대부분이 미리 채워집니다.
  • urls.py, Django 프로젝트에서 사용할 수있는 경로 또는 URL을 나열하거나 프로젝트가 응답을 반환합니다.
  • wsgi.py는 Apache HTTP 또는 Nginx와 같은 WSGI 호환 웹 서버에서 프로젝트의 앱을 제공하는 데 사용됩니다.

무엇보다 먼저 프로젝트가 작동하는지 테스트하십시오. 프로젝트 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 정규화를위한 많은 내장 함수가 포함되어 있습니다. 또한 암호화 인증서 사용, 사이트 간 위조 방지 또는 클릭 재킹 방지와 같은 일반적인 보안 요구 사항을위한 도구를 번들로 제공합니다.