Django

一、Django简介:

Django官网地址

Django发布于2005年7月,是当前Python世界里最有名且成熟的网络框架。 最初是被开发用于管理劳伦斯出版集团旗下的以新闻内容为主的网站的,即CMS(内容管理系统)软件。

Django是一个用Python编写的开放源代码的Web应用框架,代码是开源的。此系统采用了MVC的框架模式, 也可以称为MTV模式

什么是MVC模式

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。 通俗的来讲就是,强制性的使应用程序的输入,处理和输出分开。

核心思想:解耦

优点:减低各个模块之间的耦合性,方便变更,更容易重构代码,最大程度的实现了代码的重用

MVC(Model, View, Controller) Model: 即数据存取层。用于封装于应用程序的业务逻辑相关的数据,以及对数据的处理。说白了就是模型对象负责在数据库中存取数据

View: 即表现层。负责数据的显示和呈现。渲染的html页面给用户,或者返回数据给用户。

Controller: 即业务逻辑层。负责从用户端收集用户的输入,进行业务逻辑处理,包括向模型中发送数据,进行CRUD操作。

图解:

浏览器中MVC的表现形式图解:


Django的模式简介

MVT模式

严格来说,Django的模式应该是MVT模式,本质上和MVC没什么区别,也是各组件之间为了保持松耦合关系,只是定义上有些许不同。

Model: 负责业务与数据库(ORM)的对象

View: 负责业务逻辑并适当调用Model和Template

Template: 负责把页面渲染展示给用户

注意: Django中还有一个url分发器,也叫作路由。主要用于将url请求发送给不同的View处理,View在进行相关的业务逻辑处理。

二、创建Django项目

window下安装Django

用django-admin创建项目的时候,在macOS上可以不指定路径就在项目目录下就可以了,但是Windows和Linux在命令后面加一个点,指定当前路径 django-admin startproject hello_django . 注意最后面有一个点,这样就不会创建多级路径了

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
1.查看python版本
python --version
2.建虚拟环境,目录名hello_django_venv
python -m venv hello_django_venv
3.激活虚拟环境
cd hello_django_venv
cd Scripts
activate #激活虚拟环境
pip install django[==版本号]
5.查看Django版本(可跳过此步骤)
django-admin --version
6.建项目(在用户目录下)
django-admin startproject hello_djang .
---------------------------------------------------------
7.进入项目目录下
cd hello_django
8.启服务器
python manage.py runserver
9.改页面语言
找到项目目录,打开settings.py,
找到LANGUAGE_CODE,更改为LANGUAGE_CODE = 'zh-hans'
10.建应用hrs
python manage.py startapp hrs
11.打开settings.py,将创建的应用添加到 INSTALLED_APPS 列表中
12.在建的应用文件下(hrs)打开views.py,开始创作

Linux /Mac 下安装Django

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1.创建项目目录
mkdir hello_django
2.切换到项目目录
cd hello_django/
3.使用venv模块创建虚拟环境,目录名hd_venv
python3 -m venv hd_venv
4.激活虚拟环境
source hd_venv/bin/activate
5.更新pip到最新版本
python -m pip install --upgrade pip
6.使用pip安装django
pip install django
7.通过安装django时安装的脚本工具django-admin检查django版本
django-admin --version
8. 开启一个项目
django-admin startproject hello_django .

利用virtualenv 创建纯净虚拟环境

1
pip install virtualenv

pip freeze 查看已装过哪些包

pip install -r xxx.text 安装指定文件中的包

使用pycharm创建Django项目

1.点击Create New Project 创建一个新项目

2.点击 Django → 选择项目存储路径
如果想在创建项目是新建一个应用, 点击More Setting, 输入应用的名称点击 右下角Greate, 创建项目

ubuntu中安装使用

  1. 安装virtualenv
1
apt-get install python-virtualenv
  1. 创建包含python3版本的虚拟环境
1
virtualenv -p /usr/bin/python3 env

env代表创建的虚拟环境的名称

  1. 进入/退出env
1
2
3
进入 source env/bin/activate

退出 deactivate
  1. pip使用

    查看虚拟环境下安装的所有的包 

    1
    pip list

    查看虚拟环境重通过pip安装的包

    1
    pip freeze

创建一个Django项目

1. 创建项目

1
django-admin startproject halloWorld

该命令是创建一个名为halloWorld的工程

项目目录介绍

下面展示创建以后的文件,具体有哪些文件:

manage.py: 是Django用于管理本项目的管理集工具,之后站点运行,数据库自动生成,数据表的修改等都是通过该文件完成。

init.py: 指明该目录结构是一个python包,暂无内容,在后期会初始化一些工具会使用到。

seetings.py: Django项目的配置文件,其中定义了本项目的引用组件,项目名,数据库,静态资源,调试模式,域名限制等

urls.py:项目的URL路由映射,实现客户端请求url由哪个模块进行响应。

wsgi.py:定义WSGI接口信息,通常本文件生成后无需改动

运行Django项目

1
python manage.py runserver 端口

该命令是运行项目,端口可以不用写,启动的时候会默认随机创建一个可以使用的端口

2. 创建app

1
python manage.py startapp hallo_app

该命令是在blog工程下创建一个名为hallo_app的app

3. settings.py配置文件详细解读

a) 设置语言:

LANGUAGE_CODE = ‘zh-hans’ 表示中文 LANGUAGE_CODE = ‘en-us’ 表示英文

设置时区: TIME_ZONE = ‘Asia/Shanghai’

b) 时区解释: (需要详细回顾思考时区问题)

UTC:世界标准时间,也就是平常说的零时区。 北京时间表示东八区时间,即UTC+8

三、配置Django项目

1.创建的应用

python manager.py startapp cars

执行上面的命令会在当前路径下创建hrs目录,其目录结构如下所示:

  • __init__.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。
  • admin.py:可以用来注册模型,让Django自动创建管理界面。
  • apps.py:当前应用的配置。
  • migrations:存放与模型有关的数据库迁移信息。
  • models.py:存放应用的数据模型,即实体类及其之间的关系(MVC/MVT中的M)。
  • tests.py:包含测试应用各项功能的测试类和测试函数。
  • views.py:处理请求并返回响应的函数(MVC中的C,MVT中的V)。

setting.py

1
2
3
4
5
# 添加应用配置
# 每新建一个应用就要添加一个
INSTALLED_APPS = [
'cars.apps.CarsConfig',
]

2.创建数据库

创建名为cars的数据库, 并指定utf8字符集

3.配置数据库

项目文件下settings.py里

1
2
3
4
5
6
7
8
9
10
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cars', # 与数据库名称对应
'HOST': 'localhost',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '123456',
}
}

在项目文件夹下 __init__.py

1
2
3
import pymysql
#把pymysql方式当成是mysqldb一样使用
pymysql.install_as_MySQLdb()

4.创建模型

models.py

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

class Record(models.Model):

no = models.AutoField(primary_key=True,verbose_name='编号')
car_no = models.CharField(max_length=7, verbose_name='车牌号')
cause = models.CharField(max_length=100, verbose_name='违章原因')
date = models.DateTimeField(auto_now_add=True, verbose_name='违章日期',db_column='happen_date')
way = models.CharField(max_length=100, verbose_name='处罚方式')
dispose = models.BooleanField(default=False, verbose_name='是否受理')

class Meta:
db_table = 'tb_car_record'
verbose_name_plural = '违章记录'
ordering = ('no', )

5.迁移数据库

  • python manage.py makemigrations 应用名
    记录我们对models.py的所有改动,并且将这个改动迁移到migrations这个文件下生成一个文件
  • python manage.py migrate
    把改动作用到数据库

清空数据库
python manage.py flush
[此命令会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表]

6.创建管理员

python manage.py createsuperuser
配置 Username / Email address / Password

7. 配置管理员界面

admin.py

1
2
3
4
5
6
7
8
9
10
11
from django.contrib import admin
from cars.models import Record

class RecordAdmin(admin.ModelAdmin):
# 添加管理员页面需要显示的列
list_display = ('no', 'car_no', 'cause', 'date', 'way', 'dispose')
# 指定搜索列
search_fields = ('car_no',)
# 指定排序方式
ordering = ('no',)
admin.site.register(Record, RecordAdmin)

8.创建视图文件夹 templates / 静态文件夹 static (与应用/项目目录同级)

|— cars

|— static (存放静态文件 css / js / jQuery)

|— templates (存放html页面, 使用pycharm创建项目会自动添加)

setting.py

1
2
# 添加static文件夹路径,os.path.join路径拼接
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

如果使用命令行创建Django项目

还需要在setting.py中添加如下配置:

‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 添加templates文件夹路径
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'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',
],
},
},
]

9.修改视图文件views.py

1
2
3
4
from django.http import HttpResponse

def index(request):
return HttpResponse('<h1>Hello, Django!</h1>')

10.映射URL

应用目录创建一个urls.py文件并映射URL
切换到项目目录,修改该目录下的urls.py文件,对应用中设定的URL进行合并

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

urlpatterns = [
path('', views.index, name='index'),
]
1
2
3
4
5
6
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('hrs/', include('hrs.urls')),

python manage.py shell 增删改查操作

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
python manage.py shell
from hrs.models import Dept, Emp
#添加数据
>>> dept = Dept(dno='16',name='研发部',location='小溪坝')
>>> dept.save()
#删数据
>>> Dept.objects.filter(dno='16').delete()
#更改数据
>>> Dept.objects.filter(dno='16').update(name='销售部')
#查询数据
>>> Dept.objects.all() #查所有
>>> Dept.objects.all().values('location') #查询指定列
>>> Dept.objects.get(dno=16)
#过滤数据
>>>
>>> Dept.objects.filter(name='研发3部') # 查询部门名称为“研发3部”的部门
<QuerySet [<Dept: 研发3部>]>
>>>
>>> Dept.objects.filter(name__contains='研发') # 查询部门名称包含“研发”的部门(模糊查询)
<QuerySet [<Dept: 研发1部>, <Dept: 研发3部>]>
>>>
>>> Dept.objects.filter(no__gt=10).filter(no__lt=40) # 查询部门编号大于10小于40的部门
<QuerySet [<Dept: 销售1部>, <Dept: 运维1部>]>
>>>
>>> Dept.objects.filter(no__range=(10, 30)) # 查询部门编号在10到30之间的部门
<QuerySet [<Dept: 研发1部>, <Dept: 销售1部>, <Dept: 运维1部>]>
all() / filter() --> QuerySet
QuerySet使用了惰性查询 - 如果不是非得取到数据那么不会发出SQL语句
这样就是为了节省服务器内存的开销 - 延迟加载 - 节省空间势必浪费时间
0%