Django

django是python的web框架。

https://github.com/django/django

https://www.djangoproject.com/

https://docs.djangoproject.com/zh-hans/3.1/contents/

django遵守MVC设计模式,采用MTV框架。

M: model,数据存取

T: template,如何展现数据

V: view,展现哪些数据

安装

https://docs.djangoproject.com/zh-hans/3.1/faq/install/#faq-python-version-support

django1.11是最后一个支持python2.7的长期支持版(2017.4).

django2.0开始只支持python3(2018).

本文以django3.1为例创建名为next的project.

virtualenv中安装:

$mkdir next
$cd next
$virtualenv .venv

# mac/linux
$source .venv/bin/activate

# windows
>cd .venv/Scripts
>activate

$pip install django

验证安装:

$python
>>>import django
>>>django.VERSION
>>>django.get_version()

安装使用的数据库引擎的库:

$ sudo udo apt-get install libmysqlclient-dev
$ pip install mysqlclient

$pip install psycopg2

$pip install cx_Oracle

django默认是mysqlclient,可以使用pymysql替代:

# vim settings.py
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()

project

创建一个名为next的项目

$ cd next
$ django-admin startproject next.

next
|-- manage.py
|-- next
    |- __init__.py
    |- settings.py
    |- urls.py
    |- wsgi.py
    |- asgi.py

next 最外层根目录只是你项目的容器, 根目录名称对Django没有影响,你可以将它重命名为任何你喜欢的名称。

manage.py: 一个让你用各种方式管理 Django 项目的命令行工具。你可以阅读 django-admin and manage.py 获取所有 manage.py 的细节。

templates: project的模版.

next 里层的目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 (比如 next.urls).

next/init.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。如果你是 Python 初学者,阅读官方文档中的 更多关于包的知识。

next/settings.py:Django 项目的配置文件。如果你想知道这个文件是如何工作的,请查看 Django 配置 了解细节。

next/urls.py:Django 项目的 URL 声明,就像你网站的“目录”。阅读 URL调度器 文档来获取更多关于 URL 的内容。

next/asgi.py:作为你的项目的运行在 ASGI 兼容的Web服务器上的入口。阅读 如何使用 ASGI 来部署 了解更多细节。

next/wsgi.py:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。阅读 如何使用 WSGI 进行部署 了解更多细节。

验证开发服务器:

$python manage.py runserver
$python manage.py runserver <ip address>:<port>
> py manage.py runserver

浏览器输入:

http://127.0.0.1:8000

settings.py

默认enable的app:

INSTALLED_APPS = [
    'django.contrib.admin', //管理员站点, 你很快就会使用它。 
    'django.contrib.auth', //认证授权系统。
    'django.contrib.contenttypes', //内容类型框架。/
    'django.contrib.sessions', //会话框架。 
    'django.contrib.messages', //消息框架。 
    'django.contrib.staticfiles', //管理静态文件的框架。 
]

默认开启的某些应用需要至少一个数据表,所以,在使用他们之前需要在数据库中创建一些表
$ python manage.py migrate
> py manage.py migrate

默认enable的midleware:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

支持的template:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    }
]

默认的数据库:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
        'TEST': {
            // 默认测试数据库是test_ 加 default.NAME,TEST可以指定数据库名字.
            'NAME': 'test_db'
        }
    }
}

// 可扩展的数据库
ENGINE:
    django.db.backends.mysql
    django.db.backends.oracle
    django.db.badkends.postgresql_psycopg2

NAME:
    your database name

USER:
    your database username

PASSWORD:
    your database password

HOST:
    local database or remote database

PORT:
    database port

其它配置:

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = '-%b)79izbio$!(g!0io(he)giaqi1@))fzfq!t3s1g1dzysc(r'

WSGI_APPLICATION = 'next.wsgi.application'

ROOT_URLCONF = 'next.urls'

DEBUG = True # 开发用来调试
DEBUG = False # 部署之后关闭

ALLOWED_HOSTS = [] # 设置哪些域名可以访问,优先级高于web服务器,debug=false必须设置
ALLOWED_HOSTS = [''*''] # 允许所有域名访问

STATIC_URL = '/static/'
STATIC_ROOT = '/path/to/static'
# static目录存放js/css等静态文件,collectstatic命令用来收集静态文件。

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True

urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

在项目的urls添加所有应用的urls,为每个应用独立创建urls,方便管理。

wsgi.py

Web Server Gateway Interface.

import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'next.settings')
application = get_wsgi_application()
django通过wsgi来部署,参考django的deploy。

asgi.py

Asynchronous Server Gateway Interface.

import os
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'next.settings')
application = get_asgi_application()

application

应用,一个项目可以有多个应用,一个应用可以用到多个项目中。

可以单独打包应用发布到pypi,包名格式django-project,参考python的打包方法。

创建一个名为polls的应用:

$python manage.py startapp polls
> py manage.py startapp polls

polls/
|- __init__.py
|- admin.py
|- apps.py
|- models.py
|- views.py
|- tests.py (tests/test_case.py)
|- migrations
   |- __init__.py
|- templates
   |- polls
      |- index.html
|- static
   |- polls
      |- style.css

admin.py admin管理界面

apps.py

models.py 模型

views.py 视图

urls.py 新建的application的url

test.py 测试

migrations 迁移文件夹

templates 应用的模版文件夹

static 静态文件


django-admin & manage.py

[staticfiles]
    collectstatic # 设置STATIC_ROOT = '/var/www/static/project/'用来收集静态文件
    findstatic
    runserver # 启动django自带的web开发服务器

[sessions]
    clearsessions

[auth]
    changepassword
    createsuperuser
    
[contenttypes]
    remove_stale_contenttypes

[django]

    startapp
    
    startproject
    
    check
    compilemessages
    createcachetable
    dbshell # 数据库命令行
    diffsettings
    
    dumpdata # 导出数据 (json, xml, yaml)
    dumpdata > db.json
    flush # 清空数据库
    loaddata # 导入数据
    loaddata db.json
    
    inspectdb
    makemessages
    
    makemigrations # 创建迁移文件
    migrate # 创建/更新表结构(执行迁移文件)
    
    sendtestemail
    shell # 项目环境终端
    showmigrations # 查看可迁移的文件
    sqlflush
    sqlmigrate # 查看迁移文件会执行哪些sql
    sqlsequencereset
    squashmigrations
    
    test
    
    testserver