Django构建、部署、启动

 

创建项目

django-admin startproject mysite

// 得到的目录结构
mysite/
	__init__.py
	manager.py
	db.sqlite3
	mysite/
		asgi.py
		wsgi.py
		settings.py
		urls.py

manager.py

Django 用于管理任务的命令行实用程序。

// 在本地机器上启动一个轻量级的开发 Web 服务器。默认 127.0.0.1:8000 。
manage.py runserver [addrport]

db.sqlite3

默认内置的数据库文件。

asgi.py

作为你的项目的运行在 ASGI 兼容的 Web 服务器上的入口。

wsgi.py

作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。

// Django 利用 DJANGO_SETTINGS_MODULE 环境变量来定位合适的配置模块。若未设置该变量,则使用这里指定的默认配置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')

// Django 的默认服务器( runserver 命令),从配置项 WSGI_APPLICATION 中获取 application 对象。默认使用这里的
application = get_wsgi_application()

settings.py

Django 项目的配置文件。

ALLOWED_HOST:默认:[]。一个代表这个 Django 网站可以服务的主机/域名的字符串列表。这是一个安全措施,以防止 HTTP 主机头攻击。

INSTALLED_APPS:默认:[]。一个字符串的列表,表示在这个 Django 安装中所有被启用的应用程序。每一个字符串都应该是一个 Python 的点分隔路径。应用程序配置类(首选),或包含应用程序的包。

MIDDLEWARE :默认:None。要使用的中间件列表。

ROOT_URLCONF:默认:未定义。一个字符串,代表你的根 URLconf 的完整 Python 导入路径。

TEMPLATES:默认:[]。一个包含所有 Django 模板引擎的配置的列表。列表中的每一项都是一个字典,包含了各个引擎的选项。
BACKEND:要使用的模板后端。内置的模板后端有:django.template.backends.django.DjangoTemplates、django.template.backends.jinja2.Jinja2。
NAME:这个特定模板引擎的别称。
DIRS:默认:[]。模板源文件的目录。
APP_DIRS:默认:False。引擎是否应该在已安装的应用程序中查找模板源文件。 – OPTIONS:默认值:{}。要传递给模板后台的额外参数。

WSGI_APPLICATION:Django 内置服务器(如 runserver)将使用的 WSGI 应用对象的完整 Python 路径。

STATIC_ROOT:默认:None。collectstatic 将收集静态文件进行部署的目录的绝对路径。

STATIC_URL:默认:None。引用位于 STATIC_ROOT 中的静态文件时要使用的 URL。

urls.py

根路由配置。把应用路由include进来。

Including another URLconf
from django.urls import include, path

urlpatterns = [
    path('blog/', include('blog.urls'))
]

默认安装的应用

django.contrib.admin

默认路由path('admin/', admin.site.urls)指向的管理员页面。

django.contrib.auth

认证授权系统

django.contrib.contenttypes

内容类型框架

django.contrib.sessions

会话框架

django.contrib.messages

消息框架

django.contrib.staticfiles

管理静态文件的框架

创建应用

cd mysite
django-admin startapp app
// 在app下创建缺失的文件和目录
// 最终得到的目录结构
mysite/
	......
	mysite/
		......
	app/
		__init__.py
		admin.py
		apps.py
		models.py
		views.py
		urls.py
		tests.py
		templates/app/
			index.html
		static/app/
			......
		migrations/
			__init__.py

apps.py

admin.py

models.py

from django.db import models


// 每个模型被表示为 django.db.models.Model 类的子类
class Question(models.Model):
	// 每个字段都是 Field 类的实例
	question_text = models.CharField(max_length=200)
	pub_date = models.DateTimeField('date published')
    

class Choice(models.Model):
	// 定义外键
	question = models.ForeignKey(Question, on_delete=models.CASCADE)
	choice_text = models.CharField(max_length=200)
	votes = models.IntegerField(default=0)
数据类型

AutoFieldSmallAutoFieldBigAutoField:根据可用的 ID 自动递增。

IntegerFieldSmallIntegerFieldBigIntegerField:整数。

PositiveIntegerFieldPositiveSmallIntegerFieldPositiveBigIntegerField:正值或零。

FloatField:float 实例表示的浮点数。

DecimalField:固定精度的十进制数。

BinaryField:原始二进制数据。

BooleanField:true/false 字段。

CharField:字符串字段。

