Django如何将URL映射到视图

前言

URLconf 就像是 Django 所支撑网站的目录。它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码。但必须记住的是视图函数必须位于 Python 搜索路径之中。

Python 搜索路径

Python 搜索路径 就是使用 import 语句时, Python 所查找的系统目录清单。
举例来说,假定你将 Python 路径设置为['','/usr/lib/python2.4/site-packages','/home/username/djcode/'] 。如果执行代码
from foo import bar , Python 将会首先在当前目录查找 foo.py 模块( Python 路径第一项的空字符串表示当前目录)。如果文件不存在, Python 将查找/usr/lib/python2.4/site-packages/foo.py 文件。

如果文件也不存在,它将尝试/home/username/djcode/foo.py 。最后,如果 这个 文件还不存在,它将引发 ImportError
异常。

如果对了解 Python 搜索路径值感兴趣,可以启动 Python 交互式解释程序,输入 import
sys ,接着输入 print sys.path 。

通常,你不必关心 Python 搜索路径的设置。 Python 和 Django 会在后台自动帮你处理好。
(如果有兴趣了解的话, Python 搜索路径的设置工作是 manage.py 文件的职能之一。 )

执行 django-admin.py startproject 时,该脚本会自动为你建了一份 URLconf(即
urls.py 文件)。让我们编辑一下这份文件。缺省情况下它是下面这个样子:

from django.conf.urls import url
from django.contrib import admin

import view

urlpatterns = [
  url(r'^hello', view.djangoStudy),
  url(r'^admin/', admin.site.urls),
  url(r'^index/$',view.index)
]

# urlpatterns = [
#   url(r'^admin/', admin.site.urls),
# ]

当前应该注意是 urlpatterns 变量, Django 期望能从 ROOT_URLCONF 模块中找到它。该变量定义了 URL 以及用于处理这些 URL 的代码之间的映射关系

r'^index/$' 中的 r 表示'^index/$' 是一个原始字符串。这样一来就可以避免 正则表达式有过多的转义字符。

不必在 '^index/$'前加斜杠(/)来匹配 /index/ , 因为 Django 会自动在每个表 达式前添加一个斜杠。乍看起来,这好像有点奇怪,但是 URLconfs 可能由其它的 URLconfs 所引用, 所以不加前面的斜杠可让事情简单一些。

上箭头 ^ 和美元符号 $ 符号非常重要。上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。

最好还是用范例来说明一下这个概念。如果我们用 '^index/' (结尾没有$), 那么以 index/开始的 任意 URL 都会匹配,比如 /index/foo 和 /index/bar , 不仅仅是 /index/ 。

同样的,如果我们去掉最前面的 ^ ( 'index/$' ), Django 一样会匹配由 index/ 结束的 任意 URL/index/ ,比如 /foo/bar/index/ 。 因此,我们必须同时用上 ^ 和 $ 来精确匹配 URL/index/ 。不能多也不能少。

正则表达式

正则表达式 (或 regexes ) 是通用的文本模式匹配的方法。 Django URLconfs 允许你 使用任意的正则表达式来做强有力的 URL 映射,不过通常你实际上可能只需要使用很少的一部分功能。下面就是一些常用通用模式:

Django 是怎么处理请求的

我们必须对刚才所发生的几件事情进行一些说明。它们是运行 Django 开发服务器和构造 Web
页面请求的本质所在。

命令 python manage.py runserver 从同一目录载入文件 settings.py 。 该文件包含了这个特定的 Django 实例所有的各种可选配置,其中一个最重要的配置就是 ROOT_URLCONF 。
ROOT_URLCONF 告诉 Django 哪个 Python 模块应该用作本网站的 URLconf。还记得 django-admin.py startproject 创建的文件 settings.py 和 urls.py 吗? 这时系统自动生成的 settings.py 里 ROOT_URLCONF 默认设置是 urls.py 。

当访问 URL /time/ 时, Django 根据 ROOT_URLCONF 的设置装载 URLconf 。 然后按顺序逐个匹配 URLconf 里的 URLpatterns,直到找到一个匹配的。当找到这个匹配 的 URLpatterns就调用相关联的 view 函数,并把 HttpRequest 对象作为第一个参数。 (稍后再给出HttpRequest 的更多信息)

该view 函数负责返回一个 HttpResponse 对象。

你现在知道了怎么做一个 Django-powered 页面了,真的很简单,只需要写视图函数并用URLconfs 把它们和 URLs 对应起来。

你可能会认为用一系列正则表达式将 URLs 映射到函数也许会比较慢,但事实却会让你惊讶。

views 视图

接下来请求的处理就到了.../sign/views.py 中的 index 视图函数

#-*-coding:utf-8-*-
# Time:2017/11/13 17:08
# Author:YangYangJun

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

def djangoStudy(request):
  return HttpResponse('Hello DjangoStudy !')

def index(request):
  return render(request,'index.html')

