django是一个开源的重量级的web框架,由python写成。
M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作。
V全拼为View,用于封装结果,生成页面展示的html内容。
C全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。
M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。
1 浏览器发送请求给wsgi(socket服务端),wsgi接收到请求并将请求进行初次封装,然后将请求交给web框架(flask、Django)
2 框架(flask、Django)对wsgi封装好的请求再次封装成request
3 中间件对请求进行校验或者在请求对象中添加其他相关数据,例如csrf、request.session
4 url路由匹配,寻找对应的视图函数
5 视图函数对请求进行业务处理(增删改查)
6 中间件对响应的数据进行处理
7 wsgi将返回的数据发送给服务器
基于函数的视图叫做FBV,基于类的视图叫做CBV
在python中使用CBV的优点:
1 提高了代码的复用性、可以使用面向对象技术
2 可以用不同的函数针对不同的http方法处理,而不是通过if语句
ORM,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”
优点:操作简单,功能齐全,不用再使用复杂的sql语句。缺点:速度慢
映射关系(一对一、一对多、多对多):
ORM | DB |
---|---|
类 | 表 |
对象 | 数据行 |
属性 | 字段 |
在django使用ORM:
1 手动创建数据库
2 在配置文件(settings.py)中配置数据库的连接信息(host、端口、账号密码、数据库名称等等)
3 在项目的__init__.py中导入MySQL驱动
import pymysql
pymysql.install_as_MySQLdb()
4 在应用中的models.py中定义类
from django.db import models
#定义图书模型类BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name='名称')
bpub_date = models.DateField(verbose_name='发布日期')
bread = models.IntegerField(default=0, verbose_name='阅读量')
bcomment = models.IntegerField(default=0, verbose_name='评论量')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'tb_books' # 指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.btitle
5 数据迁移
生成迁移文件:python manage.py makemigrations
同步到数据库中:python manage.py migrate
6 批量插入数据
insert into tb_books(btitle,bpub_date,bread,bcomment,is_delete) values
('射雕英雄传','1980-5-1',12,34,0),
('天龙八部','1986-7-24',36,40,0),
('笑傲江湖','1995-12-24',20,80,0),
('雪山飞狐','1987-11-11',58,24,0);
1 使用extra
m`odels.Book.objects.extra(select={'count': 'select count(*) from hello_Book'})`
2 使用raw
Book.objects.raw('select * from hello_Book') # 返回模型实例
3 自定义sql
from django.db import connection
cursor=connection.cursor()
# 插入操作
cursor.execute("insert into hello_author(name) values('钱钟书')")
# 更新操作
cursor.execute("update hello_author set name='abc' where name='bcd'")
# 删除操作
cursor.execute("delete from hello_author where name='abc'")
# 查询操作
cursor.execute("select * from hello_author")
raw=cursor.fetchone() # 返回结果行游标直读向前,读取一条
cursor.fetchall() # 读取所有
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。
1 定义一个中间件工厂函数,然后返回一个可以调用的中间件。
中间件工厂函数需要接收一个可以调用的get_response对象。
返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。
def simple_middleware(get_response):
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
def middleware(request):
# 此处编写的代码会在每个请求处理视图前被调用。
response = get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用。
return response
return middleware
定义好的中间件需要在setting.py中注册添加
'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',
'users.middleware.my_middleware', # 添加中间件
]