DjangoDjango入門


備註

Django將自己宣傳為“完美主義者的最後期限的網絡框架”和“Django使用更少的代碼更快地構建更好的Web應用程序”。它可以被視為MVC架構。它的核心是:

  • 用於開發和測試的輕量級獨立Web服務器
  • 表單序列化和驗證系統,可以在HTML表單和適合存儲在數據庫中的值之間進行轉換
  • 一個模板系統,它利用從面向對象編程中藉用的繼承概念
  • 一個緩存框架,可以使用任何一種緩存方法支持中間件類,這些類可以在請求處理的各個階段進行干預並執行自定義函數
  • 內部調度程序系統,允許應用程序的組件通過預定義的信號相互通信
  • 國際化系統,包括將Django自己的組件翻譯成各種語言
  • 一個序列化系統,可以生成和讀取Django模型實例的XML和/或JSON表示
  • 用於擴展模板引擎功能的系統
  • Python內置單元測試框架的接口

版本

發布日期
1.11 2017年4月4日
1.10 2016年8月1日
1.9 2015年12月1日
1.8 2015-04-01
1.7 2014年9月2日
1.6 2013年11月6日
1.5 2013年2月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

一個完整的hello world示例。

步驟1如果您已經安裝了Django,則可以跳過此步驟。

pip install Django
 

步驟2創建一個新項目

django-admin startproject hello
 

這將創建一個名為hello 的文件夾,其中包含以下文件:

hello/
├── hello/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py
 

步驟3hello 模塊(包含__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項目模板很好但是一旦你開始部署你的代碼,例如devops將他們的手放在項目上,事情會變得混亂。您可以做的是將源代碼與存儲庫中所需的其他代碼分開。

您可以在GitHub上找到可用的Django項目模板。

項目結構

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
 

我喜歡為每個項目保留名為serviceservice 目錄,這要歸功於我可以在所有項目中使用相同的Dockerfile 。需求和設置的拆分已在此處詳細記錄:
使用多個需求文件
使用多個設置

Dockerfile

假設只有開發人員使用Docker(現在並不是每個開發人員都信任它)。這可能是一個開發環境devel.dockerfile

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緩存 - 您只需要在需求更改時重建。

撰寫

Docker組合派上用場 - 特別是當你有多個本地運行的服務時。 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項目是一個包含Django設置文件的Python代碼庫。 Django管理員可以通過命令django-admin startproject NAME 創建項目。該項目通常在頂層有一個名為manage.py 的文件和一個名為urls.py 的根URL文件。 manage.pydjango-admin 的項目特定版本,允許您在該項目上運行管理命令。例如,要在本地運行項目,請使用python manage.py runserver 。一個項目由Django應用程序組成。

Django應用程序是一個Python包,其中包含模型文件(默認情況下為models.py )和其他文件,例如特定於應用程序的URL和視圖。可以通過命令django-admin startapp NAME 創建應用程序(此命令應該從項目目錄中運行)。要使應用程序成為項目的一部分,它必須包含在settings.py 中的INSTALLED_APPS 列表中。如果您使用標準配置,Django會附帶幾個預裝了自己應用程序的應用程序,這些應用程序將為您處理身份驗證等事務。應用程序可用於多個Django項目。

Django ORM收集models.py 定義的所有數據庫模型,並根據這些模型類創建數據庫表。為此,首先,通過修改settings.pyDATABASES 設置來settings.py DATABASES 。然後,一旦定義了數據庫模型 ,運行python manage.py makemigrations 然後運行python manage.py makemigrations python manage.py migrate ,根據模型創建或更新數據庫的模式。

單文件Hello World示例

此示例顯示了在Django中創建Hello World頁面的最小方法。這將幫助您了解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的Web開發框架。 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構建的Web應用程序必須駐留在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
 

現在服務器正在運行,請使用您的Web瀏覽器訪問http://127.0.0.1:8000/ 。您將看到以下頁面:

在此處輸入圖像描述

默認情況下, runserver 命令在端口8000 的內部IP上啟動開發服務器。當您更改代碼時,此服務器將自動重新啟動。但是如果您添加新文件,則必須手動重新啟動服務器。

如果要更改服務器的端口,請將其作為命令行參數傳遞。

$ 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.pyviews.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 安裝的所有內容都將安裝到虛擬環境文件夾,而不是系統範圍。

要離開虛擬環境,請使用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時,在postactivate 腳本中設置PYTHONPATHDJANGO_SETTINGS_MODULE 通常很有用。

#!/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"
 

設置項目路徑

在基礎<env-folder> 的特殊.project 文件中設置項目路徑通常也很有幫助。執行此操作時,每次激活虛擬環境時,它都會將活動目錄更改為指定的路徑。

創建一個名為<env-folder>/.project 的新文件。該文件的內容應該只是項目目錄的路徑。

/path/to/project/directory
 

現在,啟動您的虛擬環境(使用source <env-folder>/bin/activateworkon my_virtualenv ),終端將目錄更改為/path/to/project/directory