开云-BPO行业整合方案提供者
专业化、科技化、国际化;高标准、广覆盖、全流程
了解更多第 05 篇:Django 的接客之道 时候:2024-12-13 15:39:35 手机看文章
扫描二维码随时随地手机看文章
作者:HelloGitHub-追梦人物
文中触及的示例代码,已同步更新到 HelloGitHub-Team 仓库[1]
点击本文最下方的“浏览原文”便可获得
Web 办事简单的说就是处置要求,每一个要求就像是一个“顾客”。起首热忱地把顾客迎接进来,然后知足用户的个性化需求,最后让顾客称心满意的分开。Django 作为一个 web 框架,可以或许闪开发者有更多的精神和时候去应付复杂多变的需求,而不是把时候破费在招店小2、做饭的厨子、办事员等。那末下面我们就来看看 Django 的接客之道吧。
Django 处置 HTTP 要求Web 利用的交互进程其实就是 HTTP 要求与响应的进程。不管是在 PC 端仍是移动端,我们凡是利用阅读器来上彀,上彀流程年夜致来讲是如许的:
1.我们打开阅读器,在地址栏输入想拜候的网址,好比 https://zmrenwu.com/(固然你也可能从保藏夹里直接打开网站,但素质上都是一样的)。2.阅读器知道我们想要拜候哪一个网址后,它在后台帮我们做了良多工作。首要就是把我们的拜候意图包装成一个 HTTP 要求,发给我们想要拜候的网址所对应的办事器。通俗点说就是阅读器帮我们通知网站的办事器,说有人来拜候你啦,拜候的要求都写在 HTTP 报文里了,你依照要求处置后告知我,我再帮你回应他!3.办事器处置了HTTP 要求,然后生成一段 HTTP 响应给阅读器。阅读器解读这个响应,把相干的内容在阅读器里显示出来,在是我们就看到了网站的内容。好比你拜候了我的博客主页 https://zmrenwu.com/,办事器领受到这个要求后就知道用户拜候的是首页,首页显示的是全数文章列表,在是它从数据库里把文章数据掏出来,生成一个写着这些数据的 HTML 文档,包装到 HTTP 响应里发给阅读器,阅读器解读这个响应,把 HTML 文档显示出来,我们就看到了文章列表的内容。
是以,django 作为一个 Web 框架,它的任务就是处置流程中的第二步。即领受阅读器发来的 HTTP 要求,返回响应的 HTTP 响应。在是引出这么几个问题:
1.django 若何领受 HTTP 要求?2.django 若何处置这个 HTTP 要求?3.django 若何生成 HTTP 响应?
对若何处置这些问题,django 有其一套划定的机制。我们依照 django 的划定,就可以开辟出所需的功能。
Hello 视图函数我们先以一个最简单的 Hello World 为例来看看 django 处置上述问题的机制是怎样样的。
绑定 URL 与视图函数起首 django 需要知道当用户拜候分歧的网址时,应当若何处置这些分歧的网址(即所说的路由)。django 的做法是把分歧的网址对应的处置函数写在一个 urls.py 文件里,当用户拜候某个网址时,django 就去会这个文件里找,假如找到这个网址,就会挪用和它绑定在一路的处置函数(叫做视图函数)。
下面是具体的做法,起首在 blog 利用的目次下建立一个 urls.py 文件,这时候你的目次看起来是如许:
blog\ __init__.py admin.py apps.py migrations\ 0001_initial.py __init__.py models.py tests.py views.py urls.py
在 blog\urls.py 中写入这些代码:
from django.urls import pathfrom . import viewsurlpatterns = [ path('', views.index, name='index'),]
我们起首从 django.urls 导入了 path 函数,又从当前目次下导入了 views 模块。然后我们把网址和处置函数的关系写在了 urlpatterns 列内外。
绑定关系的写法是把网址和对应的处置函数作为参数传给 path 函数(第一个参数是网址,第二个参数是处置函数),别的我们还传递了别的一个参数 name,这个参数的值将作为处置函数 index 的别号,这在今后会用到。
留意这里我们的网址现实上是一个法则,django 会用这个法则去匹配用户现实输入的网址,假如匹配成功,就会挪用厥后面的视图函数做响应的处置。
好比说我们当地开辟办事器的域名是 http://127.0.0.1:8000,那末当用户输入网址 http://127.0.0.1:8000 后,django 起首会把和谈 http、域名 127.0.0.1 和端标语 8000 去失落,此时只剩下一个空字符串,而 '' 的模式恰是匹配一个空字符串,在是两者匹配,django 便会挪用其对应的 views.index 函数。
留意
在 blogproject\ 目次下(即 settings.py 地点的目次),本来就有一个 urls.py 文件,这是全部工程项目标 URL 设置装备摆设文件。而我们这里新建了一个 urls.py 文件,且位在 blog 利用下。这个文件将用在 blog 利用相干的 URL 设置装备摆设,如许便在模块化治理。不要把两个文件弄混了。
编写视图函数第二步就是要现实编写我们的 views.index 视图函数了,依照老例视图函数界说在 views.py 文件里:
blog/views.pyfrom django.http import HttpResponsedef index(request): return HttpResponse("接待拜候我的博客首页!")
我们前面说过,Web 办事器的感化就是领受来自用户的 HTTP 要求,按照要求内容作出响应的处置,并把处置成果包装成 HTTP 响应返回给用户。
这个两行的函数表现了这个进程。它起首接管了一个名为 request 的参数,这个request 就是 django 为我们封装好的 HTTP 要求,它是类 HttpRequest 的一个实例。然后我们便直接返回了一个 HTTP 响应给用户,这个 HTTP 响应也是 django 帮我们封装好的,它是类 HttpResponse 的一个实例,只是我们给它传了一个自界说的字符串参数。
阅读器领受到这个响应后就会在页面上显示出我们传递的内容 :接待拜候我的博客首页!
设置装备摆设项目 URL还差最后一步了,我们前面成立了一个 urls.py 文件,而且绑定了 URL 和视图函数 index,可是 django 其实不知道。django 匹配 URL 模式是在 blogproject\ 目次(即 settings.py 文件地点的目次)的 urls.py 下的,所以我们要把 blog 利用下的 urls.py 文件包括到 blogproject\urls.py 里去,打开这个文件看到以下内容:
blogproject/urls.py"""一年夜段注释"""from django.contrib import adminfrom django.urls import pathurlpatterns = [ path('admin/', admin.site.urls),]
点窜成以下的情势:
from django.contrib import adminfrom django.urls import path, includeurlpatterns = [ path('admin/', admin.site.urls), path('', include('blog.urls')),]
我们这里导入了一个 include 函数,然后操纵这个函数把 blog 利用下的 urls.py 文件包括了进来。另外 include 前还一个 '',这是一个空字符串。这里也能够写其它字符串,django 会把这个字符串和后面 include 的 urls.py 文件中的 URL 拼接。好比说假如我们这里把 '' 改成 'blog/',而我们在 blog\urls.py 中写的 URL 是 '',即一个空字符串。那末 django 终究匹配的就是 blog/ 加上一个空字符串,即 blog/。
运行成果运行 pipenv run python manage.py runserver 打开开辟办事器,在阅读器输入开辟办事器的地址 http://127.0.0.1:8000/,可以看到 django 返回的内容了。
接待拜候我的博客首页!
利用 django 模板系统这根基上就上 django 的开辟流程了,写益处理 HTTP 要求和返回 HTTP 响应的视图函数,然后把视图函数绑定到响应的 URL 上。
可是等一等!我们看到在视图函数里返回的是一个 HttpResponse 类的实例,我们给它传入了一个但愿显示在用户阅读器上的字符串。可是我们的博客不成能只显示这么一句话,它有可能会显示很长很长的内容。好比我们发布的博客文章列表,或一年夜段的博客文章。我们不克不及每次都把这些年夜段年夜段的内容传给 HttpResponse。
django 对这个问题给我们供给了一个很好的解决方案,叫做模板系统。django 要我们把年夜段的文本写到一个文件里,然后 django 本身会去读取这个文件,再把读取到的内容传给 HttpResponse。让我们用模板系统来革新一下上面的例子。
起首在我们的项目根目次(即 manage.py 文件地点目次)下成立一个名为 templates 的文件夹,用来寄存我们的模板。然后在 templates\ 目次下成立一个名为 blog 的文件夹,用来寄存和 blog 利用相干的模板。
固然模板寄存在哪里是可有可无的,只要 django 可以或许找到的就好。可是我们成立如许的文件夹布局的目标是把分歧利用用到的模板隔分开来,如许便利今后保护。我们在 templates\blog 目次下成立一个名为 index.html 的文件,此时你的目次布局应当是如许的:
HelloDjango-blog-tutorial\ manage.py ... templates\ blog\ index.html
留意
再一次强调 templates\ 目次位在项目根目次,而 index.html 位在 templates\blog 目次下,而不是 blog 利用下,假如弄错了你可能会获得一个 TemplateDoesNotExist 异常。假如碰到这个异常,请回来查抄一下模板目次布局是不是准确。
在 templates\blog\index.html 文件里写入下面的代码:
{{ title }}{{ welcome }}
这是一个尺度的 HTML 文档,只是里面有两个比力希奇的处所:{{ title }},{{ welcome }}。这是 django 划定的语法。用 {{ }} 包起来的变量叫做模板变量。django 在衬着这个模板的时辰会按照我们传递给模板的变量替代失落这些变量。终究在模板中显示的将会是我们传递的值。
留意:
index.html 必需以 UTF-8 的编码格局保留,且谨慎不要往里面添加一些非凡字符,不然极有可能获得一个 UnicodeDecodeError 如许的毛病。
模板写好了,还得告知 django 去哪里找模板,在 settings.py 文件里设置一下模板文件地点的路径。在 settings.py 找到 TEMPLATES 选项,它的内容是如许的:
blogproject/settings.pyTEMPLATES = [ { 'BACKEND': 'django.template.backends.django.djangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, },]
此中 DIRS 就是设置模板的路径,在 [] 中写入 os.path.join(BASE_DIR, 'templates'),即像下面如许:
blogproject/settings.pyTEMPLATES = [ { ... 'DIRS': [os.path.join(BASE_DIR, 'templates')], ... },]
这里 BASE_DIR 是 settings.py 在设置装备摆设开首前面界说的变量,记实的是工程根目次 HelloDjango-blog-tutorial\ 的值。在这个目次下有模板文件地点的目次 templates\,在是操纵os.path.join 把这两个路径连起来,组成完全的模板路径,django 就知道去这个路径下面找我们的模板了。
视图函数可以改一下了:
blog/views.pyfrom django.shortcuts import renderdef index(request): return render(request, 'blog/index.html', context={ 'title': '我的博客首页', 'welcome': '接待拜候我的博客首页' })
这里我们不再是直接把字符串传给 HttpResponse 了,而是挪用 django 供给的 render 函数。这个函数按照我们传入的参数来组织 HttpResponse。
我们起首把 HTTP 要求传了进去,然后 render 按照第二个参数的值 blog/index.html 找到这个模板文件并读取模板中的内容。以后 render 按照我们传入的 context 参数的值把模板中的变量替代为我们传递的变量的值,{{ title }} 被替代成了 context 字典中 title 对应的值,同理 {{ welcome }} 也被替代成响应的值。
终究,我们的 HTML 模板中的内容字符串被传递给 HttpResponse 对象并返回给阅读器(django 在 render 函数里隐式地帮我们完成了这个进程),如许用户的阅读器上便显示出了我们写的 HTML 模板的内容了。
References[1] HelloGitHub-Team 仓库: https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial
存眷公家号插手交换群,一路会商有趣的手艺话题
HelloDjango 往期回首:
第 04 篇:Django 迁徙、操作数据库
第 03 篇:建立 Django 博客的数据库模子
第 02 篇:"一无所有"的博客利用
第 01 篇:最先进入 django 开辟之旅
点击 “浏览原文” 获得代码
点击 “在看” 撑持我们
欲知详情,请下载word文档 下载文档