目录
0 背景
0.1 MVC框架
软件框架是由其中的各个模块组成的,每个模块负责特定的功能,模块与模块之间相互协作来完成软件开发。软件框架的设计,也是针对某一类软件问题而设计的,其目的主要是提高软件开发效率。
MVC框架的核心思想是:解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。
- M 全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作。
- V 全拼为View,用于封装结果,生成页面展示的html内容。
- C 全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。
0.2 Django
Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(DoNotRepeatYourself)原则。
Django框架遵循MVC设计,并且有一个专有名词:MVT
- M:全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
- V:全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
- T:全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。
1. 虚拟环境
虚拟环境是真实python环境的复制版本。
在虚拟环境中使用的python是复制的python,安装python包也是安装在复制的python中。
安装好virtualenv后在.bashrc
中添加下面2行:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
命令 | 含义 |
---|---|
sudo pip install virtualenv |
安装虚拟环境 |
sudo pip install virtualenvwrapper |
安装虚拟环境扩展包 |
export WORKON_HOME=$HOME/.virtualenvs |
在配置文件中设置 WORKON_HOME |
mkvirtualenv 虚拟环境名 |
创建虚拟环境 |
mkvirtualenv -p python3 环境名 |
创建指定python版本的虚拟环境 |
workon 虚拟环境名 |
进入虚拟环境 |
workon tab-tab |
查看所有环境 |
deactivate |
退出当前虚拟环境 |
rmvirtualenv 虚拟环境名 |
删除虚拟环境: |
pip install 包名 |
在当前虚拟环境中安装包 (注意不能加sudo,否则就是给系统环境安装) |
pip install django==1.8.2 |
指定版本安装包 |
pip freeze > requirements.txt |
将当前python环境的包信息导出,为了让别的环境安装依赖时方便 |
注意:在虚拟环境中不可使用
sudo pip install 包名称
来安装python包,这样安装的包实际是安装在了真实的主机环境上。
2. ★第一个Django案例
安装django环境
创建django项目
设计模型类并利用模型类和数据库进行交互
使用django后台管理数据
编写视图函数,进行URL配置
模板的使用
图书-英雄案例完成
2.1 创建项目
在Django中,一个程序包含多个app
,每个app
负责不同的功能模块:
步骤:
- 创建项目
- 创建
app
- 注册app
- 运行服务器
a. 创建项目
django-admin startproject 项目名称
项目目录说明
目录/文件 | 作用 |
---|---|
manage.py |
是项目管理文件,通过它管理项目。 |
与项目同名的目录,此处为test1。 | 主模块 |
__init__.py |
是一个空文件,作用是这个目录test1可以被当作包使用。 |
settings.py |
是项目的整体配置文件。 |
urls.py |
是项目的URL配置文件。 |
wsgi.py |
是项目与WSGI兼容的Web服务器入口,详细内容会在布署中讲到。 |
b. 创建app
python manage.py startapp booktest
目录说明
目录/文件 | 作用 |
---|---|
admin.py |
文件跟网站的后台管理相关。 |
__init.py__ |
是一个空文件,表示当前目录booktest可以当作一个python包使用。 |
migrations 文件夹 |
数据库迁移相关 |
models.py |
文件跟数据库操作相关。 |
tests.py |
文件用于开发测试用例,在实际开发中会有专门的测试人员,这个事情不需要我们来做。 |
views.py |
跟接收浏览器请求,进行处理,返回页面相关。相当于controller |
c. 安装应用
应用创建成功后,需要安装才可以使用,也就是建立应用和项目之间的关联。
在主模块的 settings.py
中INSTALLED_APPS
下添加应用的名称就可以完成安装。
d. 运行测试服务器
在开发阶段,为了能够快速预览到开发的效果,django提供了一个纯python编写的轻量级web服务器,仅在开发阶段使用。
python manage.py runserver ip:端口
例:
python manage.py runserver
可以不写IP和端口,默认IP是127.0.0.1,默认端口为8000。
如果增加、修改、删除文件,服务器会自动重启;
2.2 ORM操作
O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思。在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。
django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。
步骤:
- 在models.py中定义模型类
- 执行数据迁移
- 通过类和对象完成数据增删改查操作
a. 定义模型类——继承models.Model
在每个app
的model.py
中定义模型类,继承自models.Model
:
说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长。
from django.db import models
# Create your models here.
class BookInfo(models.Model):
btitle = models.CharField(max_length= 20)
bpub_date = models.DateField()
class HeroInfo(models.Model):
hname = models.CharField(max_length=20)
hgender = models.BooleanField()
hcomment = models.CharField(max_length=100)
hbook = models.ForeignKey('BookInfo',on_delete = models.CASCADE)
on_delete
Django2以上,ForeignKey
字段一定要写on_delete
参数,可选的如下(都在django.db.models
内):
参数 | 说明 |
---|---|
CASCADE | 级联删除 |
PROTECT | 阻止引用对象删除,会抛出异常ProtectedError |
SET_NULL | 设置为NULL, 只有当null 参数为True 时才可以 |
SET_DEFAULT | 设置成默认值,所以一定要传递参数default |
SET | on_delete=models.SET(get_sentinel_user), |
b. 数据迁移—— manage.py makemigrations, migrate
迁移由两步完成:
-
生成迁移文件:根据模型类生成创建表的迁移文件。
python manage.py makemigrations
-
执行迁移:根据第一步生成的迁移文件在数据库中创建表。
python manage.py migrate
Django框架根据我们设计的模型类生成了迁移文件,在迁移文件中我们可以看到fields列表中每一个元素跟BookInfo类属性名以及属性的类型是一致的。同时我们发现多了一个id项,这一项是Django框架帮我们自动生成的,在创建表的时候id就会作为对应表的主键列,并且主键列自动增长。
默认数据库
Django默认采用sqlite3数据库,上图中的db.sqlite3就是Django框架帮我们自动生成的数据库文件。
sudo apt-get install sqliteman
数据库的设置在settings.py
中:
生成字段名
生成的列名和自己定义的列名相同,并且多了一个id项,这一项是Django框架帮我们自动生成的,在创建表的时候id就会作为对应表的主键列,并且主键列自动增长。
关系属性生成的字段名为: 关系属性名_id
生成表名——app名_类名
应用名_model名
<app_name>_<model_name>
c. ★操作数据—— manage.py shell
python manage.py shell
完成数据表的迁移之后,下面就可以通过进入项目的shell,进行简单的API操作。如果需要退出项目,可以使用ctrl+d快捷键或输入quit()。
基本查询命令 | 说明 |
---|---|
BookInfo.objects.all() |
查询所有图书 |
图书对象.save() |
保存当前图书信息到数据库/ 修改图书信息 |
b=BookInfo.objects.get(id=1) |
根据主键查询图书 |
图书对象.delete() |
删除图书信息 |
关联对象查询命令 | 说明 |
---|---|
b.heroinfo_set.all() |
返回该图书关联的所有英雄信息 |
h.hbook_id |
获取外键值 |
h.hbook |
获取外键引用对象 |
多的一方可以直接使用属性值来访问一 的一方, 而一的一方获取多的一方时,需要使用
xxx_set
from booktest.models import BookInfo,HeroInfo # 引入类
from datetime import date
b1 = BookInfo()
b1.btitle= "金庸新著"
b1.bpub_date = date(1991,1,1)
b1.save() # 保存
b2 = BookInfo()
b2.btitle= "屠龙宝刀"
b2.bpub_date = date(1995,5,6)
b2.save() # 保存
BookInfo.objects.all() # 获取所有
BookInfo.objects.get(id=1) # 根据id获取
BookInfo.objects.get(pk=1) # 根据主键获取
b1.btitle="点击就送"
b1.save() # 修改
b.delete() # 删除
操作关系字段
b1 = BookInfo.objects.get(id=1)
h = HeroInfo()
h.hname = "张无忌"
h.hgender = True
h.hbook = b1
h.save()
h.hbook_id # 获取外键值
h.hbook # 获取引用对象
b1.heroinfo_set.all() # 反向获取对象
2.3 后台管理操作——admin
步骤:
- 管理界面本地化
- 创建管理员
- 注册模型类
- 自定义管理页面
a 界面本地化
在主模块的settings.py
中,设置:
LANGUAGE_CODE = 'zh-hans' #使用中国语言
TIME_ZONE = 'Asia/Shanghai' #使用中国上海时间
b 创建管理员—— manage.py createsuperuser
python manage.py createsuperuser
然后启动:
python manage.py runserver
进入URL:
http://127.0.0.1:8000/admin/
c. 注册模型类
要让自己创建的模型类,可以被admin页面管理,需要对他们进行注册:
进入主模块的admin.py
:
from django.contrib import admin
from booktest.models import BookInfo,HeroInfo
# 后台管理相关文件
# Register your models here.
# 注册模型类
admin.site.register(BookInfo)
admin.site.register(HeroInfo)
再刷新
d. 自定义管理页面
Django提供了自定义管理页面的功能,比如列表页要显示哪些值。
进入主模块的admin.py
,创建自己的ModelAdmin
类,然后在里面的list_display
类属性决定了显示哪些 属性:
from django.contrib import admin
from booktest.models import BookInfo,HeroInfo
# 后台管理相关文件
# Register your models here.
# 自定义模型管理类
class BookInfoAdmin(admin.ModelAdmin):
'''图书模型管理类'''
list_display = ['id', 'btitle', 'bpub_date']
class HeroInfoAdmin(admin.ModelAdmin):
'''英雄人物模型管理类'''
list_display = ['id', 'hname', 'hcomment']
# 注册模型类
# admin.site.register(BookInfo)
admin.site.register(BookInfo, BookInfoAdmin)
admin.site.register(HeroInfo, HeroInfoAdmin)
2.4 视图初级(MVC中的C)
步骤:
- 定义视图函数
- 配置URLconf
a. 定义视图函数
- 视图函数就是普通的Python函数
- 定义在每个app中的
views.py
中 - 函数接收一个参数
request
- 函数返回
django.http.HttpResponse对象
django.shortcuts
中有快捷方式render、 redirect
from django.shortcuts import render
from django.http import HttpResponse
import time
# Create your views here.
def index(request):
currenttime = str(time.localtime().tm_min) +":"+ str(time.localtime().tm_sec)
return HttpResponse(currenttime )
b. ★配置url
django查找URL的顺序是这样子的:
- Django查看root URLconf module. 默认的,会查看
settings.py
中的ROOT_URLCONF
, 但是如果发送来的HttpRequest object
中有urlconf
属性(set by middleware), 那么这个值就会覆盖ROOT_URLCONF
设置 - Django 读取root URLconf module这个模块中的变量名为
urlpatterns
的内容,它应该是一个list
,并且都是django.urls.path()
或者django.urls.re_path()
的实例。 - Django 遍历所有URL pattern, 找到第一个匹配的URL
- 一旦匹配成功,Django就会引入对应的
view
来调用,which is a simple Python function (or a class-based view). The view gets passed the following arguments:- An instance of HttpRequest.
- If the matched URL pattern returned no named groups, then the matches from the regular expression are provided as positional arguments.
- The keyword arguments are made up of any named parts matched by the path expression, overridden by any arguments specified in the optional kwargs argument to django.urls.path() or django.urls.re_path().
- 如果没有匹配成功,或者匹配过程有任何错误,那么Django invokes an appropriate error-handling view. See Error handling below.
主模块的urls.py
中:
from django.contrib import admin
from django.urls import path
from django.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('booktest.urls'))
]
booktest应用中的urls.py
(需要自己创建):
from django.conf.urls import url
from django.urls import re_path
from .views import index
urlpatterns = [
re_path(r'.*', index),
# url(r'index', index),
# url('^',index)
]
页面url地址设置
习惯统一以/
开头,这样就会从host开始拼接,如果不写/
,则会当成相对地址
<a href="/create">新增</a>
2.5 模板初级(MVC中的V)
步骤:
- 创建模板文件夹和模板文件
- 在
settings.py
中配置模板路径 - 在
view
中加载模板文件对象 - 给模板传递数据,生成上下文
- 渲染上下文,得到html
- 返回html
a. 创建模板目录和文件
直接在项目名底下建立目录templates
, 然后在该目录中,为每个app建立同名文件夹:
b. 配置模板路径
在settings.py
中,找到TEMPLATES
的DIR
, 加上模板路径:
'DIRS': [os.path.join(BASE_DIR, 'templates')],
c. 模板文件内代码书写
{
{变量名}}
{%代码段%}
比如:
{% for i in data %}
循环内部代码
{% empty %}
如果循环列表长度为0则运行这部分
{% endfor %}
d. 视图中调用模板
- 找到模板
- 定义上下文
- 渲染模板
from django.http import HttpResponse
from django.template import loader,RequestContext
def index(request):
'''使用模板文件'''
# 使用模板文件
# 1.加载模板文件, 模板对象
temp = loader.get_template('booktest/index.html')
# 2.定义模板上下文:给模板文件传递数据
context = RequestContext(request, {
} )
# 3.模板渲染:产生标准的html内容
res_html = temp.render(context)
# 4.返回给浏览器
return HttpResponse(res_html)
★使用快捷方式
def index(request):
# 进行处理,和M和T进行交互。。。
# return HttpResponse('老铁,没毛病')
# return my_render(request, 'booktest/index.html')
return render(request, 'booktest/index.html', {
'content':'hello world', 'list':list(range(1,10))})
3. ★模型高级——ORM
对象-关系映射ORM系统一般以中间件的形式存在
3.1 配置MYSQL数据库
a. 配置数据库信息
在settings.py
中:
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
'ENGINE': 'django.db.backends.mysql',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'NAME': 'test2', #数据库名字,
'USER': 'root', #数据库登录用户名
'PASSWORD': 'mysql', #数据库登录密码
'HOST': 'localhost', #数据库所在主机
'PORT': '3306', #数据库端口
}
}
注意:数据库test2 Django框架不会自动生成,需要我们自己进入mysql数据库去创建。
b. 安装mysql数据库的包
pip install pymysql
c. 添加install mysql
在主模块的__init__.py
内写入:
import pymysql
pymysql.install_as_MySQLdb()