django 学习笔记1 做一个应用(简单到简陋)

本文是django学习笔记的第一部分,主要介绍了如何新建一个应用,包括理解项目和应用的关系,创建html页面,编写视图响应函数,设置settings.py配置以及路由解析。通过实践,展示了django的MTV模式运作流程。
摘要由CSDN通过智能技术生成

目录

「django」新建项目之后目录说明

新建一个应用

实现应用的响应

第一步  写一个简单的「html 页面」

第二步  写一个简单的视图响应函数

第三步  settings.py 的配置

第四步 设置路由解析

小结一哈


我们安装好了开发环境后,开始做一个简单的应用来感受一下「django」的运行模式


「django」新建项目之后目录说明

上一篇文章中,说道使用「pycharm」创建一个项目。新建完成后,「pycharm」就自动帮我们创建了一个「django」项目。所以我们可以直接在这个项目下开始新建我们的应用。

应用和项目的关系:应用的层次是在项目之下的。一个项目会有多个多个应用。简单说,一个项目就是一个网站,那么一个应用就是网站中的功能模块。有点面向对象的意思。

填一下上篇安装文章中的坑:对项目目录及其中的文件功能进行说明一下。打开我们的「pycharm」,侧边的目录结构如下:

文件说明:

a. manage.py:我们的项目命令行执行文件,向我们前面在 cmd 中执行的 python manage.py runserver,就是开启 django 自带的调试服务器。在本地「127.0.0.1」,端口「8000」上可以进行访问我们的项目,

在这里,我们将要用到它的另外一个参数「startapp app_name」来新建一个项目

b. settings.py: 我们的项目配置文件,很多的项目参数都是在这个文件下进行设置的。

c. urls.py:项目的路由配置主文件。当我们在浏览器中输入我们的「127.0.0.1:8000」的时候,URL的解析就是他来完成的,后面我们新建应用时,也会在应用的目录下新建这样一个文件,并将他们关联起来,实现命名空间的优化。

d. wsgi.py: 网站的代码部分完成后,需要用到的它,现在我们先不管他,也不用修改它


好了,现在在我们的项目目录下开始新建一个应用。我们这个应用很简单,就是在页面上显示一句话


新建一个应用

在「cmd」中进入「manage.py」所在的目录(记得要在虚拟环境中进行哦,怎么进入虚拟环境,参看:「https://mp.csdn.net/postedit/88388903  django 的安装」),执行命令「python manage.py startapp sample_test」

(venv) F:\django-review\diandain>python manage.py startapp sample_test

在进入「pycharm」中,会发现多了一个目录「sample_test」

这个目录就是我们刚刚新建的「sample_test」应用。其中的文件说明如下:

a. admin.py:后台管理是用到的配制文件,将我们的应用注册后台是需要用到。不过我们用的是「xadmin」,后面需要新建一个「adminx.py」的文件来执行「admin.py」的功能

b. apps.py:在项目的配置文件「settings.py」中注册我们的应用的时候需要用到

c. models.py: 「django」框架是以数据库驱动的(不知道这么表述是否合适),网站的所有数据都是保存到数据库中的,网站的数据在数据库中的体现形式就由这个「models.py」来控制的

d. test.py:测试文件,应用的测试,暂时用不到(虽说用测试驱动程序的开发,受于我目前的水平,还达不到,还有待加强)

e. views.py: 应用的视图函数写在这里。用户通过浏览器向我们的「‘服务器’」发起请求的时候,服务器的相应的内容就是用「views.py」来控制的


进入下一项:写一个简单的视图响应函数


实现应用的响应

第一步  写一个简单的「html 页面」

在我们的项目目录下,新建一个目录「templates」,然后再在它的下面创建一个目录「sample_test」,然后再在它的下面新建一个「sample_test.html」文件。(为什么要这么麻烦,「django 的官方说法是:为了避免重名导致的模版加载错误」)

这里的「sample_test.html」就是我们的模版,也就我们网站的页面文件。

「django的模版搜索机制」:首先会在项目目录下的「templates」目录(项目的主模板目录)下面查找「http 请求的页面」,如果没有找到,就回在应用中的「templates」目录下面查找,只要找就停止搜索,并将找到的「模版」提交到「views.py」中的视图响应函数中。

「sample_test.html」的内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>简单的测试页面</title>
</head>
<body>
    <h1>Hello world!</h1>
    <p>django 的学习之旅从这里开始啦...</p>
    <!-- 粗略的感受一下模版语言 -->
    <a href="{% url 'sample_test:sample_test_view' %}">这个是一个“神奇链接”,你点击它,它还会回到这里</a>
</body>
</html>

第二步  写一个简单的视图响应函数

要在「views.py」中写,代码如下:

# _*_ coding: utf-8 _*_

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.


def sample_test_view(request):
    """
    这是一个简单的视图响应函数
    """
    # HttpResponse 是「django」的一个「HTTP」响应类
    # return HttpResponse(request, 'sample_test/sample_test.html', {})
    # render 函数是一个快捷函数,是对「HttpResponse」的一个封装
    # 最后面的空的字典表:是我们要加载到「sample_test.html」的数据,它有一个名字叫做 context
    return render(request, 'sample_test/sample_test.html', {})

第三步  settings.py 的配置

前面提到过的项目配置文件,现在我们要对它进行一下修改

a. 语言和时区设置

我们在种花家,当然得使用汉语,以及我们自己时区的时间,在「settings.py」中找到如下的代码,并修改,修改后的样子如下:

# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/

LANGUAGE_CODE = 'zh_hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False

# 下面的是原来的样子,使用的是 UTC 时间

# LANGUAGE_CODE = 'en-us'

# TIME_ZONE = 'UTC'

#  USE_I18N = True

# USE_L10N = True

# USE_TZ = True

b. 安装我们的应用

在「settings.py」中找到「INSTALLED_APPS」,在这个列表中加上我们的应用

ps: 这一步的作用是让「django」知道这里有一个应用,像前面说到的应用下的「templates」目录也会添加到「django」的「模版搜索路径」

结果如下:

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 我们的 sample_test 应用, 这里的 apps 就是应用目录下的「apps.py」
    # 在我们新建的应用的时候,会自动创建一个类 「SampleTestConfig」
    'sample_test.apps.SampleTestConfig',
]

第四步 设置路由解析

这里分为两个小步

a. 项目下的主路由「urls.py」

from django.contrib import admin
from django.urls import path, include

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

    # sample_test 的转接
    path('sample_test/', include('sample_test.urls')),
]

这里新导入了一个函数「include」,用于「URL」的转接,它参数就是我们应用下的路由解析文件「urls.py」(当然现在我们还没有创建这个文件,下一步我们将创建它)

在这列介绍一下「django」的「URL」解析过程

假设现在我们已经通过「manage.py」运行了「django」的调试服务器,在浏览器中输入的「URL:127.0.0.1:8000/sample_test/sample_test_view」

「服务器」获取到「HTTP」请求,解析出「URL」,并将解析出的「URL」交由项目下的主路由映射文件「urls.py」进行进一步的解析匹配,调用「path」函数进行解析

「path」函数功能:解析匹配「URL」,解析匹配成功后,调用视图函数或者将剩余部分的「URL」通过「include」函数传递给某个具体应用的「urls.py」

目前在我们的项目的「urls.py」的「path」函数的第一个参数是「'sample_test/'」,第二个参数是「include('sample_test.urls')」。

「path」函数的第一项任务:「path」函数会使用第一个参数从左往右与「URL」进行匹配(类似于正则表达式一样),在这里它会成功从匹配到「'sample_test/'」,并在此截断「URL」,剩余的「URL」则是「'sample_test_view'」。

「path」函数的第二项任务:调用传入的第二个参数,在这里我们传入的是「include」函数,那么「path」函数会将剩余的「URL」交给「include」函数链接的应用「urls.py」,由应用的「urls.py」继续解析剩余的「URL」

b. 在应用目录下新建「urls.py」,并写入如下代码:

# _*_ coding: utf-8 _*_
__author__ = 'nick'
__date__ = '2019/3/11 13:39'


from django.urls import path

from . import views


# sample_test 的命名空间
app_name = 'sample_test'

# sample_test 的路由解析列表,名字一定要是这个
urlpatterns = [
    path('sample_test_view', views.sample_test_view, name='sample_test_view')
]

接着上面的「URL」解析说

「sample_test」应用下的「urls.py」接受到路由解析信号后,开始调用「urlpatterns」下面的「path」函数。进行「URL」解析匹配。

在这里,「path」函数能够成功匹配「'sample_test_view'」,然后开始调用它的第二参数「views.sample_test_view」(这里的函数不要带括号,「path」函数会自动调用,并传入「HTTP」请求作为视图函数的「第一参数」)

「path」函数还有第三个参数「name」,为这个成功解析的「URL」定义一个别称,在搭配上「app_name」就可以在「模版」(也就是「html」文件中的<a href="{% url 'app_name:name' %}>...</a>的形式来动态指代这个解析成功的「URL」,这里的一对花括号加上里面的一对百分号,是「django」的「模版」语言)

第四个参数「**kwargs」,作为第二参数的视图函数的参数

ps: 「path」函数的第一个参数决定了我们在浏览器地址栏中「URL」的形式


到这里,我们简单的测试应用已经完成了,来看一下我们的目录情况,红框是我们运行新建应用时自动创建的,白框就是我们在应用目录下新建的

可以在「pycharm」中使用「Run」-->「debug」的方式运行「django」的测试服务器

也可以进入虚拟环境中执行「python manage.py runserver」来运行「django」的测试服务器


在浏览器中输入「http://127.0.0.1:8000/sample_test/sample_test_view」回车应该就可以看到:

 


小结一哈


通过这个小的测试应用,可以了解一下「django」的开发模式「MTV」

M:指「Model」 简单的说就是为我们的功能模块定义一个数据模型,这个数据模型也是类,一般是通过继承自「django」提供的「modes.Model」这个类,并保存在前面提到过的「sample_test/models.py」文件,(虽然我们这个例子没有提到),类似与将对象抽象化成类。

比如说,创建一个人的模型,这个模型的参数应该有,人名,性别,生日,身高,体重,学历....

模型创建完毕后,通过「manage.py」执行「makemigrations」命令生成数据库的迁移命令和「migrate」命令执行数据库的迁移命令(迁移可以理解成:在数据库中创建,修改,删除数据表)

tips: 和定义一个普通的类有一点区别,这里面的参数都是指定了类型的

T:  指「Template」 前端的「htm」文件,我们对进行一些改写,将视图函数传入的「context」(还记得那个字典表吗,对,就是那货),在「html文件」中,通过「django」的「模版语言」将「context」所携带的数据嵌入到「html」文件的我们想要的位置上,形成「模版」

通过「模版」的字面意思也可以理解到,所有的「html」页面都是从「模版」中刻出来的,其中的差别就是由那个「context」决定的,你有多少不同的数据,就一个「模版」就能产生多少个不同的页面,当然咯,一个网站会有很多个模版。

V: 指「View」,就是我们前面提到过多次的「视图函数」

它是可以看做是一个桥梁(控制器也行),向内连接(控制)「Model」和「Template」,向外连接到「path」函数

它的功能就是,接受一个「HTTP」请求,返回一个「HTTP」响应(或者其他类型的响应)。在接受到响应到返回响应之间的代码,就是算的上后端开发的核心。这段代码一般的执行的操作「提取请求中携带的数据」,「创建数据模型实例」,「向数据库提取数据 」,「对数据进行筛选,排序,修改,保存」,将操作过的数据以键值对的放到「HTTP响应」中「context」这个字典表中

视图函数返回的这个响应,然后通过「path」函数,回传给浏览器,浏览器解析响应,并进行展示

ps: 虽然上面的小结跟上面的例子貌似关系不大,也不这个例子的小结(因为这个例子没什么好总结的,这个开发模式要比那个重要的多,任性一波,就写这里了),开发模式理解好了,往后的程序就是按着这个模式慢慢写,就好了

ps2:这个「MTV」是我自己的理解,如果你们看到了有反对的,或者补充的,可以留言走一波....

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值