python下的Django框架

什么是DJango框架?

一个由python写成的开放源代码Web应用框架,主要用于后端的编写。

Django本身基于MVC模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。

  • 模型(M) - 编写程序应有的功能,负责业务对象与数据库的映射(ORM)
  • 视图(V)- 图形界面,负责与用户的交互(页面)。
  • 控制器(C)- 负责转发请求,对请求进行处理。
    MVC模型

以一个项目实例来进行学习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代码

  1. Django确定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但是如果传入 HttpRequest对象具有urlconf属性(由中间件设置),则将使用其值代替 ROOT_URLCONF设置。

  2. Django加载该python模块并查找变量urlpatterns,这个变量应该由一个序列的django.urls.path()或django.urls.re_path()实例(如下)
    在这里插入图片描述

  3. Django按顺序遍历每个URL模式,并在与所请求的URL(即用户输入的路径)匹配的URL模式处停止匹配

  4. 一旦其中一个URL模式完成匹配,Django就会导入、调用给定的视图views——来源于view.py文件,该视图其实也就是python函数,这个视图会传递一下参数:

    • HttpRequest类的一个对象request
    • 若匹配的URL模式不包含命名组,则来自正则表达式的匹配项将作为位置参数来提供
    • 关键字参数由提供的路径表达式匹配的任何命名部分组成,此处路径表达式由django.urls.path()或django.urls.re_path()提供
  5. 若没有任何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类,所以实例变量基本不用再声明了(如下)
Question类

编写完后,为了告诉我们的项目该app已安装,需要到settings.py文件中修改信息,如下
settings设置

连接数据库——MySQL

首先需要在settings.py文件中设置好关于数据库的相关配置变量,如下
settings_datebase

创建/更改模型

models模型更改的三个步骤:(以polls文件为例)

  1. (同上)在models.py中更改模型相关信息
  2. 在terminal中运行 py.manage.py makemigration 创建相关表的信息?
  3. 在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对象。