本章所有的重要代码都在图示后面
一、了解MTV模式
Django是标准的基于MTV设计模式的框架。
M → Model模型:是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
T→Template模板:负责如何将页面展示给大众。
V→Views视图:是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
我们可以通过下图对MTV模式和Django处理请求过程了解
- 通过WSGI对Web服务器的socket请求进行处理;
- Django框架(Controller)控制用户输入,对路由器进行控制,分发url并通过映射列表将请求发送到合适的视图;
- 视图Views向模型Model和模板Templates发送或者获取数据;
- 模型Model对数据库进行存取数据;
- 模板Templates,通过模板描述数据将如何展现;
- 视图Views将模板和数据进行整合,形成最终的页面;
- Django框架Controller返回页面展示给用户。
接下来通过新闻专栏的例子对以上进行详细解释。
二、创建Django项目,观察项目结构
在上一章当中,我们在Pycharm上创建了一个Django项目,初始结构如下图所示:
manage.py
:还记得第一章是如何启动Django项目的么?python manage.py runserver
。以后我们都将基于本文件和项目进行交互,切记不要修改里面的内容,除非你很明确你的修改目的。settings
:存放项目所有的配置信息,可添加修改。urls.py
:路由配置器,也叫URL分发器,详情将在后面进行讲解。wsgi.py
:项目部署将用到的文件,一般情况下也是不需要修改的。- template:用来存放项目的前端页面。
三、创建一个App
- 什么是APP:‘App’全称就是我们常说的应用程序Application,在我们的Django项目中,也就是一个个应用模块。比如微信,它就有聊天模块、联系人模块、朋友圈模块以及个人模块,我们可以说,微信是由这些模块来组成的。同理,Django项目也是由多个不同功能的App来组成的。
- Django项目规范和App的创建:正如上面所说,微信是由不同功能的模块组成。所以Django的项目规范也是按照功能或者模块进行分层,分成一个个App。所有的某个模块的相关视图都写在对应的app的views.py中,并且模型和其他的也是类似。
- 如何创建App:
python manage.py startapp [app名称]
- 创建书籍App,音乐App:
四、创建视图Views
-
视图:视图一般都写在App的
views.py
中。并且视图的第一个参数永远都是request
(一个HttpResponse)对象。这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等。在视图中,一般用来完成业务逻辑的相关操作。例如传来一个请求用来发布一张新专辑,我们可以通过request接收这些数据,然后存储到数据库中,最后再把执行结果返回给浏览器。视图函数的返回结果必须是HttpResponse对象或者其子类对象。 -
接下来我们创建一个书籍页面(音乐页面同理):
-
完整代码:
书籍视图
book/views.py
:from django.http import HttpResponse def book(request): return HttpResponse("书籍首页")
音乐视图
music/views.py
:from django.http import HttpResponse def music(request): return HttpResponse("音乐首页")
五、配置URL分发器
-
完成视图函数之后,要与URL进行映射,简单来说就是用户需要在浏览器输入什么
url
的时候就可以请求到这个视图函数。 -
原理:当用户输入某个
url
请求到我们的网站的时候,django会从项目中urls.py
文件中寻找对应的视图。 -
配置能够访问书籍首页的url:
-
完整代码:
Django_one/urls.py
:from django.contrib import admin from django.urls import path from book.views import book urlpatterns = [ path('admin/', admin.site.urls), path('book/', book), ]
-
urls.py
中的urlpatterns
变量,Django会从这个变量中读取所有的url匹配规则。匹配规则需要使用django.urls.path
函数进行包裹,这个函数会根据传入的参数返回URLPattern
或者是URLResolver
的对象。 -
在终端运行项目
python manage.py runserver 1234
,查看结果:(注意请求地址)
六、创建带参数的URL
有时候,url中包含了一些参数需要动态调整。比如CSDN的文章详情页url如下图所示:
其结构大概是这样的:
URL:https://blog.csdn.net/ZKK199704/article/details/89764069
解析:https://blog.csdn.net/<作者id>/<作者文章>/<文章详情>/<文章id>
方法一:采用在url中使用变量的方式
在path
的第一个参数中,使用'<参数名>'
的方式可以传递参数;然后再视图函数中也要写一个参数,并且视图函数中的参数必须和url中的参数名称保持一致,不然就找不到这个参数,会报错。另外url可以传递多个参数。
-
在
path
函数中,用尖括号的形式来定义一个参数。比如我想要获取一首单曲的详细信息,那么在url中制定这个参数:
from django.contrib import admin from dango.urls import path from book.views import book from music.views import music, music_detail urlpatterns = [ path('admin/', admin.site.urls), path('book/', book), path('music/', music), path('music/<music_name>', music_detail) ]
-
相应的视图函数中也要进行定制,并且视图函数中的参数必须和url中的参数名称保持一致,不然就找不到这个参数。另外,url中可以传递多个参数:
from django.http import HttpReponse def music(request): return HttpResponse("音乐首页") def music_detail(request, music_name): detail = "The song's name is %s" % music_name return HttpResponse(detail)
-
运行结果(注意访问地址):
方法二:采用查询字符串的方式
在百度中输入Django
进行查询,我们对生成的url结构进行解析:
URL:https://www.baidu.com/s?wd=Django
解析:https://www.baidu.com/s?wd=<查询字符串>
实际上:?wd=<查询字符串>
是使用GET请求
来查询参数。
在url中,不需要单独的匹配查询字符串的部分,只需要在视图函数中使用request.GET.get('参数名称')
的方式来获取:
-
配置URL路径
from django.http import HttpResponse from django.urls import path from book.views import book from music.views import music, music_detail, musician_detail urlpatterns = [ path('', index), path('book/', book), path('music/', music), path('music/<music_name>/', music_detail), path('music/musician/', musician_detail), ]
-
配置视图函数
from django.http import HttpResponse def music(request): return HttpResponse("音乐首页") def music_detail(request, music_name): detail = "The song's name is %s" % music_name return HttpResponse(detail) def musician_detail(request): musician_id = request.GET.get('id') text = 'The musician\'s id is %s' % musician_id return HttpResponse(text)
因为查询字符串使用的是'GET'
请求,所以我们通过request.GET
来获取参数。
- 运行查看结果:(注意请求地址)
七、总结
本章对MTV模式进行了简单的阐述,并在接下来的例子中付诸实践。通过简单的例子,我们对Django的App、Views、URL等组件进行了初步了解,其中对URL传参进行了详细讲解(大学论文常用总结格式?)。下一章,将对URL的配置进行更进一步的解析。
Tips:如本章存在错误或者有更好的建议,欢迎大家在评论处发表意见,本萌新会做出相应的改进的! ???