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