Web框架中的一些概念

  • MVC
    • 大部分开发语言中都有MVC框架
    • MVC框架的核心思想是:解耦
    • 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用
    • m表示model,主要用于对数据库层的封装
    • v表示view,用于向用户展示结果
    • c表示controller,是核心,用于处理请求、获取数据、返回结果
  • MVT
    • Django是一款python的web开发框架
    • 与MVC有所不同,属于MVT框架
    • m表示model,负责与数据库交互
    • v表示view,是核心,负责接收请求、获取数据、返回结果
    • t表示template,负责呈现内容到浏览器

Django框架介绍

  • Django是一个高级的Python Web框架,它鼓励快速开发和清洁,务实的设计。
  • 由经验丰富的开发人员构建,它负责Web开发的许多麻烦,因此您可以专注于编写应用程序,而无需重新创建轮子。
  • 它是免费的和开源的。
  • 被官方称之为完美主义者的Web框架。
  • Django可以更快地构建更好的Web应用程序并减少代码。

Django框架的特点

  • 快速开发:Django的宗旨在于帮助开发人员快速从概念到完成应用程序。
  • 安全可靠:Django认真对待安全性,帮助开发人员避免许多常见的安全错误。
  • 超可伸缩性:Web上的一些最繁忙的网站利用了Django快速灵活扩展的能力。

Django可以使用什么Python版本?

Django版本Python版本
2.23.5、3.6、3.7、3.8(在2.2.8中添加)
3.0、3.1、3.23.6、3.7、3.8
  • Django的开发版本

img

img

Django的安装

  • 作为Python Web框架,Django需要Python,在安装Python同时需要安装pip。
1
2
3
4
5
6
# 默认安装最新版
pip install django
# 可以指定版本
pip install django==3.2.*
# 检测当前是否安装Django及版本
python -m django --version

Django的快速入门体验

Django项目创建和运行

如果这是你第一次使用Django,那么你必须要照顾一些初始设置。也就是说,您需要自动生成一些建立Django 项目的代码

从命令行cd到您要存储代码的目录,然后运行以下命令.

(1)创建项目:

1
ajango-admin startproject myweb

我们来看看startproject创建的内容:

1
2
3
4
5
6
7
8
[root@localhost myweb]# tree
.
├── manage.py
└── myweb
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py

关于上面自动生成的目录与文件解释如下:

  • 外部myweb/根目录只是一个项目的容器。它的名字与Django无关; 您可以将其重命名为您喜欢的任何内容。
  • manage.py:一个命令行实用程序,可以让您以各种方式与此Django项目进行交互。你可以阅读所有的细节 manage.py在Django的管理和manage.py。
  • 内部mysite/目录是您的项目的实际Python包。它的名字是您需要用来导入其中的任何内容的Python包名称(例如mysite.urls)。
  • mysite/init.py:一个空的文件,告诉Python这个目录应该被认为是一个Python包。
  • mysite/settings.py:此Django项目的设置/配置。 Django设置会告诉你所有关于设置的工作原理。
  • mysite/urls.py:该Django项目的URL声明; 您的Django动力网站的“目录”。
  • mysite/wsgi.py:WSGI兼容的Web服务器为您的项目提供服务的入口点。

(2)运行开发服务器:

1
2
3
python manage.py runserver
# 远程访问
python manage.py runserver 0.0.0.0:8000

访问http://127.0.0.1:8000/既可以查看测试网页。

默认情况下,该runserver命令在端口8000的内部IP上启动开发服务器。当然也可以指定端口开启服务,如8080端口:

1
python manage.py runserver 8080

(3)创建一个应用程序:

Django自带一个实用程序,可以自动生成应用程序的基本目录结构,因此您可以专注于编写代码而不是创建目录。

要创建您的应用程序,请确保您与目录位于同一目录,manage.py 并键入以下命令:

1
python manage.py startapp myapp

这将创建一个目录myapp,其目录如下:此目录结构将容纳轮询应用程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost demo]# tree myweb/
myweb/
├── manage.py
├── myweb
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── myapp
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py

Django的视图和函数

定义我们的第一个视图

我们来写第一个视图。打开文件myapp/views.py 并放入以下Python代码:

1
2
3
4
from django.http import HttpResponse

def index(request):
return HttpResponse("Hello, world.")

这是Django中最简单的视图。要调用视图,我们需要将其映射到一个URL。为此,我们需要一个URLconf。

要在myapp目录中创建一个URLconf,创建一个名为urls.py。

在myapp/urls.py文件中包含以下代码:

1
2
3
4
5
6
from django.urls import path
from myapp import views

urlpatterns = [
path('', views.index, name='index'),
]

下一步是将根URLconf指向myapp.urls模块。 在 myweb/urls.py添加一条import用于django.urls.include和插入include()的urlpatterns列表,所以你必须打开myweb下的urls写入子urls文件:

1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import include,path # 新增

urlpatterns = [
# path('admin/', admin.site.urls),
path('myweb/', include('myapp.urls')),
]

