1. 构建实验环境
1.1 实验机的环境准备
1.1.1 实验机系统规划:
- 本次实验使用的系统版本为:
CentOS Linux release 7.6.1810 (Core)
- 实验用虚拟机的安装和初始化请参见:
- 安装过程:略
- 配置过程:请参见 《Linux-CentOS7.x_操作系统初始化的简单介绍》
1.1.2 实验网络规划:
IP 地址规划
IP | 掩码 | 网关 | 用途 |
---|---|---|---|
192.168.80.11 | 24 | 192.168.80.2 | Django 开发环境 |
端口规划
端口 | 协议 | 用途 |
---|---|---|
8000 | tcp | 开发服务器 |
1.1.3 安装路径规划
/usr/local/
1.1.4 用户规划
用户名 | 密码 | 用途 |
---|---|---|
1.2 软件环境的准备
1.2.1 删除冲突软件
无
1.2.2 安装依赖服务
本实验所用到的 Python 环境,安装方法请参见:
《python-Python-安装的简单说明》中附B 章节
1.2.3 安装依赖软件
升级 SQLite
详情请参见 《附A:升级 SQLite》,如果不升级,会报如下错误
注:
如果启动 runserver 报如下错误,解决方案详见:《附A:升级 SQLite》
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
1.3 获取 Django 的安装包
直接通过 pip 方式安装,不需要单独获取安装包
2. 安装 Django
]# pip3 install django
查看 django 的版本
]# python3 -m django --version
2.2.4
3. 基础配置 Django
3.1 新建一个项目
执行如下命令,会在当前目录下新建一个名为 mysite 的目录
]# cd /usr/local/
]# django-admin startproject mysite
]# tree
.
└── mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
2 directories, 5 files
简单说明:
- manage.py: 一个让你用各种方式管理 Django 项目的命令行工具。
-
mysite: 里面一层的
mysite/
目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 (比如mysite.urls
).-
mysite/__init__.py
:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。 -
mysite/settings.py
:Django 项目的配置文件。 -
mysite/urls.py
:Django 项目的 URL 声明,就像你网站的 “目录”。 -
mysite/wsgi.py
:作为你的项目的运行在 WSGI 兼容的 Web 服务器上的入口。
-
注:
tree 命令通常需要自行安装,安装命令如下:
]# yum -y install tree
3.2 全局配置
3.2.1 数据库配置
此处使用默认的 SQLite,因此不再额外配置
]# cd mysite/
]# vim mysite/settings.py
... 省略 ...
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
... 省略 ...
3.2.2 其它配置
- 更改时区:
]# vim mysite/settings.py
... 省略 ...
LANGUAGE_CODE = 'en-us' --> 'zh-hans'
TIME_ZONE = 'UTC' --> 'Asia/Shanghai'
... 省略 ...
USE_TZ = True --> False
注1:
zh-hans:
- zh:表示语系
- hans:表示中文简体;类似的 hant 就表示中文繁体
注2:
USE_TZ:暂缺,后补
- 更改访问权限:
]# vim mysite/settings.py
... 省略 ...
ALLOWED_HOSTS = [] --> ['*']
... 省略 ...
注1:
如果不更改,使用浏览器访问开发服务器时,会报如下错误:
You may need to add 'xx.xx.xx.xx' to ALLOWED_HOSTS.
- 安全设置
- SECRET_KEY:这个密匙值是 Django 网站安全策略的一部分。如果在开发环境中没有包好这个密匙,把代码投入生产环境时最好用不同的密匙代替。
- DEBUG:这个会在 debug 日志里输出错误信息,而不是输入 HTTP 的返回码。在生产环境中,它应设置为 false,因为输出的错误信息会帮助想要攻击网站的人。
3.3 新建一个应用
在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定。项目和应用有啥区别?
- 应用是一个专门做某件事的网络应用程序:比如博客系统,或者公共记录的数据库,或者简单的投票程序。
- 项目则是一个网站使用的配置和应用的集合。
- 项目可以包含很多个应用。应用可以被很多个项目使用。
通过以下命令,新建一个名为 login 的 app
]# pwd
/usr/local/mysite
]# python3 manage.py startapp login
]# tree login/
login/
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
1 directory, 7 files
3.4 注册 login 应用
]# vim mysite/settings.py
... 省略 ...
# Application definition
INSTALLED_APPS = [
'django.contrib.admin', --> admin 管理后台站点
'django.contrib.auth', --> 身份认证系统
'django.contrib.contenttypes', --> 内容类型框架
'django.contrib.sessions', --> 会话框架
'django.contrib.messages', --> 消息框架
'django.contrib.staticfiles', --> 静态文件管理框架
'polls.apps.PollsConfig', --> 新增(也可以直接简写成 polls)
]
... 省略 ...
其实就是导入的这个 LoginConfig
类
]# head login/apps.py
from django.apps import AppConfig
class LoginConfig(AppConfig):
name = 'login'
3.5 创建首页视图
]# vim polls/views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("Hello, world. You're at the login page.")
3.6 链接 URL 映射器
创建 login/urls.py
文件
]# vim login/urls.py
from django.conf.urls import url
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
设置由 login
应用管理自己的 url
规则
]# vim mysite/urls.py
... 省略 ...
from django.contrib import admin
from django.urls import path
from django.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', include('login.urls')),
]
4 启动与验证
至此一个开发框架就已经搭建完成了,下面我们开始验证一下
运行数据库迁移
]# python3 manage.py makemigrations
]# python3 manage.py migrate
启动开发服务器,验证项目创建成功
]# python3 manage.py runserver
注:
开发服务器默认只能本地访问,如果实现远程访问,可以执行以下命令
]# python3 manage.py runserver 0.0.0.0:8000
在浏览器中访问如下地址
页面返回如下内容,说明应用创建成功
Hello, world. You're at the login page.
附A 升级 SQLite
查看当前系统默认 SQLite 版本
]# sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
下载最新 SQLite 安装包
写该文档时,最新版本为 3.29
]# cd /usr/local/src/
]# wget https://www.sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
解压、编译安装
]# tar -xzf sqlite-autoconf-3290000.tar.gz
]# cd sqlite-autoconf-3290000/
]# ./configure --prefix=/usr/local/sqlite/
]# make -j$(nproc)
]# make install
更新系统 lib 信息
]# echo '/usr/local/sqlite/lib' > /etc/ld.so.conf.d/sqlite.conf
]# ldconfig -v
替换系统默认的 SQLite
]# ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3
验证安装
]# sqlite3 --version
3.29.0 2019-07-10 17:32:03 fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6
附B path() 方法的简单介绍
path() 方法可以接收4个参数,其中2个是必须的:route
和 view
,以及2个可选的参数:kwargs
和 name
。
- route:
route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项,然后执行该条目映射的视图函数或下级路由,其后的条目将不再继续匹配。因此,url 路由的编写顺序非常重要!
- view:
view 指的是处理当前 url 请求的视图函数。当 Django 匹配到某个路由条目时,自动将封装的 HttpRequest
对象作为第一个参数,被“捕获”的参数以关键字参数的形式,传递给该条目指定的视图 view。
- kwargs:
任意数量的关键字参数可以作为一个字典传递给目标视图。
- name:
对你的 URL 进行命名,让你能够在 Django 的任意处,尤其是模板内显式地引用它。这是一个非常强大的功能,相当于给 URL 取了个全局变量名,不会将 URL 匹配地址写死。
附C 配置后台使用 Mysql 数据库
创建项目所需的数据库 mysite
> CREATE DATABASE mysite CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysite |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
下载 python 访问 Mysql 所需的模块
]# pip3 install mysqlclient
编辑 settings.py 使其支持 Mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'USER': 'root',
'PASSWORD': 'Emc20160',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'",
}
}
}
注:
init_command
主要是为了解决以下告警
WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/2.2/ref/databases/#mysql-sql-mode
大意就是没有给 mysql 连接启用严格模式,而严格模式能解决很多数据完整性问题,官方强烈建议开启。
严格模式对于数据完整性校验比较严格,对 SQL 语句的健壮性要求更高,比如不允许 NOT NULL 字段插入没有默认值的数据等。
网友评论