Django简介

Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。

官网:https://www.djangoproject.com/

开发环境配置

本次Django项目使用的版本是Django2.2 LTS版本

默认建立在Ubuntu系统上并且使用虚拟环境

具体方法请自行百度

CS,BS模型介绍

8NbSCq.png

C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势。早期的软件系统多以此作为首选设计标准。

(用的是ip,tcp/udp通信协议)
B/S结构,即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓3-tier结构。 (采用的是上层的http或者https通信协议)
B/S结构,主要是利用了不断成熟的WWW浏览器技术,结合浏览器的多种scrīpt语言(VBscrīpt、Javascrīpt…)和ActiveX技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。随着Windows 98/Windows 2000将浏览器技术植入操作系统内部,这种结构更成为当今应用软件的首选体系结构。
C/S 与 B/S 区别:
Client/Server是建立在局域网的基础上的.Browser/Server是建立在广域网的基础上的.
1.硬件环境不同
C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.
B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例如电话上网, 租用设备. 信息管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行

2.对安全要求不同
C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.
B/S 建立在广域网之上, 对安全的控制能力相对弱, 面向是不可知的用户群.

3.对程序架构不同
C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.
B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.

4.软件重用不同
C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.
B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.

5.系统维护不同
系统维护在是软件生存周期中,开销大, ——-重要
C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统
B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.

6.处理问题不同
C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统
B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.

7.用户接口不同
C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高
B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.

8.信息流不同
C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低
B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更象交易中心

MVC设计模式

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:

  • Model(模型)表示应用程序核心(比如数据库记录列表)。
  • View(视图)显示数据(数据库记录)。
  • Controller(控制器)处理输入(写入数据库记录)。

MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。

Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
  通常模型对象负责在数据库中存取数据。

View(视图)是应用程序中处理数据显示的部分。
  通常视图是依据模型数据创建的。

Controller(控制器)是应用程序中处理用户交互的部分。
  通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。

MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。

1QDw0e.png

MTV设计模式

Django的MTV模式本质上和MVC是一样的,也是为了各组件间的松耦合关系,只是定义上有些许不同,Django的MTV分别是指:

M 代表模型(Model):负责业务对象和数据库的关系映射(ORM)。

T 代表模板(Tempalte):负责如何把页面展示给用户(html)。

V 代表视图(View):负责业务逻辑,并在适当的时候调用Model和Template。

1QDc1P.png

创建一个Django项目

在终端输入django-admin startproject xxx创建一个名字为xxx的项目

查看默认目录结构

1KbkvD.png

在终端输入python manage.py runserver启动调试服务器,默认ip:127.0.0.1,默认端口:8000

在浏览器中打开会出现如下画面,即代表着初始化成功

1KbMPP.png

注意:pycharm中打开的文件夹是manage.py的上一层目录

Django目录介绍

  • manage.py:是Django用于管理本项目的命令行工具,之后进行站点运行,数据库自动生成等都是通过本文件完成。
  • HelloDiango/_ init _ .py告诉python该目录是一个python包, 暂无内容,后期一些工具的初始化可能会用到
  • HelloDiango/settings.py Django项目的配置文件,默认状态其中定义了本项目引用的组件,项目名,数据库,静态资源等。
  • HelloDiango/urls.py 维护项目的URL路由映射,即定义当客户端访问时由哪个模块进行响应。
  • HelloDiango/wsgi.py.定义WSGI的接口信息,主要用于服务器集成,通常本文件生成后无需改动。

settings.py文件部分介绍(改动部分在代码中会有注释介绍)

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '*reqgfy9el+d94q#&ons-n&_apyz9b^3v%nln)h0r89vt77br$'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
#这里设为"*"代表都可访问
ALLOWED_HOSTS = ['*']


# Application definition,即注册的app,在每次新建一个app后,都要在INSTALLED_APPS这个列表中进行注册,这里以App为例

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'App',
]
#中间件
MIDDLEWARE = [
'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',
]
# 根路由
ROOT_URLCONF = 'HelloDjango.urls'
# 模板
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

WSGI_APPLICATION = 'HelloDjango.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}


# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]


# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/
# 一般改为zh-hans,代表中文
LANGUAGE_CODE = 'zh-hans'
# 一般改位北京时间,但是得注意是上海
TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = '/static/'

测试服务器的启动

python manager.py runserver [[ip:]port]

可以直接进行服务运行默认执行起来的端口是8000,也可以自己指定ip和端口

ip指定为0.0.0.0的时候,匹配本机的全部ip

浏览器访问:localhost:8000可以看到服务器启动成功

迁移数据,pycharm连接数据库

迁移的概念:就是将模型映射到数据库的过程

生成迁移:python manager.py makemigrations

执行迁移:python mananger.py migrate

在初次启动服务器的时候会出现红字

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them.

这个是因为数据没有迁移

在终端中输入python manage.py migrate进行数据迁移,即可消失

介绍DataBase模块,可以直接连接操作数据库Sqlite和MySQL

  • 在settings.py文件中,DATABASES改为如下
1
2
3
4
5
6
'ENGINE':'django.db.backends.mysql',
'NAME':'yourMySQLname',# 自定义
'USER':'root',# 自定义
'PASSWORD':'yourpassword',# 自定义
'HOST':'127.0.0.1',
'PORT':'3306',
  • 其次在MySQL中建立表,在pycharm中连接
  • 最后终端执行迁移

注意:在执行迁移的时候可能会出现如下错误

1
2
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb' .
Did you install mysqlclient or MySQL-python?

填坑

首先介绍一下python中常用的MySQL库

  • mysqlclient
    • python2,3都能直接使用
    • 致命缺点
      • 对msql安装又要求,必须指定位置存在配置文件
  • python-mysql
    • 支持python2,不支持python3
  • pymysql
    • python2,python3都支持
    • 还可以伪装成前面的库

因此要在项目的_ init _.py文件中加入如下代码进行伪装

1
2
import pymysql
pymysql.install_as_MySQLdb()

创建一个应用

在终端输入django-admin startproject xxx或者python manage.py startapp xxx创建一个名字为xxx的app

查看目录结构

1KbwGV.png

使用应用前需要将应用配置到项目中,在settings.py中将 应用加入到INSTALLED_ APPS选项中

项目目录介绍

  • _ init _ .py:其中暂无内 容,使得app成为一个包
  • admin.py:管理站点模型的声明文件,默认为空
  • apps.py:应用信息定义文件,在其中生成了AppConfig,该类用于定义应用名等数据
  • models.py:添加模型层数据类文件
  • views.py:定义URL相应函数(路由规则)
  • migrations包:自动生成,生成迁移文件的
  • tests.py:测试代码文件

基本视图

  • 首先我们在views.py中建立一个路由响应函数
1
2
3
from django.http import HttpResponse
def welcome(request):
return HttpResponse('HelloDjango');
  • 接着我们在urls中进行注册
1
2
from App import views
path('welcome/",views.welcome)

基于模块化的设计,我们通常会在每个app中定义自己的urls

在项目的urls中将app的urls包含进来

1
2
from django.conf.urls import include
path('welcome/" ,include('App.urls'))

基本模板

模板实际上就是我们用HTML写好的页面

创建模板文件夹,两种:

  • 在工程目录的需要注册

    settings中 的TEMPLATES中的DIRS中添加os.path.join(BASE_ DIR,'templates')

    在模板文件夹中创建模板文件

  • 在views中去加载渲染模板

  1. ```python
    from django.template import loader
    template = loader.get_ template(‘xxx’)
    return HttpResponse(template.render())
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

    **注意**:此种方法在注册时需要改变:`xxx.apps.xxxConfig`

    2. `return render(request,'xx')`



    # 定义模型(简单例子)





    - 定义年级

    ```python
    class Grade (models.Model) :
    gname = models.CharField(max_length=10)
    gdate = models.Date TimeField()
    ggirlnum = models.IntegerField()
    gboynum = models.IntegerField()
    isDelete = models.BooleanField()

  • 定义学生

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Students(models.Model):
    sname = models.CharField(max_ length=20)
    sgender = models.BooleanField(default=True)
    sage = models.IntegerField()
    sinfo = models.CharField(max_ length=20)
    isDelete = models .BooleanField(default=False)
    #关联外键
    sgrade = models.ForeignKey(Grade,on_delete=models.CASCADE)

注意

在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:TypeError: init() missing 1 required positional argument: ‘on_delete’

参数说明:
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值,一般情况下使用CASCADE就可以了。
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,可以是一个函数。

测试数据模型

进入python shell: python manage.py shell
导入包:

1
2
3
4
from App.models ,import *
from diango.utils import timezone
from datetime import *

数据测试增删改查

  • 查询:

    1
    2
    3
    类名.obiects.all()
    Grade.obiects.all()

  • 插入数据:

    1
    2
    3
    4
    5
    6
    7
    grade_one= Grade()
    grad_one_gname= 'class1'
    grade_one_gdate_datetime(year=2020,month=1,day=1)
    grade_one_ggirlnum=5
    grade_one_gboynum= 60
    grade_one_save()

  • 查看某个指定对象

    1
    2
    3
    类名.objects.get(pk=1)
    Grade.objects.get(pk=1)

  • 修改数据

    1
    2
    3
    4
    5
    模型对象.属性=属性值
    模型对象.save()
    grade_one_gboynum = 55
    grade_one_save()

  • 删除数据

    1
    2
    3
    模型对象.delete()
    grade_ one.delete()

  • 测试关联对象

    1
    2
    3
    4
    5
    6
    7
    8
    stu = Students()
    stu.sname='Tom'
    stu.sgender=True
    stu.sage= 20
    stu.sinfo='小天才'
    stu.sgrade=grade_one
    stu.save()

  • 获得关联对象集合

    1
    2
    3
    #对象名.关联的类名小写_ set.all()
    grade_ one.student set.all()#获取班级中的所有同学

结合使用

  • 在urls配置路由规则

  • 在views中调用models中的函数进行查询

  • 在views中对模板进行渲染

  • 模板获取views中传过来的数据

  • 渲染后的模板显示给用户挖坑
    表达式

    而填坑需要构建context的参数

    如:

    context={

    ​ ‘student’:’小明’

    }

参考链接

思维导图

1KjOv6.png