最近在学习某马的django模块部分,为了方便复习,现将知识点总将如下。
首先我们先来了解下web框架
web框架
web框架的意义:
- 免去搭建web应用程序
- 免去不同web应用相同代码部分的重复编写,只需要关心web应用核心的业务逻辑实现
web应用程序的本质:
- 接受并解析http请求,获取具体的请求信息
- 处理本次http请求,即完成本次请求的业务逻辑处理
- 构造并返回处理结果—http响应
下面主要从django流程,模型,视图,模板等方面进行学习
一. django流程
1.1django介绍
django-admin startproject name
python manager.py startapp name
2.2MVT模式
有一种程序设计模式叫MVC,其核心思想是分工、解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。
MVC模式说明
M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作。
V全拼为View,用于封装结果,生成页面展示的html内容。
C全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。
Django的MVT
M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。
1.2虚拟环境
这里主要讲的是在ubuntu怎么创建虚拟环境,在win上我们可以直接使用pycharm创建虚拟环境。创建虚拟环境主要是为了开发多个不同项目,需要使用同一个包的不同版本
#安装虚拟环境的命令 :
sudo pip install virtualenv
sudo pip install virtualenvwrapper
#安装完虚拟环境后,如果提示找不到mkvirtualenv命令,须配置环境变量:
# 1、创建目录用来存放虚拟环境
mkdir
$HOME/.virtualenvs
# 2、打开~/.bashrc文件,并添加如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
# 3、运行
source ~/.bashrc
#创建虚拟环境的命令:
python2:
mkvirtualenv 虚拟环境名称
例 :
mkvirtualenv py_django
python3:
mkvirtualenv -p python3 虚拟环境名称
例 :
mkvirtualenv -p python3 py3_django
查看虚拟环境的命令:
workon
使用虚拟环境的命令:
workon 虚拟环境名称
例 :使用py3_django的虚拟环境
workon py3_django
退出虚拟环境的命令:
deactivate
删除虚拟环境的命令:
rmvirtualenv 虚拟环境名称
例 :删除虚拟环境py3_django
先退出:deactivate
再删除:rmvirtualenv py3_django
虚拟环境中安装包:
pip install 包名称
例 : 安装django-1.11.11的包
pip install django==1.11.11
查看虚拟环境中安装的包 :
pip list
1.3创建项目
工程目录说明:
- settings.py是项目的整体配置文件。
- urls.py是项目的URL配置文件。
- wsgi.py是项目与WSGI兼容的Web服务器入口。
- manage.py是项目管理文件,通过它管理项目。
运行开发的服务器:
python manage.py runserver ip:端口
或:
python manage.py runserver
#可以不写ip和端口:默认ip是127.0.0.1,默认端口是8000,django默认工作在调式Debug模式下,如果增加、修改、删除文件,服务器会自动重启。
子项目目录说明:
- admin.py文件跟网站的后台管理站点配置相关。
- apps.py文件用于配置当前子应用的相关信息。
- migrations目录用于存放数据库迁移历史文件。
- models.py文件用户保存数据库模型类。
- tests.py文件用于开发测试用例,编写单元测试。
- views.py文件用于编写Web应用视图。
创建完子应用后需要在项目目录里的settings.py里的INSTALLED_APPS里进行注册
如:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#添加子应用的配置信息文件apps.py中的config类
'book.apps.BookConfig'
# 或者直接写子应用的名字
#book
]
1.4模型
我们在MVT中已经介绍过M主要就是和数据库进行打交道的。由于Model中内嵌了ORM框架, 所以不需要直接面向数据库编程.而是定义模型类, 通过模型类和对象完成数据库表的增删改查.ORM框架就是把数据库表的行与相应的对象建立关联, 互相转换.使得数据库的操作面向对象.
使用Django进行数据库开发的步骤 :
定义模型类
模型迁移
操作数据库
1.4.1下面来看一个例子(这里先使用的是默认的sqllite3,之后会将默认数据库更改为mysql):
根据书籍表结构设计模型类:
模型类:BookInfo
书籍名称字段:name
根据人物表结构设计模型类:
模型类:PeopleInfo
人物姓名字段:name
人物性别字段:gender
外键约束:book
外键要指定所属的模型类book=models.ForeignKey(BookInfo)
说明 :
书籍-人物的关系为一对多. 一本书中可以有多个英雄.
不需要定义主键字段, 在生成表时会自动添加, 并且值为自增长.
根据数据库表中的设计,在models.py中定义模型类,继承自models.Model
from django.db import models
# Create your models here.
# 准备书籍列表信息的模型类
class BookInfo(models.Model):
# 创建字段,字段类型...
name = models.CharField(max_length=10)
# 准备人物列表信息的模型类
class PeopleInfo(models.Model):
name = models.CharField(max_length=10)
gender = models.BooleanField()
# 外键约束:人物属于哪本书
book = models.ForeignKey(BookInfo)
1.4.2模型迁移(建表)
生成迁移文件(根据模型类生成创建表的语句):python manage.py makemigrations
执行迁移(根据第一步生成的语句在数据库中创建表):python manage.py migrate
1.5站点管理
站点: 分为内容发布和公共访问两部分
内容发布的部分由网站的管理员负责查看、添加、修改、删除数据
Django能够根据定义的模型类自动地生成管理模块
使用Django的管理模块, 需要按照如下步骤操作 :
- 管理界面本地化
- 创建管理员
- 注册模型类
- 发布内容到数据库
1.5.1管理界面本地化
主要指的是时间和语言,在项目目录里的settings.py里进行更改
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
1.5.2创建管理员
python manage.py createsuperuser
#之后输入用户名,邮箱,密码即可
#重置密码:
python manager.py changepassword 用户名
之后可登录站点看到后台http://127.0.0.1:8000/admin
1.5.3注册模型类
在应用的admin.py文件注册模型类在应用的admin.py文件中注册模型类
需要导入模型模块 :from book.models import BookInfo,PeopleInfo
注册模型后 就可以在站点管理界面方便快速的管理数据.
1.5.4发布内容到数据库,并优化模型显示
# 准备书籍列表信息的模型类
class BookInfo(models.Model):
# 创建字段,字段类型...
name = models.CharField(max_length=10)
def __str__(self):
"""将模型类以字符串的方式输出"""
return self.name
1.6视图和url
站点管理页面做好了, 接下来就要做公共访问的页面了.对于Django的设计框架MVT.用户在URL中请求的是视图.视图接收请求后进行处理.并将处理的结果返回给请求者.
使用视图时需要进行两步操作
- 定义视图
- 配置URLconf
1.6.1定义视图
视图就是一个Python函数,被定义在应用的views.py中.视图的第一个参数是HttpRequest类型的对象reqeust,包含了所有请求信息.视图必须返回HttpResponse对象,包含返回给请求者的响应信息.
需要导入HttpResponse模块 :from django.http import HttpResponse
例如:
def index(request, age, name):
# context = {'v1': age, 'v2': name}
# print (context)
return render(request, 'index.html')
那么如何人才能找到合适的视图呢?直接是一个配置URLconf的过程,先来了解下查找视图的过程:
- 请求者在浏览器地址栏中输入URL, 请求到网站.
- 网站获取URL信息.
- 然后与编写好的URLconf逐条匹配.
- 如果匹配成功则调用对应的视图.
- 如果所有的URLconf都没有匹配成功.则返回404错误.
首先你要了解的是项目文件settings.py里配置了url匹配的入口,一般为项目文件名下的urls
ROOT_URLCONF = 'bookshop.urls'
我们进入项目文件下的urls里进项查看:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('book.urls'))
]
#意味先匹配admin,就是我们的后台管理页面。ip地址端口号不进行匹配,r后面的是正则。如果不符合进行下一条匹配,即任意链接进入子项目下的urls再进行匹配,子项目下的urls需要自己创建,如下
from django.conf.urls import url
from book.views import booklist, index
urlpatterns = [
url(r'^booklist/$', booklist, name='test'),
url(r'^(?P<name>\d+)/(?P<age>\d+)/$', index)
]
其中匹配成功的网页文件,我们都是新建一个templates文件夹,如图:
1.8模板
MVT设计模式中的T,Template
在Django中, 将前端的内容定义在模板中, 然后再把模板交给视图调用, 各种漂亮、炫酷的效果就出现了.
模板使用步骤:
- 创建模板
- 设置模板查找路径
- 模板接收视图传入的数据
- 模板处理数据
1.8.1.创建模板
在应用同级目录下创建模板文件夹templates. 文件夹名称固定写法.在templates文件夹下, 创建应用同名文件夹. 例, Book
在应用同名文件夹下创建网页模板文件. 例 :index.html
1.8.2设置模板查找路径
项目文件里的settings.py
TEMPLATES = [
{
'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',
],
},
},
]
其中Base_DIR指的是项目所在的路径地址,以此为基准查找html文件,所以视图函数的第二个参数你会写了吧
1.8.3模板接受视图传入的数据
1.8.4模板处理数据
1.8.5查看模板处理数据成果
即在视图模块里给render函数传入第三个参数,如下图,然后再html中使用模板函数对其进行格式化输出,效果如图
def index(request, age, name):
context = {'v1': age, 'v2': name}
print (context)
return render(request, 'index.html', context)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ v1 }}
年龄是{{v2}}
</body>
</html>
关于这块读者只要理解我们可以对模块进行操作,关于模块语言等内容后面会具体讲解,现在只需要知道大体的框架就行啦
1.9配置文件和静态文件
1.9.1DEBUG
调试模式,创建工程后初始值为True,即默认工作在调试模式下。
作用:修改代码文件,程序自动重启
Django程序出现异常时,向前端显示详细的错误追踪信息,例如
而非调试模式下,仅返回Server Error (500)
注意:部署线上运行的Django不要运行在调式模式下,记得修改DEBUG=False和ALLOW_HOSTS。
1.9.2静态文件
项目中的CSS、图片、js都是静态文件。一般会将静态文件放到一个单独的目录中,以方便管理。在html页面中调用时,也需要指定静态文件的路径,Django中提供了一种解析的方式配置静态文件路径。静态文件可以放在项目根目录下,也可以放在应用的目录下,由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理。
在项目中根目录下创建static目录来保存静态文件
在settings中修改静态文件的两个参数
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
此时在static添加的任何静态文件都可以使用网址/static/文件在static中的路径来访问了。
例如,我们向static目录中添加一张图片,在浏览器中就可以使用127.0.0.1:8000/static/1.png来访问。
1.9.3App应用配置
在每个应用目录中都包含了apps.py文件,用于保存该应用的相关信息。在创建应用时,Django会向apps.py文件中写入一个该应用的配置类,如
from django.apps import AppConfig
class BookConfig(AppConfig):
name = 'book'
我们将此类添加到工程settings.py中的INSTALLED_APPS列表中,表明注册安装具备此配置属性的应用。
AppConfig.name属性表示这个配置类是加载到哪个应用的,每个配置类必须包含此属性,默认自动生成。
AppConfig.verbose_name属性用于设置该应用的直观可读的名字,此名字在Django提供的Admin管理站点中会显示,如
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'book'
verbose_name = '图书管理'