Django - 将URL映射到视图

  

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

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 搜索路径的设置。 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/$' 是一个原始字符串。这样一来就能够避免 正则表达式
有过多的转义字符。django


没必要在 '^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 自带的有模板语言。 它的主要做用是如何展现数据,
好比视图层返回的是一个字符串, 要如何显示在页面上; 返回的对象数组要如何显示等。 固然, 为了使页面
更漂亮须要借助前端技术, 好比 CSSJavaScript 等。

运行后,结果如图

 

 Django 简单的处理流程

相关文章
相关标签/搜索