Django
背景
- 2003诞生 它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的
MVT(框架)
- Models 模型 数据库
- Views 视图 放和拿
- Template 模板 前端
- From 表单
django
会根据你后台数据库字段及表单层的设计对应的给你创建HTML关于表单的代码
- From 表单
Django优点
- 对象关系映射(Object Relational Mapping ORM):通过定义映射类来构建数据模型,将模型与关系型数据库连接起来,使用ORM框架内置的数据库接口可实现复杂的数据操作。(简单来说就是把数据库的语句换成了python可识别的语言)
- URL设计:开发者可以设计任意的URL(网站地址), 而且支持使用正则表达式设计。
- 模板系统:提供可扩展的模板语言,模板之间具有可继承性。
- 表单处理:可以生成各种表单模型,而且表单具有有效性检验功能。
- Cache系统:完善的缓存系统,可支持多种缓存方式
- 用户管理系统:提供用户认证,权限设置和用户组功能,功能扩展性强。
- 国际化:内置国际化系统,方便开发出多语言的网站。
- admin管理系统:内置admin管理系统,系统的扩展性强。
Django项目目录
用django-admin startproject demo 创建一个demo项目
文件结构如下:
demo/ # 最外层 这个是整个项目的容器文件夹,可以随意改名字
demo/ # 内层的demo 是这个项目中关于配置文件的一个管理文件夹,这个不允许改名字
__init__.py #初始化文件,代表这个文件夹是一个包,一个模块,demo文件夹就是一个模块了
settings.py # 这个是整个项目的配置文件,配置中间,配置邮件等
urls.py # django项目的总路由配置文件。网站的地址信息
wsgi.py # 全称为Python Web Server Gateway Interface,即为python服务器网关接口, 是python应用与Web服务器之间的接口,用于Django项目在服务器上的部署和上线,一 般不需要修改
manage.py # 命令行工具,允许以多种方式与项目交互。 可输入 python manage.py help 查看 该工具的具体用法
Django的创建的App目录
-
使用命令创建app: python manage.py startapp frist
-
创建了App必须把App名称添加到INSTALL_APPS里面。
frist/ migrations/ # 数据库前后是否有变化,生成出迁移文件 static/ # 创建App后存放App中的静态资源文件,自己手动添加 templates/ # 创建App后存放App中的模板文件,自己手动添加 __init__.py admin.py apps.py models.py tests.py urls.py # 创建App后由系统总路由映射到App的路由文件,自己手动添加 view.py
-
Django(settings)配置全览
"""
Django settings for mysite project.
Generated by 'django-admin startproject' using Django 2.1.2.
For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
"""
import os
# 项目路径
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
# 密匙配置
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '#g$qgqkee8csvp67l$(8ugkx%+i_9k%mbykw-%9zpbnyn!bb!='
# 调试模式
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# 域名访问权限
ALLOWED_HOSTS = ['*']
# App列表
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myblog',
'article',
]
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',
]
ROOT_URLCONF = 'mysite.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [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',
# 自定义模版全局变量(默认变量)
'article.views.global_settings',
],
},
},
]
WSGI_APPLICATION = 'mysite.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME':'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
项目路径 BASE_DIR:主要通过os
模块读取当前项目在系统的具体路径,该代码在创建项目时自动生成,一般情况无需修改
密匙配置SECRET_KEY:是一个随机值,在项目创建的时候自动生成,一般情况下无需修改。主要用于重要的数据 加密处理,提高系统的安全性,避免遭到攻击者的恶意破坏。密匙主要用于用户密码,CSRF
机制和会话Session
等数据加密。
* 用户密码:Django内置一套用户管理系统,该系统具有用户认证和存储用户信息等功能,在创建用户的时候,将用户的密码通过密匙进行加密处理,保证用户的安全性。
* CSRF机制:该机制主要用于表单提交,防止窃取网站的用户信息来制造恶意请求
* 会话Session:Session的信息存放在Cookies,以一串随机的字符串表示,用于标识当前访问网站的用户身份,记录相关用户信息。
调试模式DEBUG:该值为布尔类型。如果在开发调试阶段应设置为True,在开发调试过程中会自动检测代码是否 发生更改,根据检测结果执行是否刷新重启系统。如果项目部署上线,将其改为False,否则会泄露系统的相关信息。
域名访问权限ALLOWED_HOSTS:设置可访问的域名,默认值为空。当DEBUG为True并且ALLOWED_HOSTS为空时,项目只允许以localhost
或127.0.0.1在浏览器上访问启动。当DEBUG为False时,ALLOWED_HOSTS为必填项,否则程序无法启动,如果想允许所有域名访问,可设置ALLOW_HOSTS=[’*’]。
App列表INSTALLED_APPS:告诉Django有哪些App。在创建项目时已有admin,auth,和session等配置等信息,这些都是Django内置的应用功能,各个功能说明如下。
* admin:内置的后台管理系统。
* auth:内置的用户认证系统。
* contenttypes:记录项目中所有的model元数据(Django的ORM框架)。
* session:Session会话功能,用于标识当前访问网站的 用户身份,记录相关用户信息。
* message:消息提示功能。
* staticfiles:查找静态资源路径。
静态资源(static)
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
# 设置根目录的静态资源文件夹static
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
# 设置App的静态资源文件夹
os.path.join(BASE_DIR, '/static'),
]
CSS也称层叠样式表(Cascading Style Sheets),是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。
JavaScript是一种直译式脚本语言,也是一种动态类型,弱类型,基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
- STATIC_URL是必须配置的属性而且属性值不能为空。如果没有配置STATICFILES_DIRS,则STATIC_URL只能识别App里的static静态资源文件夹。
- STATICFILES_DIRS是可选配置属性,属性值为列表或元组格式,每个列表(元组)元素代表一个静态资源文件夹,这些文件夹可行命名。
- 在浏览器上访问项目的静态资源时,无论项目的静态资源文件夹是如何命名的,在浏览器上,静态资源的上级目录必须为static,而static而STATIC_URL的属性值,因为STATIC_URL也是静态资源的起始URL。
除此之外,静态资源配置还有STATIC_ROOT,其作用是方便在服务器上部署项目,实现服务器和项目之间的映射。
STATIC_URL和STATICFILES_DIRS区别
- STATIC_URL是必须配置的属性而且属性的值不能为空。如果没有配置STATICFILES_DIRS,则STATIC_URL只能识别App里面的static静态资源文件夹。
- STATICFILES_DIRS是可选配置属性,属性值为列表或元组格式,每个列表(元组)元素代表一个静态资源文件夹,这些文件夹可自行命名。
- 在浏览器上访问项目的静态资源时,无论项目的静态资源文件夹是如何命名的,在浏览器上,静态资源的上级目录必须为static,而static是STATIC_URL的属性值,因为STATIC_URL也是静态资源的起始URL。
模板路径(template)
- 在web开发中,模板是一种较为特殊的HTML文档。这个HTML文档嵌入了一些能够让Python识别的变量和指令,然后程序解析这些变量和指令,生成完整的HTML网页并返回给用户浏览。模板是Django里面的MTV框架模式的
T
部分,配置模板路径是Django在解析模板时,如何找到模板所在的位置。创建项目时,Django以有初始的模板配置信息。如下:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [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',
# 自定义模版全局变量(默认变量)
'article.views.global_settings',
],
},
},
]
- 模板信息是以列表格式呈现的,每个元素具有不同的含义,说明如下:
- BACKEND:定义模板引擎,用于识别模板里面的变量和指令。内置的模板引擎有
DjangoTemplate
和jinjia2.Jinjia2
,每个模板引擎都有自己的变量和指令语法。 - DIRS:设置模板所在的路径,告诉Django在那个地方查找模板的位置,默认为空列表
- APP_DIRS:是否在App里面查找模板文件
- OPTIONS:用于填充在RequestContext中上下文调用函数,一般情况下不做任何修改。
- BACKEND:定义模板引擎,用于识别模板里面的变量和指令。内置的模板引擎有
数据库设置(Databases)
-
在settings文件下 有一个DATABASES属性
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', # 数据库引擎 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # 本地sqllite3数据库位置 'USER': # 用户名 'PASSWORD': # 数据库密码 'HOST': # 数据库主机地址 } } # 默认的django使用sqllite3作为数据库 # django提供四种 ENGINE 数据库引擎 # django.db.backends.mysql # django.db.backends.oracle # django.db.backends.splite3 # 如果你使用的是 PostgreSQL 或者Mysql的话,已经是先创建了数据库,但是默认的SQLlite不需要
-
sqlite3
轻量级数据库(数据存放在文件里面) -
在Django连接MYSQL数据库时候如果提示django.db.utils.OperationalError的错误信息,这是因为MYSQL8.0版本的密码加密方式发生了变化,8.0版本的用户密码采用的是cha2加密方法。
-
解决方法,把SQL语句将8.0版本加密方法改回原来的加密方式。
-
# newpassword 是我们设置的用户密码 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword'; FLUSH PRIVILEGES;
-
中间件(Middlewere)
中间件(Middleware)是处理Django的request和response对象的钩子。当用户在网站中进行单击某个按钮等操作时,这个动作是用户向网站发送请求(request);而网页会根据用户的操作返回相关的网页内容,这个过程称为响应处理(response)。从请求到响应的过程中,当Django接收到用户的请求时,Django首先经过中间件处理请求消息,执行相关的处理,然后将处理结果返回给用户,中间件的执行流程如图:
如上图,中间件的作用主要是处理用户的请求信息。开发者也可以根据自己的开发需求自定义中间件,只要将自定义的中间件添加到配置属性MIDDLEWARE中即可激活。一般情况下,Django默认的中间件配置均可满足大部分的开发需求。
'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',
配置属性MIDDLEWARE的数据格式为列表类型,每个中间件的设置顺序是固定的,如果随意变更中间件很容易导致程序异常,每个中间件的说明如下:
- SecurityMiddleware:内置的安全机制,保护用户与网站的通信安全。
- SessionMiddleware:会话Session。
- LocaleModdleware:支持中文语言。
- CommonMiddleware:处理请求信息,规范化请求内容。
- CsrViewMiddleware:开启CSRF防护功能。
- AuthenticationMiddleware:开启内置的用户认证系统。
- MessageMiddleware:开启内置的信息提示功能。
- XFrameOptionsMiddleware:防止恶意程序点击劫持。
修改时区及语言
- LANGUAGE_CODE = ‘en-us’ #语言
- TIME_ZONE = ‘UTC’ #时区
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
开启测试服务器
- 用来展示你创建出来的空项目
- /home/Publc_Class/5-17-django框架/
- python3 manage.py runserver 0.0.0.0:9090
- 开启了一个测试服务器
- runserver 可以让你在浏览器看到效果,但是这个是测试服务器,压力不过百
创建默认数据库
- 因为django自带的admin界面,首先需要数据库来支持
- 我们来先创建出一个数据库
makemigrations 数据库前后是否有变化,生成出迁移文件
migrate 根据迁移文件 来对应的执行SQL语句
python3 manage.py makemigrations
python3 manage.py migrate
- 如果数据库创建完成,那么目录结构下和
manage.py
同级的就会有一个db.splite3
文件 - 有了这个数据库,就可以创建超级用户来管理
admin
界面啦!
为admin
界面创建超级用户
- 数据库有了,要创建超级用户
- python3 manage.py createsuperuser
Username (leave blank to use 'root'): root
Email address: 2573799357@qq.com
Password:
Password (again):
Superuser created successfully.