1、django介绍
Django,是用python语言写的开源web开发框架
采用MVT模式:
M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html
2、工程搭建
1、环境准备(创建虚拟化工程)
cd /opt/devops
virtualenv venv -p python3
source venv/bin/activate
pip install django==2.0
扩展:
生成requirements.txt文件
pip freeze > requirements.txt
安装requirements.txt依赖
pip install -r requirements.txt
2、创建一个项目
django-admin startproject devops
devops/
-- manage.py // 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互
-- devops
-- __init__.py //一个空文件,告诉Python该目录是一个Python包
-- settings.py //该Django项目的配置文件
-- urls.py //该Django项目的 URL 声明
-- wsgi.py //一个WSGI兼容的Web服务器的入口
3、指定ip与端口起动服务
python manage.py runserver 0.0.0.0:8000
4、创建一个app
python manage.py startapp app1
app1/
├── admin.py //文件跟网站的后台管理站点配置相关
├── apps.py //文件用于配置当前子应用的相关信息
├── __init__.py
├── migrations //目录用于存放数据库迁移历史文件
│ └── __init__.py
├── models.py //文件用户保存数据库模型类
├── tests.py //文件用于开发测试用例,编写单元测试
└── views.py //文件用于编写Web应用视图
激活app
INSTALLED_APPS = (
……
'app1.apps.App1Config',
)
3、django配置
//配置数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'devops',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': 3306,
}
}
//本地语言与时区
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
//将app放入apps目录内(个人习惯)
import sys, os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
//配置访问控制
ALLOWED_HOSTS = ["*"]
4、ORM
django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。
使用django进行数据库开发的步骤如下:
1、配置数据库连接信息
2、在models.py中定义模型类
3、迁移
4、通过类和对象完成数据增删改查操作
4.1 配置数据库连接信息
1、在settings.py配置数据库连接信息
2、使用MySQL数据库首先需要安装驱动程序
pip install PyMySQL
3、在Django的工程同名子目录的__init__.py文件中添加如下语句
from pymysql import install_as_MySQLdb
install_as_MySQLdb()
4.2 定义模型类
创建应用booktest,在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
#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
GENDER_CHOICES = (
(0, 'female'),
(1, 'male')
)
hname = models.CharField(max_length=20, verbose_name='名称')
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'tb_heros'
verbose_name = '英雄'
verbose_name_plural = verbose_name
def __str__(self):
return self.hname
4.2.1 关于主键
django会为表创建自动增长的主键列,属性为id。每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。
4.2.2 字段类型
4.2.2 选项
4.2.3 多表实例
表与表之间的关系可分为以下三种:
- 一对一: 一个人对应一个身份证号码,数据字段设置 unique。
- 一对多: 一个家庭有多个人,一般通过外键来实现。
- 多对多: 一个学生有多门课程,一个课程有很多学生,一般通过第三个表来实现关联。
参考资料:
多对多:https://blog.csdn.net/momoda118/article/details/121366803
表结构
书籍表 Book:title 、 price 、 pub_date 、 publish(外键,多对一) 、 authors(多对多)
出版社表 Publish:name 、 city 、 email
作者表 Author:name 、 age 、 au_detail(一对一)
作者详情表 AuthorDetail:gender 、 tel 、 addr 、 birthday
---------------------------------------------------------------------
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
pub_date = models.DateField()
# 外键在一对多的多中设置
publish = models.ForeignKey("Publish", on_delete=models.CASCADE)
# 多对多
authors = models.ManyToManyField("Author")
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=64)
email = models.EmailField()
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.SmallIntegerField()
# 一对一
au_detail = models.OneToOneField("AuthorDetail", on_delete=models.CASCADE)
class AuthorDetail(models.Model):
gender_choices = (
(0, "女"),
(1, "男"),
(2, "保密"),
)
gender = models.SmallIntegerField(choices=gender_choices)
tel = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
birthday = models.DateField()
4.2.4 迁移
1)生成迁移文件
python manage.py makemigrations
2)同步到数据库中
python manage.py migrate
4.3 数据库操作
Django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境(如连接好数据库等),以便可以直接在终端中执行测试python语句
python manage.py shell
4.3.1 增加(两种方法)
>>> hero = HeroInfo(
hname='孙悟空',
hgender=0,
hbook=book)
>>> hero.save()
>>> HeroInfo.objects.create(
hname='沙悟净',
hgender=0,
hbook=book
)
2、查询
4.3.1 查询
1、查询所有、查询数量
>>> BookInfo.objects.all()
>>> BookInfo.objects.count()
2、过滤查询
>>> BookInfo.objects.filter(id=1)
>>> BookInfo.objects.filter(btitle__contains='传')
3、比较查询
>>> BookInfo.objects.filter(id__gt=3)
gt 大于 (greater then)
gte 大于等于 (greater then equal)
lt 小于 (less then)
lte 小于等于 (less then equal)
4、Q对象查询,如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中
BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
5、聚合函数,聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中
BookInfo.objects.aggregate(Sum('bread'))
6、排序
BookInfo.objects.all().order_by('-bread') # 降序
7、关联查询
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all() //一对多
b.hbook //多到一
4.3.1 修改
1、保存
hero = HeroInfo.objects.get(hname='猪八戒')
hero.hname = '猪悟能'
hero.save()
2、更新
HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')
4.3.1 删除
hero = HeroInfo.objects.get(id=13)
hero.delete()
HeroInfo.objects.filter(id=14).delete()
5、路由
path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已经添加。
re_path:用于正则路径,需要自己手动添加正则首位限制符号。
from django.urls import re_path # 用re_path 需要引入
urlpatterns = [
# 普通路径
path('index/', views.index),
# 正则路径
re_path(r'^articles/([0-9]{4})/$', views.articles),
# 正则路径中的有名分组(?P<组名>正则表达式)
re_path("^index/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$", views.index)
#路由分发,让每个app目录都单独拥有自己的 urls。
path("app01/", include("app01.urls")),
]
6、权限控制
6.1 jwt
请求需要带上请求头去访问