Django是开源的、大而且全的Web应用框架。
它独具特色,采用了MTV设计模式。
它也是一款用来构建服务器的框架。这一概念如何理解呢?
应用程序有两种模式:C/S、B/S。
C/S是客户端与服务器端,这类程序一般能独立运行。
B/S是浏览器端和服务器端应用程序,这类应用程序一般要借助谷歌、火狐等浏览器来运行。
Web应用程序一般用B/S模式。
在网络编程的意义下,浏览器是一个socket客户端,服务器是一个socket服务端。而Django正是这样一种用来构建服务器的框架。
Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。
Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
强大的数据库功能
用 python 的类继承,几行代码就可以拥有一个丰富、动态的数据库操作接口(API),如果需要,你也能执行 SQL 语句ORM(Object-Relational Mapping“对象-关系-映射”),它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库。
自带强大的后台功能
在admin.py中写入几行简单实现功能代码就能实现管理员的权限。
优雅的网址
在urls.py中用正则匹配网址,传递到对应的函数,更加简单的编写路由。
具有模板系统
模板系统设计简单,易扩展。代码、样式分开设计,有助于查找和修改。
高效的缓存系统
Django和memcached、redis或者其他的缓存系统可联用,页面加载速度提升。
pip是Python的包管理工具。使用它可方便下载各种Python的插件库。
如果电脑中没有pip可点击:pip · PyPI
下载最新的pip压缩包并进行解压,进入解压的目录。
在目录上方输入cmd然后回车进入命令行。
执行安装命令,在命令行输入:
python setup.py install
安装
通过pip安装Django。
在cmd命令行中输入下面代码,然后回车进行下载安装。
pip install Django==2.2.6 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
其中2.2.6为版本号,-i和后面是表示使用国内镜像进行下载。
验证安装成功
在cmd命令行中输入
pip list
然后回车,查看列表的版本为2.2.6的Django,则安装成功。
配置环境变量
我们需要将Django配置进环境变量,才可以使用django-admin命令(后续会使用到)
首先我们要找到Django的安装位置,可能的安装位置有如下两处:
C:\Users\Administrator\AppData\Roaming\Python\Python310\Scripts
(因每个人使用的Windows用户不一样,administrator也有可能是其他内容。python310为小编安装的python版本号,不同版本有所区别)
或者C:\Program Files\Python310\Scripts
(python310同上)
在该文件夹下有一个django-admin.py 或 django-admin.exe 文件,有该文件的文件夹为django的安装位置,将这个安装位置(是一个文件夹路径)配置到环境变量中:
环境变量的配置方式:右键我的电脑->属性->高级系统设置->环境变量->系统变量->path变量
如需卸载当前版本的Django,那么需要在命令行输入命令:
pip uninstall django
如果要更换Django版本,需要先卸载当前版本,然后再下载新版本。
创建一个名为project的Django项目,在cmd命令行输入
django-admin startproject project
输入命令完会生成一个名叫project的项目包,包内一个manage.py文件和项目名同名的project包。
project包里面我们可以查看到的目录结构:
创建完项目后,在项目同名的project目录内有一个settings.py 文件,这个配置文件用于配置和管理Django项目的运维信息。
settings.py配置文件中的所有配置项都是大写的,项目创建时,就初始化了一些默认配置,这些默认配置承载着最基础的项目信息。
其中常用的配置项有:
DATABASES :数据库配置
TEMPLATES:配置HTML页面的模板地址templates
STATICFILES_DIRS :配置静态文件
MIDDLEWARE :配置中间件
DEBUG:默认为True,项目上线时改为False
ALLOWED_HOSTS:限定请求中的host值
Django的路由系统作用是使views中处理数据的函数与请求的url建立映射关系。
请求到来之后,根据urls.py里的关系条目,查找到与请求对应的处理方法,从而返回数据给客户端http页面。
在Django1.x版本中url映射一般是一条正则表达式,“^” 字符串的开始,“$“ 字符串的结束。项条目从头开始进行逐一对比,一旦遇到匹配项,立即执行该条目映射的视图函数或二级路由,其后的条目将不再继续匹配。因此,url路由的编写顺序至关重要!
在Django1.x中,一个url映射条目至少有两个参数,一个是正则规则,一个是视图函数,代码如下:
from django.conf.urls import url # url()方法导入方式
url(r'^test/$',views.test) # django2中使用re_path替换url
在Django2.x版本中路由映射使用 path() 或 re_path() 方法,path()没有了正则的那些规则,直接匹配字符串,re_patah() 用法和url()一样,path()的运用如下:
from django.urls import path,re_path # path()方法的导入方式
path('test/',views.test) # 不需要使用 ^ $ 等正则规则
注意:本课程中使用re_path()的正则匹配,可自行选择path()或re_path()。
当有多个应用(App)时,我们会在每个App里,各自创建一个urls.py路由模块,然后从根路由出发,将app所属的url请求,全部转发到相应的urls.py模块中。
让我们来确认一下你的 Django 项目是否真的创建成功了。
下面将运行服务,访问这个项目。
如果你的当前目录不是外层的project目录的话,请切换到此目录,然后运行下面的命令:
python manage.py runserver 8000
其中:
这时,我们可以看见:‘https://127.0.0.1:8000/’,它表示服务器成功运行。
在浏览器访问‘https://127.0.0.1:8000/’,你将会看到如下页面。
127.0.0.1表示在本机访问,可以用localhost替代。
注意:不要关闭cmd窗口,否则服务器也将关闭。
创建一个名为firstApp的应用,要先进入项目目录下,在cmd命令行输入
python manage.py startapp firstApp
project项目目录下如果出现一个名为firstApp包,则说明应用创建成功。
可以在项目所在路径命令行输入‘tree /F’查看目录层级,此时整个项目的目录层级为:
新创建的应用要进行注册才可以用。
把我们新定义的firstApp加到项目同名目录下的settings.py中的INSTALL_APPS中。把应用的名称写入 ,记得用引号包裹,逗号隔开。
MTV中的V表示的是View,视图函数(或简称视图)只是一个Python函数,它接受Web请求并返回Web响应。
此响应可以是网页的HTML内容,重定向,404错误,XML文档或图像。视图本身包含返回该响应所需的任何任意逻辑。
该代码可以存在于你想要的任何地方,只要它在Python路径上即可。
为了将代码放在某处,惯例是将视图放在一个名为views.py的文件中,该文件位于项目或应用程序目录中。
打开 firstApp/view.py,把下面这些 Python 代码输入进去:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world !")
其中,request参数是用来接收请求报文的,导入HttpResponse对象,用来向客户端返回数据。
如果想看见效果,我们需要将一个 URL 映射到它——这就是我们需要 URLconf 的原因了。
为了创建 URLconf,请在firstApp目录里新建一个 urls.py 文件。
在firstApp/urls.py(没有这个文件就在应用目录下创建urls.py文件,这是子路由)中,输入如下代码:
#子路由
from django.urls import path,re_path
from firstApp import views
urlpatterns = [
re_path('', views.index, name='index'), # re_path可以使用正则匹配视图,相当于Django1版本的url
#... 其他的路由规则
]
下一步是要在根 URLconf 文件中指定我们创建的firstApp模块。在project/urls.py (根路由)文件的 urlpatterns列表里插入一个 include(),添加分路由,把我们自己创建的urls.py与根路由关联,代码如下:
#根路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls), # path匹配的是字符串
path('', include(('firstApp.urls','app'),namespace='app')), # namespace是命名空间
#... 其他的路由规则
]
函数 include( )允许引用其它 URLconfs。每当Django遇到include()(来自django.conf.urls.include()
)时,它会去掉URL中匹配的部分并将剩下的字符串发送给include的URLconf做进一步处理,也就是转发到二级路由去。
此时用你的浏览器访问 http://localhost:8000,你将能够看见 "Hello, world!" ,这是你在index视图中定义的。
Django2.x版本
Django2.x中的路由匹配视图官方推荐用path,path不支持正则匹配,直接匹配相同字符串。与url相比要去掉r、^和$等正则匹配。
#在使用namespace时需要在include中加入app_name,也就是下面的firstApp
#根路由 from django.contrib import admin from django.urls import path,include,re_path # path的导入方式 urlpatterns = [ path('admin/', admin.site.urls), path('', include(('firstApp.urls','firstApp'),namespace='firstApp')),
Django1.x 版本
Django1.x 中路由匹配视图使用url,使用正则匹配。在Django2.x中可使用re_path替换url,其他不变。
#在使用namespace时不需要加入app_name
#根路由 from django.conf.urls import url,include # url导入方式 from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^',include(('firstApp.urls'),namespace="firstApp")), ]
在本教程中路由统一采用re_path正则匹配的方式。
模型(Model)是MTV中的M。模型一般在应用目录下的models.py进行操作。
模型是数据唯一而且准确的信息来源。它包含你正在储存的数据的重要字段和行为。一般来说,每一个模型都映射一个数据库表。
记住:
综上所述,Django 将给你一个自动生成访问数据库的 API。
web项目的数据一般都存在数据库(database)中,模型与数据库的交互是通过ORM完成。
ORM是“对象-关系-映射”的简称。
它是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。这使软件开发人员专注于业务逻辑的处理,提高了开发效率。
现在我们定义一个名为Person的样例模型,并且有first_name和last_name属性。
在应用目录下firstApp/models.py中输入:
from django.db import models
class Person(models.Model):
first_name=models.CharField(max_length=30)
last_name=models.CharField(max_length=30)
class Meta:
db_table="person"
其中类名首字母应当大写。模型继承django.db.models.Model。
first_name 和 last_name是模型的字段。
每个字段都被指定为一个类属性,并且每个属性映射为一个数据库列。
CharField表示定义的字段类型为字符串。
max_length表示字段的最大长度。
db_table='person’是定义模型类在数据库中生成的表单的名字。
以上的 Person 模型能创建一个数据库表,如下:
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
通常,这个配置文件使用 SQLite 作为默认数据库。如果你不熟悉数据库,或者只是想尝试下 Django,这是最简单的选择。
Python 内置 SQLite,所以你无需安装额外东西来使用它。
本课程使用的是MySQL数据库,如果使用默认数据库无需进行下面更改。
用pip安装mysqlclient,mysqlclient是在 Python3.x 版本中用于连接 MySQL 服务器的一个库。
pip install mysqlclient
注意:在Django2中使用pymysql可以会版本报错,所以最好使用mysqlclient。
安装完,打开 project/setttings.py这是个包含了 Django 项目设置的 Python 模块。找到DATABASES对其进行配置。
其中MySQL的默认端口号为3306,如果是本机的数据库,HOST填入:127.0.0.1。
如此操作,数据库的基本配置就完成了。
创建完模型后,我们需要找到项目目录(manage.py所在的目录),生成一个迁移文件,在命令行输入:
python manage.py makemigrations
生成迁移文件之后,执行迁移文件,请使用下面的指令:
python manage.py migrate
执行完迁移,数据库中会根据模型中类和属性生成对应的表。
objects是类的一个属性。
objects是Manager类型的对象,用于与数据库进行交互,称之为管理器对象。
当定义的模型没有指定管理器对象,系统会默认创建一个名为objects的属性作为管理器对象。
objects也可自定义:
首先,自定义一个继承models.Manager的管理类,代码中重写get_queryset方法对数据进行了过滤。代码如下:
class StudentManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(isDelete=False)
然后,自定义管理器对象:
books=StudentManager()
一旦自定义管理器对象,默认的objects就不再自动生成。可以用自定义的管理器对象替它。
objects一般是通过‘类名.objects ’的方法使用
创建对象就是根据模型中定义的类创建一个实例对象,这个对象拥有实际的属性值。
当创建对象时,Django不会与数据库进行交互,调用save()方法时才与数据库进行交互,将对象保存到数据库中。
创建对象的方法有多种,最简单的方法是在类中自定义一个类方法创建对象。定义一个create类方法具体代码如下:
class Student(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField()
@classmethod #类方法
def create(cls, name, age):
return cls(name=name,age=age)
class Meta:
db_table="student"
类方法的定义要在函数的上方添加@classmethod,类方法把类当做第一个参数传给cls,后面的参数就是类的属性的形参,最后返回的把参数赋值给类属性。
创建对象一般在视图函数中,利用类方法创建一个名为小明,年龄为10的实例对象,代码如下:
name="小明"
age="10"
s3 = Student.create(name,age)
s3.save()
执行save()才能保存到数据库。