其中include()函数允许引用其他URLconfs。请注意,该include()函数的正则表达式 没有$(字符串匹配字符),而是尾部的斜杠。 每当Django遇到时 include(),它会排除与该点匹配的任何部分,并将剩余的字符串发送到随附的URLconf进行进一步处理。

您现在已将index视图连接到URLconf中。

重新运行或刷新页面验证它的工作:

1
python manage.py runserver

在浏览器中转到http:// localhost:8000 / myweb /,您应该看到页面出现文本:”Hello, world. “

path()方法

一个路由配置模块就是一个urlpatterns列表,列表的每个元素都是一项path,每一项path都是以path()的形式存在。

path()方法可以接收4个参数,其中前2个是必须的:routeview,以及2个可选的参数:kwargsname

1
path(route, view, name, kwargs)
  • route

    route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项path开始,按顺序依次匹配列表中的项,直到找到匹配的项,然后执行该条目映射的视图函数或下级路由,其后的条目将不再继续匹配。因此,url路由执行的是短路机制,path的编写顺序非常重要!

  • view

    view指的是处理当前url请求的视图函数。当Django匹配到某个路由条目时,自动将封装的HttpRequest对象作为第一个参数,被“捕获”的参数以关键字参数的形式,传递给该条目指定的视图view。

  • name

    对你的URL进行命名,让你能够在Django的任意处,尤其是模板内显式地引用它。这是一个非常强大的功能,相当于给URL取了个全局变量名,不会将url匹配地址写死。

  • kwargs

    任意数量的关键字参数可以作为一个字典传递给目标视图。

项目的模型

Django通过自定义Python类的形式来定义具体的模型,每个模型的物理存在方式就是一个Python的类Class,每个模型代表数据库中的一张表,每个类的实例代表数据表中的一行数据,类中的每个变量代表数据表中的一列字段。Django通过模型,将Python代码和数据库操作结合起来,实现对SQL查询语言的封装。也就是说,你可以不会管理数据库,可以不会SQL语言,你同样能通过Python的代码进行数据库的操作,这就是所谓的ORM。

(1)连接MySQL数据库设置

默认情况下,配置使用SQLite。若不使用SQLite作为数据库,则需要额外的设置,例如 USER,PASSWORD和HOST必须加入。

其中ENGINE设置为数据库后端使用。内置数据库后端有:

  • ‘django.db.backends.postgresql’
  • ‘django.db.backends.mysql’
  • ‘django.db.backends.sqlite3’
  • ‘django.db.backends.oracle’

在myweb/settings.py文件中,通过DATABASES项进行数据库设置

1
2
3
4
5
6
7
8
9
10
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydemo',
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '3306',
}
}

注意:Django使用MySQL数据库需要加载 MySQLdb模块,需要安装 mysqlclient,若已经安装请略过。

1
pip install  mysqlclient

(2)创建模型

在我们的简单的应用程序中,去创建一个stu表信息操作的Model类。

编辑 myapp/models.py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from django.db import models

# Create your models here.

class Stu(models.Model):
'''自定义Stu表对应的Model类'''
# 定义属性:默认主键自增id字段可不写
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16)
age = models.SmallIntegerField()
sex = models.CharField(max_length=1)
classid=models.CharField(max_length=8)

# 定义默认输出格式
def __str__(self):
return "%d:%s:%d:%s:%s"%(self.id,self.name,self.age,self.sex,self.classid)

# 自定义对应的表名,默认表名:myapp_stu
# class Meta:
# db_table="stu"

(3)激活模型

要将该应用程序包括在我们的项目中,我们需要在设置中添加对其配置类的引用INSTALLED_APPS。

该 myappConfig包是在myapp/apps.py文件中,所以它的虚线路径’myapp.apps.myappConfig’。

编辑myweb/settings.py文件,并将该虚线路径添加到该INSTALLED_APPS设置。

1
2
3
4
5
6
7
8
9
INSTALLED_APPS  =  [
'django.contrib.admin'# – 管理站点。你很快就会使用它。
'django.contrib.auth'# – 认证系统。
'django.contrib.contenttypes'# – 内容类型框架。
'django.contrib.sessions'# – 会话框架。
'django.contrib.messages'# – 消息传递框架。
'django.contrib.staticfiles'# – 管理静态文件的框架。
'myapp', # 新增,或者写虚线路径 myapp.apps.MyappConfig
]

现在 Django 知道要包含该应用程序。让我们运行另一个命令:

1
python manage.py makemigrations myapp

通过运行makemigrations,您告诉 Django 您已经对模型进行了一些更改(在本例中,您已经创建了新模型)并且您希望将这些更改存储为迁移

migrations是Django保存模型修改记录的文件,这些文件保存在磁盘上。在例子中,它就是polls/migrations/0001_initial.py,你可以打开它看看,里面保存的都是人类可读并且可编辑的内容,方便你随时手动修改。

接下来有一个叫做migrate的命令将对数据库执行真正的迁移动作。

(4)使用模型

在myapp应用的视图中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 文件:myapp/views.py 文件代码

from django.shortcuts import render
from django.http import HttpResponse
from myapp.models import Stu
# Create your views here.

def index(request):
return HttpResponse("Hello Django!")

def stu(request):
#获取所有stu表信息
lists = Stu.objects.all()
print(lists)
#获取单条学生信息
print(Stu.objects.get(id=1))

return HttpResponse("ok")
  • 配置stu函数的访问路由
1
2
#在myapp/urls.py文件中配置
path('stu/', views.stu, name='stu'),

启动服务后,在浏览器中访问,在命令行终端中查看输出效果: http://localhost:8000/myapp/stu

启用网站Admin管理

(1)数据迁移

Django框架中有一个非常强大的应用功能–自动管理界面,常被Web平台管理者使用,去管理整个Web平台。

默认情况下,在settings.py配置文件中INSTALLED_APPS包含以下应用程序,这些应用程序都是由Django提供:

  • django.contrib.admin - 管理网站。你会很快使用它。
  • django.contrib.auth - 认证系统。
  • django.contrib.contenttypes - 内容类型的框架。
  • django.contrib.sessions - 会话框架
  • django.contrib.messages - 消息框架。
  • django.contrib.staticfiles - 管理静态文件的框架。

为了后续的开发,默认这些应用程序都是包含在里面的。

使用这些Django自带的应用程序,需要我们在数据库中创建一些数据表对应,然后才能使用它们。为此,请运行以下命令(数据结构迁移):

1
python manage.py migrate

其中该migrate命令查看该INSTALLED_APPS设置,并根据myweb/settings.py文件中的数据库设置和应用程序随附的数据库迁移创建任何必需的数据库表。您会看到适用于每个迁移的消息。

migrate命令对所有还未实施的迁移记录进行操作,本质上就是将你对模型的修改体现到数据库中具体的表中。Django通过一张叫做django_migrations的表,记录并跟踪已经实施的migrate动作,通过对比获得哪些迁移尚未提交。(请务必牢记这张表的作用和名称)

(2). 创建管理员用户

首先,我们需要创建一个可以登录管理站点的用户。运行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
python manage.py createsuperuser

# 输入您所需的用户名,然后按Enter键。
Username: admin

# 然后将提示您输入所需的电子邮件地址:
Email address: admin@example.com

# 最后一步是输入你的密码(>=8位)。您将被要求输入密码两次,第二次作为第一次的确认
Password: **********
Password (again): *********
Superuser created successfully.

启动开发服务器

默认情况下,Django管理员站点被激活。让我们开始开发服务器并探索它。

启动开发服务器命令如下:

1
2
3
python manage.py runserver

python manage.py runserver 0.0.0.0:8000

现在,打开一个Web浏览器,访问地址: http://127.0.0.1:8000/admin/

(3). 设置时区和语言:

编辑myweb/settings.py配置文件:

1
2
3
4
5
6
7
...

LANGUAGE_CODE = 'zh-hans' # 简体中文

TIME_ZONE = 'Asia/Shanghai' # 上海时区

...

(4). 将我们自定义的应用程序的加入到后台管理

但我们的自定义应用程序在哪里?并没有显示在后台管理索引页面上。

要做到这一点,打开myapp/admin.py 文件,并编辑代码如下:

1
2
3
4
5
from django.contrib import admin

from myapp.models import Stu # 新增

admin.site.register(Stu) # 新增

(5)更深入设计后台管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 编辑myapp/models.py文件,在Stu类中添加如下信息,让后台管理显示中文字段。

class Stu(models.Model):
'''自定义Stu表对应的Model类'''
#定义属性:默认主键自增id字段可不写
id = models.AutoField("学号",primary_key=True)
name = models.CharField("姓名",max_length=16)
age = models.SmallIntegerField("年龄")
sex = models.CharField("性别",max_length=1)
classid=models.CharField("班级",max_length=8)

# 定义默认输出格式
def __str__(self):
return "%d:%s:%d:%s:%s"%(self.id,self.name,self.age,self.sex,self.classid)

# 自定义对应的表名,默认表名:myapp_stu
class Meta:
db_table="stu"
verbose_name = '浏览学生信息'
verbose_name_plural = '学生信息管理'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 编辑myapp/admin.py 文件,实现信息管理的个性化定制

from django.contrib import admin

# Register your models here.
from myapp.models import Stu

#Stu模型的管理器(装饰器写法)
@admin.register(Stu)
class StuAdmin(admin.ModelAdmin):
#listdisplay设置要显示在列表中的字段(id字段是Django模型的默认主键)
list_display = ('id','name','age','sex','classid')

#设置哪些字段可以点击进入编辑界面
list_display_links = ('id','name')

#list_per_page设置每页显示多少条记录,默认是100条
list_per_page = 10

#ordering设置默认排序字段,负号表示降序排序
ordering = ('id',) #-id降序

#list_editable 设置默认可编辑字段
#list_editable = ['age','sex','classid']

#其他请详见手册文档说明

应用目录

良好的目录结构是每个应用都应该创建自己的urls、forms、views、models、tests、apps、templates和static,每个templates包含一个与应用同名的子目录,每个static也包含一个与应用同名的子目录。