django-喝茶开门(ಥ_ಥ)

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逻辑。如果要使用ornot,那么需要借助于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:状态码说明
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • Web框架之Django: (1)简介: Django是一个由Python写成开源的重量级Web应用框架,采用MT...
    老肖阅读 3,045评论 0 18
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,313评论 1 92
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • Django的来历:python开发的! long long long years ago!劳伦斯出版集团新闻 网...
    JAguys阅读 333评论 0 0
  • 早睡才能早起。早睡早睡皮肤好。早睡使我美丽。晚安,全世界。
    Echo可可阅读 171评论 0 0