Django入门超easy系列(二)——— 解析Django项目结构

本章所有的重要代码都在图示后面

一、了解MTV模式

Django是标准的基于MTV设计模式的框架。

M → Model模型:是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
T→Template模板:负责如何将页面展示给大众。
V→Views视图:是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。

我们可以通过下图对MTV模式和Django处理请求过程了解
Django入门超easy系列(二)——— 解析Django项目结构_第1张图片

  1. 通过WSGI对Web服务器的socket请求进行处理;
  2. Django框架(Controller)控制用户输入,对路由器进行控制,分发url并通过映射列表将请求发送到合适的视图;
  3. 视图Views向模型Model和模板Templates发送或者获取数据;
  4. 模型Model对数据库进行存取数据;
  5. 模板Templates,通过模板描述数据将如何展现;
  6. 视图Views将模板和数据进行整合,形成最终的页面;
  7. Django框架Controller返回页面展示给用户。

接下来通过新闻专栏的例子对以上进行详细解释。


二、创建Django项目,观察项目结构

在上一章当中,我们在Pycharm上创建了一个Django项目,初始结构如下图所示:
Django入门超easy系列(二)——— 解析Django项目结构_第2张图片

  1. manage.py:还记得第一章是如何启动Django项目的么?python manage.py runserver。以后我们都将基于本文件和项目进行交互,切记不要修改里面的内容,除非你很明确你的修改目的。
  2. settings:存放项目所有的配置信息,可添加修改。
  3. urls.py:路由配置器,也叫URL分发器,详情将在后面进行讲解。
  4. wsgi.py:项目部署将用到的文件,一般情况下也是不需要修改的。
  5. template:用来存放项目的前端页面。

三、创建一个App

  • 什么是APP:‘App’全称就是我们常说的应用程序Application,在我们的Django项目中,也就是一个个应用模块。比如微信,它就有聊天模块、联系人模块、朋友圈模块以及个人模块,我们可以说,微信是由这些模块来组成的。同理,Django项目也是由多个不同功能的App来组成的。
  • Django项目规范和App的创建:正如上面所说,微信是由不同功能的模块组成。所以Django的项目规范也是按照功能或者模块进行分层,分成一个个App。所有的某个模块的相关视图都写在对应的app的views.py中,并且模型和其他的也是类似。
  • 如何创建App:python manage.py startapp [app名称]
  • 创建书籍App,音乐App:
    Django入门超easy系列(二)——— 解析Django项目结构_第3张图片

四、创建视图Views

  • 视图:视图一般都写在App的views.py中。并且视图的第一个参数永远都是request(一个HttpResponse)对象。这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等。在视图中,一般用来完成业务逻辑的相关操作。例如传来一个请求用来发布一张新专辑,我们可以通过request接收这些数据,然后存储到数据库中,最后再把执行结果返回给浏览器。视图函数的返回结果必须是HttpResponse对象或者其子类对象。

  • 接下来我们创建一个书籍页面(音乐页面同理):
    Django入门超easy系列(二)——— 解析Django项目结构_第4张图片

  • 完整代码:

    书籍视图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入门超easy系列(二)——— 解析Django项目结构_第5张图片

  • 完整代码:
    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,查看结果:(注意请求地址)
    Django入门超easy系列(二)——— 解析Django项目结构_第6张图片


六、创建带参数的URL

有时候,url中包含了一些参数需要动态调整。比如CSDN的文章详情页url如下图所示:
Django入门超easy系列(二)——— 解析Django项目结构_第7张图片
其结构大概是这样的:
URL:https://blog.csdn.net/ZKK199704/article/details/89764069
解析:https://blog.csdn.net/<作者id>/<作者文章>/<文章详情>/<文章id>

方法一:采用在url中使用变量的方式

path的第一个参数中,使用'<参数名>'的方式可以传递参数;然后再视图函数中也要写一个参数,并且视图函数中的参数必须和url中的参数名称保持一致,不然就找不到这个参数,会报错。另外url可以传递多个参数。

  • path函数中,用尖括号的形式来定义一个参数。比如我想要获取一首单曲的详细信息,那么在url中制定这个参数:
    Django入门超easy系列(二)——— 解析Django项目结构_第8张图片

    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_detail)
    ]
    
  • 相应的视图函数中也要进行定制,并且视图函数中的参数必须和url中的参数名称保持一致,不然就找不到这个参数。另外,url中可以传递多个参数:
    Django入门超easy系列(二)——— 解析Django项目结构_第9张图片

    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入门超easy系列(二)——— 解析Django项目结构_第10张图片

方法二:采用查询字符串的方式

在百度中输入Django进行查询,我们对生成的url结构进行解析:
Django入门超easy系列(二)——— 解析Django项目结构_第11张图片
URL:https://www.baidu.com/s?wd=Django
解析:https://www.baidu.com/s?wd=<查询字符串>
实际上:?wd=<查询字符串>是使用GET请求来查询参数。

在url中,不需要单独的匹配查询字符串的部分,只需要在视图函数中使用request.GET.get('参数名称')的方式来获取:

  • 配置URL路径
    Django入门超easy系列(二)——— 解析Django项目结构_第12张图片

    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_detail),
        path('music/musician/', musician_detail),
    ]
    
  • 配置视图函数
    Django入门超easy系列(二)——— 解析Django项目结构_第13张图片

    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来获取参数。

  • 运行查看结果:(注意请求地址
    Django入门超easy系列(二)——— 解析Django项目结构_第14张图片

七、总结

本章对MTV模式进行了简单的阐述,并在接下来的例子中付诸实践。通过简单的例子,我们对Django的App、Views、URL等组件进行了初步了解,其中对URL传参进行了详细讲解(大学论文常用总结格式?)。下一章,将对URL的配置进行更进一步的解析。


Tips:如本章存在错误或者有更好的建议,欢迎大家在评论处发表意见,本萌新会做出相应的改进的! ???

你可能感兴趣的:(Django入门)