视图在我看来, 它在 Django 中非常重要, 是连接页面与数据的中间纽带。 拿登录的例子来讲, 用户在页面上输入了用户名和密码点击登录。 那么 request 请求会由视图来接收, 如何提取出用户名和密码的数据, 如

何用这些数据去查询数据库, 再如何将登录成功的页面返回给用户, 这些全部由视图层来完成。

Django 如何处理请求: 完整细节

除了刚才所说到的简明 URL-to-view 映射方式之外, Django 在请求处理方面提供了大量的灵活性

通过 URLconf 解析到哪个视图函数来返回 HttpResponse 可以通过中间件(middleware) 来短路或者增强。关于中间件的细节将在第十五章详细谈论,这里给出 下图 让你先了解 大体概念.。

当服务器收到一个 HTTP 请求以后,一个服务器特定的 handler 会创建 HttpRequest 并传递给下一个组件并处理。

这个 handler 然后调用所有可用的 Request 或者 View 中间件。这些类型的中间件通常是用来增强HttpRequest 对象来对一些特别类型的 request 做些特别处理。只要其中有一个返回 HttpResponse ,系统就跳过对视图的处理。

即便是最棒的程序员也会有出错的时候, 这个时候 异常处理中间件(exception middleware) 可以帮你的大忙。如果一个视图函数抛出异常,控制器会传递给异常处理中间件处理。如果这个 中间件没有返回HttpResponse ,意味着它不能处理这个异常,这个异常将会再次抛出。

即便是这样,你也不用担心。 Django 包含缺省的视图来生成友好的 404 和 500 回应(response)。

最后, response middleware 做发送 HttpResponse 给浏览器之前的后处理或者清除 请求用到的相关资源。

简单实例

新建一个html页面,命名为:index.html, urls和view配置如上图

templates 模板

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Django Page</title>
</head>
<body>
<h1>Hello Django</h1>
</body>
</html>

模板的载体就是我们所熟悉的 Web 页面了, Django 自带的有模板语言。 它的主要作用是如何展示数据,比如视图层返回的是一个字符串, 要如何显示在页面上; 返回的对象数组要如何显示等。 当然, 为了使页面更漂亮需要借助前端技术, 比如 CSS、 JavaScript 等。

运行后,结果如图

