什么是DJango框架?
一个由python写成的开放源代码Web应用框架,主要用于后端的编写。
Django本身基于MVC模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。
- 模型(M) - 编写程序应有的功能,负责业务对象与数据库的映射(ORM)
- 视图(V)- 图形界面,负责与用户的交互(页面)。
- 控制器(C)- 负责转发请求,对请求进行处理。
以一个项目实例来进行学习Django
# 首先在我们正确的python环境下,选择好当前的目录
# 在命令行中输入以下代码
django-admin.py startproject project_name
# 之后在该目录中,便成功创建了名为 project_name 的项目
后续的操作可以在cmd中选择好python环境并在project_name目录下进行操作
也可以在vscode或pycharm等编程软件中的terminal中直接操作
为方便,接下来的笔记都以在编程软件中为例
启动服务器
py manage.py runserver 0.0.0.0:8000
# 0.0.0.0表示同一个网络的终端都可以连接到你的这个服务器,端口使用8000
# 若不填写IP地址与port信息则只有自己的主机才可以登录这个服务器
# 后续可以在浏览器中输入 127.0.0.1:8000 来进入这个服务器
可能遇到的错误:
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
在terminal中输入 py manage.py migrate
重建表结构,虽然不知道为什么会有用 : )
开发服务器会根据需要自动为每个请求重新加载Python代码。您无需重新启动服务器即可使代码更改生效。但是,某些操作(例如添加文件)不会触发重新启动,因此在这种情况下,您必须重新启动服务器。
Ctrl+c可以 退出服务器
django 服务器处理请求的机制
当某用户从我的Django支持的网站请求页面时,系统将使用一下算法确定要执行的python代码
-
Django确定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但是如果传入 HttpRequest对象具有urlconf属性(由中间件设置),则将使用其值代替 ROOT_URLCONF设置。
-
Django加载该python模块并查找变量urlpatterns,这个变量应该由一个序列的django.urls.path()或django.urls.re_path()实例(如下)
-
Django按顺序遍历每个URL模式,并在与所请求的URL(即用户输入的路径)匹配的URL模式处停止匹配
-
一旦其中一个URL模式完成匹配,Django就会导入、调用给定的视图views——来源于view.py文件,该视图其实也就是python函数,这个视图会传递一下参数:
- HttpRequest类的一个对象request
- 若匹配的URL模式不包含命名组,则来自正则表达式的匹配项将作为位置参数来提供
- 关键字参数由提供的路径表达式匹配的任何命名部分组成,此处路径表达式由django.urls.path()或django.urls.re_path()提供
-
若没有任何URL模式匹配,或在过程中发生了异常,Django都会调用响应的错误处理视图——当然这些视图要后续自己编写
path()函数
其作用就是解析url地址,具体参数如下
*path(, , [name=None,*kwargs])
- route表示从根目录以后的URL地址,到/结束
- view表示在route成功匹配后,需要调用的视图
创建app
py manage.py startapp app_name
# 创建名为app_name的app
创建完app后,可在响应的app目录下的models模块中编写你需要用到的models,也就是类
Django库中已经写好了许多Model类,因此在自建models时基本上都可以继承这些类,而后自身再编写一些类的基本属性,因为继承了Model类,所以实例变量基本不用再声明了(如下)
编写完后,为了告诉我们的项目该app已安装,需要到settings.py文件中修改信息,如下
连接数据库——MySQL
首先需要在settings.py文件中设置好关于数据库的相关配置变量,如下
创建/更改模型
models模型更改的三个步骤:(以polls文件为例)
- (同上)在models.py中更改模型相关信息
- 在terminal中运行 py.manage.py makemigration 创建相关表的信息?
- 在terminal中运行 py.manage.py migrate 将这些该用应用到数据库中
Django中的Model类——用来和数据交互(读取、传入数据)
model的一个子类对应数据库中的一个表,且其属性对应数据库中的字段(即列名)
子类属性有以下常用的基本类:
-
CharFiled 字符类型
-
BooleanField 布尔类值
-
FloatField 浮点型
-
TextField 文本类型
-
DateField 日期类型,有严格的格式要求:YYYY-MM-DD
有参数:auto_now 每次保存时,自动设置该字段为当前时间
-
DaeTimeField 日期时间类型,有严格格式要求:YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
-
ForeignKey 一对多,将字段定义在多端,可以将两种类(表)关联起来
有很多一般参数。
max_length 最大长度
default 默认值
primary_key 主键
choices 一个包含多元素元组的可迭代的对象
unique 唯一值
例如:
class Order(models.Model): # 继承models.Model类
# 三个属性分别是三种不同的属性,每个属性对应数据库中的字段
no = models.UUIDField(verbose_name='订单编号')
price = models.DecimalField(verbose_name='订单金额',max_digits=6, decimal_places=2)
pay_state = models.BooleanField(default=False)
我们在定义models时,也可以给各个models之间制定关系,来方便彼此之间互相联系、操作。
- ForeignKey 一对多,即一个model_A可以对应、控制、操作多个model_B,将字段定义在多端,且自动在多端添加一个外键(可用来检索)
- OneToOneField 一对一,将字段定义在任意一端
- ManyToManyField 多对多,需要将字段定义在两端
以下给出实例
Django提供的一些免费API
原汁原味的API可以在py manage.py shell中及时使用(当然最好是写在views.py中响应网页着用)
或者是写在其他py文件中在服务器运行后自行感受。
obj = model_name.objects.create(attribute_1=... , attribute_2=... ,)
# 该方法直接对数据库进行操作,在对应的表中创建一个新的元组,并将这个对象返回给obj
obj = model_name(attribute_1=... , attribute_2=... ,)
# 这个就是普通的实例化
obj.save() # 将实例化后的类以元组形式存入数据库中
obj.delete() # 在数据库中删除对象元组
obj.atttibute_name # 可以返回对象响应的属性值
# 查找功能
model_name.objects.all() # 返回model_name表的所有元组对象
obj = model_name.objects.filter(attribute=...) # 过滤出符合条件的数据
obj = model_name.objects.exclude(attribute=...) # 去掉符合条件的数据
obj = model_name.objects.get(attribute=...) # 选出条件对应的数据,有且仅有一个
# 在查询过程中,注意一般所有类都有主键属性pk,因此查找时也可以通过主键筛选得出对象
# 对象间的关联
# 比较多用到的为“一对多”关联,需要用到ForeignKey属性
class School(models.Model): # "一"方模型
name = models.CharField(max_length=30)
address = models.CharField(max_length=30)
history = models.TextField(null=True)
class Student(models.Model): # "多"方模型
name = models.CharField(max_length=10)
age = models.IntegerField()
score = models.FloatField()
sex = models.CharField(max_length=10)
school = models.ForeignKey(School,on_delete=models.CASCADE)# 与School关联起来
# 之后用model_name_set方法进行查询,如下
school = School.objects.get(id=1)
students = school.student_set.all()
# 也有all,filter,get等方法,所有上面出现的方法均可使用,使用格式一致
Django Admin
Django为了方便对project进行管理,有自己的管理员系统。
第一次使用时,可以在命令窗输入以下命令来创建一个管理员账户:
py manage.py createsuperuser
之后按照命令提示依次设置Username、EmailAddress、Password
值得一提的是,在输入密码时窗口不会显示任何字符,但是实际上密码已经输入了
Requset and reponse objects(请求与响应对象):
当请求页面时,Django创建一个HttpRequest对象,其中包含有关请求的元数据。然后Django加载适当的视图,将HttpRequest作为第一个参数传递给view函数。每个视图负责返回一个HttpResponse对象。