Django如何将URL映射到视图


Posted in Python onJuly 29, 2019

前言

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 交互式解释程序,输入 importsys ,接着输入 print sys.path

通常,你不必关心 Python 搜索路径的设置。 Python 和 Django 会在后台自动帮你处理好。

(如果有兴趣了解的话, Python 搜索路径的设置工作是 manage.py 文件的职能之一。 )

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

Django如何将URL映射到视图

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如何将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 视图

Django如何将URL映射到视图

接下来请求的处理就到了.../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) 来短路或者增强。关于中间件的细节将在第十五章详细谈论,这里给出 下图 让你先了解 大体概念.。

Django如何将URL映射到视图

当服务器收到一个 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如何将URL映射到视图

Django 简单的处理流程

Django如何将URL映射到视图

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

Python 相关文章推荐
Python中的迭代器与生成器高级用法解析
Jun 28 Python
Python读取一个目录下所有目录和文件的方法
Jul 15 Python
Python用imghdr模块识别图片格式实例解析
Jan 11 Python
解决pycharm运行时interpreter为空的问题
Oct 29 Python
python3使用pandas获取股票数据的方法
Dec 22 Python
Python实现E-Mail收集插件实例教程
Feb 06 Python
解决Python正则表达式匹配反斜杠''\''问题
Jul 17 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
Dec 19 Python
Python如何使用字符打印照片
Jan 03 Python
PyQt5的QWebEngineView使用示例
Oct 20 Python
python matlab库简单用法讲解
Dec 31 Python
Pycharm 设置默认解释器路径和编码格式的操作
Feb 05 Python
python3获取当前目录的实现方法
Jul 29 #Python
Python在Matplotlib图中显示中文字体的操作方法
Jul 29 #Python
Django框架创建mysql连接与使用示例
Jul 29 #Python
python使用minimax算法实现五子棋
Jul 29 #Python
浅析python 中大括号中括号小括号的区分
Jul 29 #Python
Django分页功能的实现代码详解
Jul 29 #Python
微信小程序python用户认证的实现
Jul 29 #Python
You might like
php木马攻击防御之道
2008/03/24 PHP
php中apc缓存使用示例
2013/12/25 PHP
php生成html文件方法总结
2014/12/01 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
Web开发之JavaScript
2012/03/29 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
Python爬取京东的商品分类与链接
2016/08/26 Python
python之cv2与图像的载入、显示和保存实例
2018/12/05 Python
python实现三维拟合的方法
2018/12/29 Python
eclipse创建python项目步骤详解
2019/05/10 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
详解用python生成随机数的几种方法
2019/08/04 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
Django Form设置文本框为readonly操作
2020/07/03 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
彪马英国官网:PUMA英国
2019/02/11 全球购物
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
教师岗位聘任书范文
2014/03/29 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
保证书格式
2015/01/16 职场文书
经典导游欢迎词
2015/01/26 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
乱世佳人观后感
2015/06/08 职场文书
车间班组长竞聘书
2015/09/15 职场文书
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB