django学习笔记02-视图和URL配置

第一个Django驱动的页面:helloworld。

我们如果想要一个hello world的web页面。我们需要指定亮点。第一:网页的内容(字符串::hello world)。第二点:URL(如:http://www.hehe.com/hello.html).在django中也要指定这两个信息。但是方式不同。页面的内容由视图函数(view function)生成,URL在URL配置(UTRLconf)中指定。

第一个视图:

在mysite目录下面,创建一个空的python文件views.py。

 

我们来分析这段代码:

  • 首先,从Django.http 模块中导入HttpResponse类。导入这个类因为后面要使用这个类来构造函数。
  • 然后,定一个名为hello的函数,这是视图函数。视图函数至少有一个参数,按约定,名为request。这是一个对象,包含除法这个视图的web请求的信息,是django.http.HttpRequest类的实例。

这里,我们没有用到reques,但是必须作为第一个参数传给视图。注意,视图函数的名称没有关系,无需使用特定的方式命名,Django能识别它。之所以使用hello作为视图函数的名称,因为它可以明确表示视图的做作用。

这个函数的定义体只有一行代码:返回使用文本“hello world”实例化HttpResponse对象。

这里的主要知识点是,视图就是普通的Python函数,它的第一个参数就是HttpResponse对象,返回值是一个httpResponse实例。

python桉树想要变成Django视图,必须做这两件是。

第一个URL配置:

如果现在运行python3 manage.py runserver ,看到的仍然是welcome to Django消息。‘Hello world’视图还是看不到。这是因为mysite 还不知道hello视图的存在,我们要明确告诉Django在某个URL上激活这个视图。

若想把视图函数与特定的URL对应起来,要使用URL配置(URLconf)。URL配置相当于Django驱动的网站目录。简单来说,URL配置把URL映射到响应的视图函数上。

那配置URL在哪配置呢,还记得我们之前创建项目时 djangoadmin startproject时创建的了一个ULR配置文件:urls.py文件吗?

这个就是专门用来配置url的文件。打开url.py看看里面的内容

我们来逐行阅读:

  • 第一行是从django.conf.urls模块中导入两个函数:inlcude ,用于导入另一个URL配置模块;url,使用正则表达式模式皮皮额浏览器中的URL,把它映射到Django项目的某个模块中。
  • 第二行是从django.contrib模块中导入admin 函数,这个函数传递给include函数,加载Django管理后台的URL
  • 第三行使用的是urlpatterns,即url()实例表

django 2.1.7中urls.py的初始内容如上图:

第一句是从django.contrib 模块中导入admin函数。加载django后台的视图函数

第二句是从django.urls中导入path函数,用来使用urlpatterns,url()实例表。

这里主要要注意的是urlpatterns变量,django期望URL配置模块中有这个变量。它负责定义URL与处理URL的代码之间的映射。在URL配置中添加URL和视图的方式是,在URL模式映射到视图函数上。添加hello 视图的方式如下。

我们看下urls.py的配置信息:

我们做了两处修改:

首选导入hello 视图函数(从mysite/views.py)模块中导入 hello 视图函数

然后在urlpatterns中增加一条映射配置(path("hello/",hello)).我们添加的这行代码称为一个URL模式(urlpatterns),url()函数告诉Django如何处理我们配置的URL。第一个参数是模式匹配字符串(一个正则表达式),第二个参数是模式使用的视图函数。

这里还有一个重要的细节:正则表达式字符串前面的‘r’字符。它的目的是告诉python,那是原始字符串,不要解释里面的反斜线。

python中的反斜线与正则表达式中的反斜线有冲突,因此在django中定义的正则表达式时最好使用原始字符串。

综上,我们告诉django 请求http://127.0.0.1:9000/hello/ 是有hello视图函数来处理的。

URL模式语法说明一下:我们想要匹配的是/hello/URL,但是使用的模式与想象中的有些区别:

  • Django在检查URL模式时会把入站URL前面的斜线去掉。因此,URL模式中没有前导斜线。不过记住,如果加上就会报错,导致这个url无法识别。
  • 模式中包含一个脱字符号(^)和一个美元符号($)。它们在正则表达式中有特殊的意义:脱字符号 表示“在字符串的开头匹配模式”,美元符号的意思是“在字符串的结尾匹配模式”。

  • 这个概念最好通过实例说明。如果使用 ˆhello/ 模式(末尾没有美元符号),那么任何以 /hello/ 开 头的 URL 字符串都能匹配,例如 /hello/foo 和 /hello/bar,而不只是 /hello/。

    类似地,如果开头没有脱字符号(即 hello/$),Django 会匹配任何以 hello/ 结尾的 URL,例如 /foo/bar/hello/。

    如果只使用 hello/,没有脱字符号或美元符号,那么任何包含 hello/ 的 URL 都匹配,例如 /foo/hel- lo/bar。因此,我们使用脱字符号和美元符号确保只匹配 /hello/ 这个 URL——不多不少。大多数 URL 模式 都以脱字符号开头、以美元符号结尾,不过可以灵活使用,匹配复杂的 URL。

你可能想知道,如果有人请求/hello 不带后面的斜线会发生什么。因为我们指定URL模式要求有末尾的斜线。因此那个URL不匹配。然而,默认情况下,如果请求的URL不匹配任何URL,而且末尾没有斜线,那么Django 会把它重新定向到末尾带显现的URL(这个行为由Django 的APPEND_SLASH设置管理)。

需要主要以:我们以对象的像是传入hello视图函数,而没有调用函数。这是python(以及其他动态语言)的一个关键特性:函数是一等对象,可以像其他变量那样传递。

正则表达式:

正则表达式(regular expression,简称regexes)是指定文本模式的简洁方式。Django的URL配置允许使用任何正则表达式匹配复杂的URL,但是实际上只会使用部分符号。

关于404错误说明:

现在,URL配置只定义了一个URL模式,即处理/hello/URL请求的哪个。那么如果请求其他的URL会发生什么,django会直接报错,显示一个404  page not found 页面。

这个页面除了显示404错误消息之外,还给出了其他信息。它会告诉你django 使用的是哪个URL配置,以及那个配置里的各个模式。根据这些信息你应该能判断为什么所请求的URL会返回404错误,

显然这些敏感信息,只供web开发查看。线上网站不应该公开显示这些信息。鉴于此,‘page  not found’页面仅当Django 项目处于调试模式时才会显示。

后面我们会说如何接触踢啊是模式。现在,我们只需要知道,创建Django 项目后,它就处于调试模式。如果不在调试模式中,Django会输出其他的404响应。

关于网站根地址的简要说明:

如果我们直接访问网站根地址(http://127.0.0.1:8000/),你会看到一个404错误消息。Django不会自作主张在网站根地址上添加页面----根地址没什么特别的。

准备为网站根地址实现视图时,使用的URL模式是一个空字符串。

  path(r"",hello),

这样我们访问http://127.0.0.1:8000/ 就会打开hello 页面。

Django 处理请求的过程:

Django的运作机制。当我们在web浏览器中防伪http://127.0.0.1:8000/hello/,看到‘Hello world’的消息。Django做了什么呢?一切都从设置文件开始。

运行 python3 manage.py runserver命令是,manage.py 脚本在内层的mysite目录只能够寻找名为settings.py(保存当前Django项项目的全部配置,各个配置的名称都是大写的,如TMEMPLATE_DIRS、DATABASES,其中最重要的设置是ROOT_URLCONF,它告诉Django,网站的URL配置在那个Python模块中)的文件。

当我们运行 django-admin startproject mysite 命令创建mysite 项目时,会自动创建settings.py 和urls.py文件。自动生成settings.py 文件包含ROOT_URLCONF设置,指向自动生成的俄urls.py文件。我们可以打开settings.py文件,查看响应的配置信息:

ROOT_URLCONF = 'mysite.urls'

这个模块对应的文件是在mysite/urls.py.收到针对URL请求是,Django追加载ROOT_URLCONF设置指定的URL配置;按照顺序检查URL配置中的各个URL模式,一次于请求的URL比较,直到找到匹配的模式为止。

找到匹配的模式之后,调用对应的视图函数,并把一个HttpRequest对象作为第一个参数传给视图。如我们编写的第一个视图所示,视图函数必须返回一个HttpResponse对象。

随后,余下的工作交给Django 处理:把那个Python对象转为成正确web响应,并且提供合适的HTTP首部和主体(即网页的内容)。综上:

1.web页面,请求/hello/

2.Django 在settings.py中查看ROOT_URLCONF设置,找到URL配置。(ROOT_URLCONF = 'mysite.urls')

3.Django比较URL配置中的各个URL模式,找到于/hello/匹配的那个。

4.如果找到匹配的模式,调用对应的视图函数。

5.视图函数返回一个HttpResponse对象。

6.Django把HttpResponse对象转换成正确的HTTP响应。得到网页。

整个过程十分简单,只需要视图函数,然后在URL配置中与URL配对。

第二个视图:我们显示当前时间

为了理解current_datetime视图,我们逐行分析所做的改动:

  • 在模块顶部添加import datetime ,这样才能计算日期
  • 新添加的current_datetime 函数计算当前日期和时间,得到的结果是一个datetime.datetime对象,存储在局部变量now中
  • 视图函数中的第二行代码使用python的格式化字符串功能构建一个HTML响应。字符串中的%s是占位符,字符串后面的百分号知名,“把当前字符串中的%s替换成now变量的值”。严格来说,now变量的值是一个datetime.datetime对象,而非字符串,但是%s的格式字符会把它转换成字符串表示形式。
  • 最后,返回包含那个HTML字符串的HttpResponse对象---这与hello视图所做的一样。

URL配置和松耦合:

现在是个好时机,我们要强调URL配置以及Django背后的一个重要哲学:松耦合。简单来说,松耦合是一种软件开发方式,其价值在于让组件可以互换。如果两部分代码之间是松耦合的,那么改动其中一部分对另一部分的影响很小,甚至没有影响。

Django的URL配置就很好地运用了这个原则。在Django Web应用中,URL定义与所调用的视图函数之间是松耦合的,即某个功能使用哪个URL与视图函数的实现本省放在两个地方。

URL配置和视图之间就是松耦合的。

第三个属兔:动态URL

在current_datetime视图中,页面的内容(当前日期和时间)是动态的,但URL是静态的(/time/)。可是,在多数董涛web应用中,URL中会包含参数,影响页面的输出。比如一个在线书店会为每本书分配一个URL。或者针对之前的时间,我们可以用/time/plus/1 页面显示一个小时之后的日期和时间,/time/plus/2 显示两个小时之后的时间。以此类推,我们可能像分别为各个偏移量编写一个视图函数,然后在URL配置中这样定义模式:

不过,这样是错误的。

那么,为了处理任意的偏移量,应该怎么涉及应用呢?问题的关键是,使用统配的URL模式。URL模式是正则表达式,因此我们可以使用\d+模式皮皮额一个或多个数字:

这个URL模式能匹配/time/2/、/time/3/、/time/1000/,甚至是/time/plus/10000000/.但是,这么大的偏移量不太切合实际,我们将为偏移量设个合理的最大值。

这里,我们我们像把最大偏移量设为99小时,因此要限制只能使用一个或两个数字。使用正则表达式语法来表示就是\d{1,2}.---匹配1到2个数字。

提示:

如果你用过其他的web开发平台,可能会想,“使用查询字符串参数吧”。比如/time/plus"hours=3;此时,偏移量通过URL的查询字符串获取(?之后的部分)

在Django中也能这么做,但是Django的核心者许之一是,URL应该美观。/time/plus/3这个样的URL更加简洁明了,更加易于阅读,更加易于大声读出来。。。而且比使用查询字符串的版本美观得多。美观的URL是高质量web应用的一个特色。Django的URL配置系统鼓励使用美观的URL,而且为此提供了简易的方式。

设好URL之后,下面编写hour_ahead视图。这个视图与前面编写的current_datetime视图很像,唯一一处不同的:要接受额外的参数,即偏移的小时数。

猜你喜欢

转载自blog.csdn.net/qq_34608423/article/details/89308497