Django 简单的处理流程

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Django框架教程之正则表达式URL误区详解

    前言 利用Django开发网站,可以设计出非常优美的url规则,如果url的匹配规则(包含正则表达式)组织得比较好,view的结构就会比较清晰,比较容易维护.但这其中可能会有一些误区,下面就来给大家总结下. 问题: 我学习的视频大概是2015年录的,里面用的Django版本比较老关于正则表达式URL这一块都是用的url("url(r'^admin/', admin.site.urls),")方法.而我自己练习的时候是下载的最新版本,而正则表达式URL用的确实path("pat

  • 在Django中URL正则表达式匹配的方法

    Django框架中的URL分发采用正则表达式匹配来进行,以下是正则表达式的基本规则: 官方演示代码: from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/

  • 利用Django内置的认证视图实现用户密码重置功能详解

    前言 密码重置功能相信对大家来说都不陌生,本文主要给大家介绍了关于使用Django内置的认证视图实现简单的通过邮箱重置密码的功能,分享出来供大家参考学习,下面话不多说了,来一起来看看详细的介绍吧. 版本: django 1.11 实现方法 在django.contrib.auth.views中提供了四个类视图用于密码重置 class PasswordResetView URL name: password_reset  #要保持相同 通过给邮箱发送重置密码的链接进行密码重置.注意如果邮箱不存在,

  • Django web框架使用url path name详解

    quicktool/view.py文件修改视图函数index(),渲染一个home.html模板 from django.shortcuts import render def index(request): return render(request, 'home.html') quicktool(应用app)下创建一个templates文件夹(模板),在templates下创建一个home.html <!DOCTYPE html> <html> <head> <

  • 在Django的视图中使用数据库查询的方法

    在视图中也有笨方法可以从数据库中获取数据. 很简单: 用现有的任何 Python 类库执行一条 SQL 查询并对结果进行一些处理. 在本例的视图中,我们使用了 MySQLdb 类库(可以从 http://www.djangoproject.com/r/python-mysql/ 获得)来连接 MySQL 数据库,取回一些记录,将它们提供给模板以显示一个网页: from django.shortcuts import render_to_response import MySQLdb def bo

  • Django静态资源URL STATIC_ROOT的配置方法

    缘由 新手学习 Django 当配置好 HTML 页面后,就需要使用一些静态资源,如图片,JS 文件,CSS 样式等,但是 Django 里面使用这些资源并不是直接引用一下就好,还要配置路径即 STATIC_URL 如果这个配置不好的话,请求这些静态资源将返回 HTTP 404 . 经验传授 1. 输出 settings.py 文件里面的 STATIC_URL 到HTML页面,看一下物理路径指向了哪些,通常是不是跑出根目录的.这里给个DEMO: 复制代码 代码如下: def home(reque

  • Django如何将URL映射到视图

    前言 URLconf 就像是 Django 所支撑网站的目录.它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表.你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码.但必须记住的是视图函数必须位于 Python 搜索路径之中. Python 搜索路径 Python 搜索路径 就是使用 import 语句时, Python 所查找的系统目录清单. 举例来说,假定你将 Python 路径设置为['','/usr/lib/pyth

  • Django框架视图层URL映射与反向解析实例分析

    本文实例讲述了Django框架视图层URL映射与反向解析.分享给大家供大家参考,具体如下: Django视图层主要工作就是衔接HTTP请求.python程序.HTML模板. URL分发(URL dispatcher)映射配置可以被看作Django项目的入口配置(项目下的urls.py以及应用的下的urls.py,include将两者联系起来在项目下的urls.py),通过URLdispatcher可以指定用户的每一个访问的后台的python处理函数是什么. 1.普通url映射 每一个Django

  • django中url映射规则和服务端响应顺序的实现

     1.django搜索路径 使用 import 语句时,Python 所查找的系统目录清单. 查看方式: import sys print sys.path 通常无需关心 Python 搜索路径的设置,Python 和 Django 会在后台自动帮你处理好. 2.url匹配模式 基本结构: '^需要匹配的url字符串$' PS:实际上最终完整的url串是http://根路径:端口号/需要匹配的url字符串 系统自动添加的部分'http://根路径:端口号/' eg:url匹配模式:'^lates

  • 在Django中创建第一个静态视图

    正如我们的第一个目标,创建一个网页,用来输出这个著名的示例信息: Hello world. 如果你曾经发布过Hello world页面,但是没有使用网页框架,只是简单的在hello.html文本文件中输入Hello World,然后上传到任意的一个网页服务器上. 注意,在这个过程中,你已经说明了两个关于这个网页的关键信息: 它包括(字符串 "Hello world")和它的URL( http://www.example.com/hello.html , 如果你把文件放在子目录,也可能是

  • Django中针对基于类的视图添加csrf_exempt实例代码

    在Django中对于基于函数的视图我们可以 @csrf_exempt 注解来标识一个视图可以被跨域访问.那么对于基于类的视图,我们应该怎么办呢? 简单来说可以有两种访问来解决 方法一 在类的 dispatch 方法上使用 @csrf_exempt from django.views.decorators.csrf import csrf_exempt class MyView(View): def get(self, request): return HttpResponse("hi"

  • django反向解析URL和URL命名空间的方法

    本文介绍了django反向解析URL和URL命名空间,分享给大家,具体如下: 首先明确几个概念: 1.在html页面上的内容特别是向用户展示的url地址,比如常见的超链接,图片链接等,最好能动态生成,而不要固定. 2.一个django项目中一般包含了多个django应用(app). 3.一个视图(view)往往对应多个url地址. 在django中实现反向解析URL必备条件就是 url和view能一对一 的匹配. (通过view找到唯一一个对应的url,通过url也能找到唯一一个view) 最

  • Django使用装饰器限制对视图的访问及实现原理

    目录 Django使用装饰器限制对视图的访问 1.登录鉴权装饰器 2.@login_required 3.@permission_required Django使用装饰器限制对视图的访问 1.登录鉴权装饰器 除了可以在视图处理中校验用户身份以及验证用户权限之外,Django还提供了便捷的装饰器来完成这两类校验.@login_required装饰器用来验证用户是否登录,只有登录的用户才可以访问视图,并获得响应,否则可以重定向到登录页引导用户登录.@permission_required装饰器用来校

  • Python中Django框架利用url来控制登录的方法

    本文实例讲述了Python中Django框架利用url来控制登录的方法.分享给大家供大家参考.具体如下: from django.conf.urls.defaults import patterns,url #or use login_required from django.contrib.admin.views.decorators import staff_member_required def login_url(regex, view, *p,**args): """

  • ASP.NET 2.0 URL映射技巧

    在项目中经常要进行如下映射 将 http://onewww.net/a.aspx?name=llinzzi 映射到 http://onewww.net/llinzzi 首先要解决2个问题 第一是支持通配符的映射 URL映射是asp.net2.0新增的功能,不支持通配符 于是采用了NBEAR的 NBear.Web.Modules.UrlRewriteRules 进行通配符映射 <?xml version="1.0"?> <!--      注意: 除了手动编辑此文件以外

  • ASP.NET实现URL映射的方法

    URL映射是ASP.NET 2.0中提供的新特性.URL映射技术帮助我们将一个特定URL映射为另一个URL.为了帮助理解,我们假设你在站点有一个叫Homepage.aspx的页面来访问主页,所有的用户也都用这个页面来访问你的主页.但由于某些原因,你要将主页改为OriginalHome.aspx.此时使用URL映射让你可以映射到新页面,而不必通知用户. 如果我们设置了URL映射,那么任何用户在URL栏输入Homepage.aspx时,调用的都是OriginalHome.aspx. 深入概念: 让我

随机推荐