Python Web开发Django-01
一、基础知识
- C/S与B/S
- django框架
- MVC
- django的MTV
二、项目构建
- 环境
- 搭建项目
- 启动服务器
- django请求流程
三、项目目录结构
四、自定义路由与请求处理函数
作业
一、基础知识
C/S与B/S
- C: Client 客户端
- B: Browser 浏览器
- S: Server 服务器
浏览器是最常见的客户端,几乎所有平台上(安卓,Ios,Windows,MacOS,Linux,树莓派等嵌入设备)都有浏览器。
单机到客户端与服务器,发展历史
HTTP
超文本传输协议(HTTP,HyperText Transfer Protocol) 是互联网上应用最为广泛的一种网络协议。互联网从传输简单问文字,网页只包含文字,到包含多媒体。
目前使用的版本是HTTP 1.1
URL
统一资源定位符,用于定位网络上某个资源,通过URL可以访问到对应的网络资源。
常见格式:scheme://domain/path
- scheme:协议,例如:http、https、ftp
- domain:服务器地址,格式:
域名或者IP:端口号
。例如:127.0.0.1:8000;www.baidu.com - path:资源路径,指明要访问的资源在服务器上的位置。例如:/images/logo.png
类似于电话号码,通过电话号码找到某个人,电话号码具有一定的格式
服务器处理请求的流程
请求-->路由-->业务处理函数-->数据库-->网页-->返回给客户端
django框架
地址:https://www.djangoproject.com/
- 从2005初步完成,是开源框架
- 重量级的python Web开发框架,内置了大量的模块工具
- 使用的是MVC的设计思想
MVC
分工合作:盖房子,砌墙工,和水泥,砖头供应
web开发中类似于盖房子,但是分为数据模型,视图,控制器
全名是Model View Controller。是一种软件设计思想,用于将业务逻辑、数据、界面显示分离。
- model 模型:用于管理业务数据,例如:数据库的增删改查
- view 视图:用于显示业务数据
- controller 控制器:用于从视图中获取数据,以及向model中发送数据,控制数据在视图中的展示
MVT
django使用的是MVC思想。使用MTV方式来实现MVC思想:
- M:model 数据层,用户处理数据库操作
- T:template 视图模板,用于显示数据
- V:view 控制器,用处理用户请求,返回响应数据。
二、项目构建
环境
ubuntu 16.04+python3 或者 MacOS 10+
安装虚拟环境
# 更新软件
sudo apt-get update
# 安装python3
sudo apt-get install python3
# 安装python3 pip
sudo apt-get install python3-pip
# 切换到home目录下
cd ~
mkdir DjangoProjects
cd DjangoProjects
# python虚拟换件管理工具
sudo pip3 install virtualenv
# 创建虚拟环境
virtualenv -p python3 .djenv
# 启动虚拟环境
source ~/DjangoProjects/.djenv/bin/activate
# 退出虚拟环境
deactivate
# 配置启动虚拟环境命令别名
vim ~/.bashrc
# 尾部添加
# alias djenv=‘source ~/home/u/DjangoProjects/.djenv/bin/activate’
# 启动虚拟环境
djenv
# 安装django库
pip install django==1.11
# 安装pylint-django
pip install pylint-django
# 查看已经安装的包
pip freeze
# 新建项目
django-admin startproject Django01
# 启动服务器
cd Django01
./manage.py runserver
# 打开浏览器访问 127.0.0.1:8000
四、项目目录结构
Django01/
manage.py
Django01/
__init__.py
settings.py
urls.py
wsgi.py
Django01项目文件夹
-
manage.py
:所有的django项目中默认都会创建这个文件,它是django项目的命令行管理工具。 -
Django01/Django01
是一个python包, -
Django01/Django01/__init__.py
是一个空文件,用户指明这个文件夹是python包 -
Django01/Django01/settings.py
项目的相关配置信息 -
Django01/Django01/urls.py
路由配置文件 -
Django01/Django01/wsgi.py
项目部署时用到的文件
settings配置信息
- DEBUG:开发环境下始终为True,只有在项目部署到生产环境时改为False
- ALLOWED_HOSTS:允许被访问的主机
- INSTALLED_APPS:需要安装的应用,django中自带了了一些应用已经,创建应用后,要把应用的名称加入到这里
- ROOT_URLCONF:根路由文件
- TEMPLATES:模板引擎配置信息
- DATABASES:数据库配置信息
Django请求流程
请求-->路由-->处理函数-->数据库操作-->渲染模板-->返回响应数据
类似于一家门厂。客户:想要买门。接单客服:接待客户。库房:找到对应的门。客服安排发货。
- 请求由客户端发起
- 路由负责对客户端发起的请求进行解析,找到对应的处理函数
新建应用
./manage.py startapp MyApp
MyApp/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
- admin.py:django自带的后台管理工具的相关配置
- apps.py:这个应该相关配置信息
- migrations/ :数据库迁移文件目录
- models.py:存放数据模型
- tests.py:测试文件
- views.py:视图处理函数文件
五、创建请求处理函数并绑定路由
在views新建视图处理函数
视图处理函数格式
def hello_world(request):
# 处理过程
return HttpResponse('')
第一个参数必须是request,并且每一个处理函数必须返回一个HttpResponse对象
绑定路由
from MyApp.views import hello_wolrd
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello_world$', hello_world),
]
路由格式:url(正则匹配,处理函数名)
浏览器中访问
127.0.0.1:8000/hello_world
子路由
园区-->楼-->几层
或者一家公司,前台-->分机号-->人
from django.conf.urls import include
from MyApp.views import hello_wolrd
from MyApp import urls as myapp_urls
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello_world/', include(myapp_urls)),
]
Python Web开发Django-02
一、ORM是什么
- 数据表
- 面向对象
- 对应关系
二、在django中如何构建映射关系
- 构建对应的model
- 配置数据库
- 迁移数据
三、常用字段
- 普通字段
- 关联字段
四、ORM的使用
- 简单操作
- 复杂操作
- 关联数据
- 数据查询
- 数据更新
- 数据删除
作业
一、ORM是什么
ORM 对象关系映射,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
数据操作请求-->ORM-->数据库(mysql,oracle,mssql,sqlite3...)
不同数据库语法有差别,支持的功能不同
数据库表
- 表名
- 字段
- 数据记录
面向对象
- 类名
- 属性
- 对象
结合起来
类名<--->表名
类属性<---->表字段
对象<---->数据记录
django中通过操作类和对象来实现对数据库表以及记录的操作
二、在django中如何构建映射关系
构建类与数据表的对应关系:构建model类-->生成迁移文件-->执行迁移
构建model
在MyApp下model.py
中新增类,继承自django.db.models.Model
class Student(models.Model):
pass
这里的Student对应的是一张数据库表。
为Student类添加属性,对应数据表的字段
class ClassRoom(models.Model):
name= models.CharField(max_length=32)
数据表字段由字段名、字段类型、字段属性组成
name
-->字段名
、model.CharField
-->字段类型
、max_length=32
-->字段属性
配置数据库
安装mysql数据库
安装mysql数据库:sudo apt-get install mysql-server
创将数据库用户grant all on *.* to 'django'@'%' identified by 'djangopwd';
创建数据库 create database django01 character set=utf8;
安装连接mysql库
- sudo apt-get install python3-dev libmysqlclient-dev
- pip install mysqlclient
在settings.py中修改默认的数据库
django默认的数据库是sqlite
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django01',#数据库名
'USER': 'django',#数据库用户名
'PASSWORD': 'djangopwd',#数据库用户密码
'HOST': 'localhost',#数据库地址
"PORT": '3306'#数据库端口号
}
}
迁移数据
# 生成迁移文件,生成的迁移文件在MyApp/migrations/下
./manage.py makemigrations MyApp
# 执行迁移
./manage.py migrate
三、字段
普通字段
- AutoField:自增长字段
- CharField:字符串
- IntegerField:整数
- BooleanField:布尔
- TextField:大文本
- DateField:日期
- DateTimeField:日期时间
- FloatField:浮点
关联字段
- ForeignKey 多对一
- ManyToManyField 多对多
- OneToOneField 一对一 是特殊的多对一关系
通用字段属性
- null:默认是False,数据库中该字段是否可以为null
- db_index:默认False,表示该字段是否构建索引
- primary_key:默认False,是否主键
- unique:默认False,该字段的值是否不能有重复
- default:字段的默认值
- blank:默认为False,通常使用在char或text类型上,表示是否可以存储
''
,它与null不同,null是数据库级别限制,blank是业务上的限制 - help_text:帮助说明信息
- choices: 接受一个遍历对象,对象中每一个元素是一个2位元素的元组;该字段的值只能从给出的列表中选一个,元组中第一个元素是保存到数据库中,第二个元素只是一个别名,例如:
gender_choices = (
('male', '男'),
('female', '女'),
)
- db_cloumn:数据表字段名,默认情况下是属性名
关联字段属性
ForeignKey与OneToOneField:
- on_delete:
- models.CASCADE:级联删除,当主键删除时,所有关联的数据全部删除
- models.PROTECT:保护,当删除主键时,假如还有关联数据,那么抛出异常
- models.SET_NULL:主键删除时,将该字段设置为null
- models.SET_DEFAULT:设置为默认值,但是必须在定义字段是给出默认值
- models.SET():使用函数的返回值作为字段值
- models.DO_NOTHING:什么都不做
使用ORM管理数据
每一个类都有一个默认的属性:objects,他是一个管理器
django中执行数据库操作需要通过,类的属性objects执行
简单操作
创建数据
两种方式创建一条数据
obj=ClassRoom()
obj.attr=value
obj.save()
创建一个类对象,对象属性赋值,执行保存
数据更新
obj.attr=value
obj.save()
更新对象属性,执行保存
查询数据
ClassRoom.objects.get()
删除数据
obj.delete
复杂操作
关联关系数据创建
一对一
多对一
多对多
数据查询
字段特殊查询
-
age__lt=10
: ====where age < 10
-
age__lte=10
: ====where age <= 10
-
age__gt=10
: ====where age > 10
-
age__gte=10
: ====where >= 10
-
name__contains='tom'
: ====where name like '%tom%'
-
name__icontains='tom'
: ====where name ilike '%tom%'
-
name__startswith='tom'
: ====where name like 'tom%'
-
name__istartswith='tom'
: ====where name ilike 'tom%'
-
name__endswith='tom'
: ====where name like '%tom'
-
name__iendswith='tom'
: ====where name ilike '%tom'
-
age__in=[20,25,28]
: ====where age in (20,25,28)
-
street__isnull=True
: ====where steert is null
字段关联查询
-
classroom__name='1801'
: ====WHERE blog.name='1801'
-
classroom__name__contains='1801'
: ====WHERE blog.name like '%1801%'
定义属性字段时,不可以使用包含
__
的名字
Q
命名参数查询对应到数据查询时,使用的是 and
逻辑。如果要使用or
和not
,那么需要借助于Q
Q实现or
ClassRoom.objects.filter(name='1801',Q(bodys__gt=20)|Q(girls__lt=5))
Q实现not
ClassRoom.objects.filter(~Q(girls__lt=5))
F
F可以实现一条数据内部字段的比较,比如:
ClassRoom.objects.filter(girls__gt=F('boys'))
聚合查询
- 平均值 Avg
- 最大值 Max
- 最小值 Min
- 数量 Count
Student.objects.aggregate(Avg('age'))
更新多条数据
ClassRoom.objects.filter(...).update(...)
删除多条数据
ClassRoom.objects.filter(...).delete()
Python Web开发Django-03
ORM补充
- 关联数据的读取
- 主表读取从表
- 从表读取主表
模板引擎
- 模板引擎原理
- 实现一个简单的模板引擎
- 如何使用django自带的模板引擎
- django模板引擎调用过程
模板引擎语法
- 模板构成
- 注释
- 变量打印
- 条件判断
- 循环
- 乘除法
- 转义
- 过滤标签
- 静态资源
- 继承与block
- 包含
ORM补充
一对一
主--->从
mobj.字段名
例如:student.desktop
读取的是DeskTop对象
从--->主
sojb-->主类名小写
例如: desktop.student
读取的是Student对象
多对一
主-->从
mobj.字段名
例如:student.classroom
读取的是一个ClassRoom对象
从-->主
sobj-->主类名小写__set.过滤函数
例如:classroom1.student_set.all()
多对多
主-->从
mobj.字段名.过滤函数
例如:author.book.all()
读取的是一个数据集合对象
从-->主
sobj-->主类名小写__set.过滤函数
例如:book.author_set.all()
模板引擎
模板引擎原理
模板包含两个部分:静态数据+动态数据
构建特殊的文件,文件内容包含特殊的字符,使用处理函数将特殊字符替换成其他数据
使用函数实现字符串替换
s='''用户名:name;年龄:age'''
def render(name,age):
result = s.replace('name',str(name)).replace('age',str(age))
return result
如何使用django自带的模板
django自带的模板引擎执行流程:加载模板,导入参数,模板渲染
模板引擎配置
函数中调用模板引擎
模板语法
网页模板包含两个部分:网页原始内容+模板语法
注释
网页原始注释: ``
单行注释: {# 注释内容 #}
多行注释: {% comment %} 注释内容 {% endcomment %}
变量打印
{{变量名}}
条件判断
{% if xxx %}
{% elif xxx %}
{% else %}
{% endif %}
{% ifequal a b %}
{% endifequal%}
{% ifnotequal a b %}
{% endifnotequal%}
循环
{% for item in items %}
{% endfor %}
{% for item in items %}
{% empty %}
{% endfor %}
乘除法
django模板引擎不能够直接使用变量的相乘以及相除
{% widthratio 数值变量 分母 分子 %}
转义
{% autoescape off|on %}
{% endautoescape %}
过滤标签
- safe:不对变量数据进行转义
- join:把元素连接起来,相当于
''.join(var)
- length:获取变量的长度 相当于
len(var)
静态资源
配置django静态文件夹路径
STATICFILES_DIRS
=[os.path.join(BASE_DIR,'static_path')]
模板中使用{% load static %}
{% static 资源位置 %}
继承
{% extends 父模板名称 %}
{% block block_name %} {% endblock %}
包含
{% include 模板名称 %}
Python Web开发Django-04
课程内容
路由规则
- 固定位置参数
- 命名参数
请求与响应
- 请求
- 响应
路由规则
给函数传递参数常用方式:func(arg1,arg2,arg3...),func(key=value,key2=value2,key3=value3...)
固定位置参数
url(r'path/(\d{4})/(\d{1,2})/(\d{1,2})',view_name)
view_name(request,arg1,arg2,arg3)
命名参数
url(r'path/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})',view_name)
view_name(request,month,day,year)
请求与响应
请求
request是HttpRequest对象,包含用户请求的所有信息
属性
- GET:字典类型,包含的是url中包含的请求参数
- POST:字典类型,如果与post方式上传一个表单数据,上传的表单数据保存在request.POST中
- FILES:字典类型,如果客户端通过表单上传了文件,那么文件信息保存在request.FILES中
- method:客户端使用的请求方法
- scheme:客户端请求使用的协议
- path:客户端请求的路径
- encoding:客户端数据使用的编码
- content_type:客户端上传数据所使用的数据格式,常见:application/json; multipart/form-data;
- COOKIES:字典格式,客户端请求所带的cookie
- META:包含请求头
方法
- read:读取请求体
- is_ajax:判断是否是ajax
- is_secure:判断是否是使用HTTPS协议
响应
每一个函数的返回值必须是一个HttpResponse对象
构造函数常用参数:
- content:响应体
- content_type:响应体数据类型,例如:application/json
- status:响应的状态码
- reason:状态码说明