TextField:大的文本。

JSONField:JSON 编码数据。

SlugField:只包含字母、数字、下划线或连字符。它们一般用于 URL 中。

URLField:URL 的 CharField。

UUIDField:通用唯一标识符。

DateField:日期。

TimeField:时间。

DateTimeField:日期和时间。

DurationField:时间段。

FileField:文件上传。

FilePathField:一个 CharField,其选择仅限于文件系统中某个目录下的文件名。

ImageField:有效的图像。

EmailField:电子邮件地址。

GenericIPAddressField:IPv4 或 IPv6 地址,字符串格式(如 192.0.2.30 或 2a02:42fe::4 )。

约束

primary_key如果设置为 True ,将该字段设置为该模型的主键。如果你没有为模型中的任何字段指定 primary_key=True,Django 会自动添加一个 AutoField 来保存主键。

uniqueunique_for_dateunique_for_monthunique_for_year如果设置为 True,这个字段必须在整个表中保持值唯一。

verbose_name字段的一个人类可读名称,如果没有给定详细名称,Django 会使用字段的属性名自动创建,并将下划线转换为空格。

validators要为该字段运行的验证器列表。

null如果是 True, Django 将在数据库中存储空值为 NULL。默认为 False。

blank如果是 True ,该字段允许为空。默认为 False 。

choices

default该字段的默认值。

editable如果是 False,该字段将不会在管理或任何其他 ModelForm 中显示。在 模型验证 中也会跳过。默认为 True。

error_messages

help_text额外的“帮助”文本,随表单控件一同显示。

db_column这个字段要使用的数据库列名。如果没有给出列名,Django 将使用字段名。

db_index如果是 True,将为该字段创建数据库索引。

db_tablespace

关系

ForeignKey多对一的关系。

ManyToManyField多对多的关系。

OneToOneField一对一的关系。

index.html

详见模版系统

views.py

from django.http import HttpResponse
from django.template import loader

from .models import Question


def index(request):
	// 从model中获取数据
	latest_question_list = Question.objects.order_by('-pub_date')[:5]
	// 加载template
	template = loader.get_template('polls/index.html')
	// 构造context
	context = {
		'latest_question_list': latest_question_list,
	}
	// 渲染template,包装成HttpResponse,返回客户端
	return HttpResponse(template.render(context, request))
传入参数
// 方式一:路径转换器
path('<int:question_id>/', views.detail)

def detail(request, question_id)

// 方式二:正则表达式
re_path(r'^(?P<question_id>[\w-]+)/$', views.detail)

def detail(request, question_id)

// 方式三:kwargs传递额外参数
path('<int:question_id>/', views.detail, {'foo': 'bar'})

def detail(request, question_id, foo)
HttpRequest
QuerySet
HttpResponse
返回页面
HttpResponse(template.render(context, request))
返回JSON
JsonResponse({'foo': 'bar'})
返回文件
FileResponse(open('myfile.png', 'rb'))

urls.py

应用路由。说明url与view的对应关系。

Function views
from . import views

urlpatterns = [
    path('', views.home, name='home')
]
Class-based views
from .views import Detail

urlpatterns = [
    path('<int:question_id>/', Detail.as_view(), name='detail')
]
路径转换器

str:匹配除了 ‘/’ 之外的非空字符串。如果表达式内不包含转换器,则会默认匹配字符串。

int:匹配 0 或任何正整数。返回一个 int 。

slug:匹配任意由 ASCII 字母或数字以及连字符和下划线组成的短标签。

uuid:匹配一个格式化的 UUID 。为了防止多个 URL 映射到同一个页面,必须包含破折号并且字符都为小写。比如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID 实例。

path:匹配非空字段,包括路径分隔符 ‘/’ 。它允许你匹配完整的 URL 路径而不是像 str 那样匹配 URL 的一部分。

函数 path()

当使用路径转换器时使用path()

path('relativepath/<路径转换器:参数名>/', view, kwargs, name)

view:当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 HttpRequest 对象作为参数。

kwargs:不在url中的额外参数可以作为一个字典传递给目标视图函数。

name:为你的 URL 取名能使你在 Django 的任意地方唯一地引用它。

函数re_path()

当使用正则表达式时使用re_path()

re_path(r'^relativepath/(?P<year>[0-9]{4})/$', view, kwargs, name)

WSGI部署

ASGI部署