美文网首页
3.6Django再说View(1)

3.6Django再说View(1)

作者: 昵称又重复 | 来源:发表于2018-04-26 16:45 被阅读68次

现在的你刀枪不入, 是因为曾经的万剑穿心。

奉上目录

  1. URLconf
    1.1 url()方法
    1.2 包含其他的URLconfs
    1.2.1 include方法
    1.2.2 多个urlconf的使用
    1.3 URL的反向解析
  2. 视图函数
    2.1 定义视图
    2.2 视图参数的传递
    2.3 错误视图
    2.3.1 404(page not found)视图
    2.3.2 500(server error)视图
    2.3.3 400(bad request)视图

—————————————————————————

1.URLconf

 在 Django 框架中,提供了非常清晰简洁的 url 管理方法
 在项目文件夹下 settings.py 文件中通过 ROOT_URLCONF 指定根级 url 的配置
 新建一个 Django project 之后,在项目文件夹 urls.py 中的 urlpatterns 列表中来配置 url,每一个列表项就是一个由 url 函数的调用。
 urlpatterns 是一个 url 实例的列表
 django 的 url 配置有效的降低了后台和页面的耦合度

—————————————————————————

1.1url()方法

def url(regex, view, kwargs=None, name=None)

regex : 正则表达式
view: 视图函数
name: 名称
kwargs: 就是一个字典类型的参数
name 用来唯一区分一个视图对应多个 urlconf 的场景

url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}, "arch-summary"),

功能:凡是与 regex 匹配的 URL 请求都会执行到 url()函数中对应的第二个参数 view 代表的视图函数。

 在模板中使用链接的话就这样写:

<a href="detail/{{book.id}}/">{{ book.btitle }}</a>
<a href=" {{book.id}}/">{{ book.btitle }}</a>

编写 URLconf 的注意:
不需要添加一个前导的反斜杠,如应该写作'booktest/',而不应该写作'/booktest/',否则意味着从根目录匹配每个正则表达式前面的 r 表示字符串不转义
 请求的 url 被看做是一个普通的 python 字符串,进行匹配时不包括 get 或 post 请求的参数及域名,例如:
http://www.qikuedu.com/python/1/?i=1&p=new,只匹配“python/1/” 部分
性能:
urlpatterns 中的每个正则表达式在第一次访问它们时被编译,这使得系统相当快

—————————————————————————

1.2 包含其他的URLconfs

假设我们在 booktest 模块中定义了一个 index 页面,想通过
"http://localhost:8000/booktest/index"来访问

  1. 首先我们在 view.py 中定义 index 函数:
def index(reqeust):
    booklist = BookInfo.books.all()
return render(reqeust, 'booktest/index.html', {'booklist': booklist})
  1. 然后在项目的 urls.py 的 urlpatterns 列表中添加一个 url 配置:
from booktest import views
    urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^booktest/', views.index),
]

然后启动服务后运行:通过在浏览器的地址栏输入:"http://localhost:8000/booktest/"来访问。
新的问题: 但假如一个 project 中有多个 app,用以上的方式来管理 url 可能会造成比较混乱的局面.
为了解决这个问题,我们可以用下面介绍的 include 方法来配置 url

—————————————————————————

1.2.1include方法

include(arg, namespace=None)

参数 1:包含 booktest 应用的 urlconf
参数 2:定义命名空间,用于反解析
 命名空间(英语: Namespace)是表示标识符的可见范围。
 一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。
 这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

—————————————————————————

1.2.2多个urlconf的使用

  1. 再在项目的 url.py 中使用 include() 包含应用 app 的 urlconf
from django.conf.urls import include, url
urlpatterns = [
    url(r'^'booktest/', include('booktest.urls')),# 包含 booktest 应用的 urlconf
]
  1. 在应用中创建 urls.py 文件,定义本应用中的 urlconf
urlpatterns =[
    url(r'^$',views.index),
    url(r'^detail/(\d+)/$',views.detail),
]

**匹配过程: 先与主 URLconf 匹配,成功后再用剩余的部分与应用中的 URLconf 匹配
请求 http://127.0.0.1:8000/booktest/1/
用 booktest/1/与项目的 urls 匹配
在项目 urls.py 中的配置:

url(r'^booktest/', include('booktest.urls')),

去除匹配过的部分,剩余部分部分是: 1/
用“1/” 与 booktest 应用的 urls 匹配

url(r'^([0-9]+)/$', views.detail, name='detail'),

—————————————————————————

1.3 URL的反向解析

 问题: 如果在视图、模板中使用硬编码的链接,在 urlconf 发生改变时,维护非常麻烦
 解决: 通过指向 urlconf 的名称, 根据正则表达式动态生成链接地址
 视图: 使用 django.urls.reverse()函数

from django.urls import reverse
from django.http import HttpResponseRedirect
def test(reqeust, id):

url name 的使用:

return HttpResponseRedirect(reverse('booktest:detail', args=(1,)))

说明:
第一个参数: " bookTest: detail": ' booktest 应用下的 name = detail 的函数。
booktest 应用 url conf:

url(r'^booktest/detail/([0-9]+)/$',views.detail,name='detail')

第二个参数: self.pk 会替代正则表达式里面的 pk
然后 reverse 函数去解析视图函数对应的 URL。
 项目的 url conf: url(r'^', include('booktest.urls', namespace='booktest'))
在模版中使用:

django2.x:
<a href="{% url 'booktest:detail' book.id %}">{{ book.btitle }}</a>
#多个参数的传递:
<a href="{% url 'booktest:detail2' book.id book.id %}">{{ book.btitle }}</a>
应用 url conf: url(r'^detail2/(\d+)/(\d+)/$',views.detail2,name='detail2'),

django 早期版本:

<a href="{% url 'booktest.views.detail' book.id %}">{{ book.btitle }}</a>

否则报错:
NoReverseMatch at /booktest/
Reverse for 'detail 2' not found. 'detail 2' is not a valid view function or
pattern name.

解决方法:
 在 booktest 应用 urls.py 中的配置
 app_name='app_name'

—————————————————————————

2.视图函数

2.1定义视图

 本质就是一个函数
 视图的参数
 一个 HttpRequest 实例
 通过正则表达式组获取的位置参数或者关键字参数
 在应用目录下默认有 views.py 文件,一般视图都定义在这个文件中
 如果处理功能过多,可以将函数定义到不同的 py 文件中

—————————————————————————

2.2视图参数的传递

 正则表达式非命名分组,通过位置参数传递给视图

url(r'^([0-9]+)/$', views.detail, name='detail'),

 正则表达式命名分组,通过关键字参数传递给视图,本例中关键字参数为 id

url(r'^(?P<id>[0-9]+)/$', views.detail, name='detail'),

参数匹配规则:优先使用命名参数,如果没有命名参数则使用位置参数
 每个捕获的参数都作为一个普通的 python 字符串传递给视图
 参数:视图会收到来自父 URLconf、当前 URLconf 捕获的所有参数

—————————————————————————

2.3错误视图

Django 原生自带几个默认视图用于处理 HTTP 错误,就是在运行过程中出现错误的话,你可以设定报错界面的显示内容,至少不用让大家在去低着头翻英语字典,或者查提示错误的汉语,算是一个个性化的设置。

—————————————————————————

2.3.1 404(page not found)视图

404 (page not found) 视图
 当抛出 Http404 异常时, Django 会加载一个特殊的 view 方法
django.views.defaults.page_not_found 处理 404 错误。
 它负责加载和渲染 404.html 模板文件。
 这意味着我们必须在模板根目录定义 404.html 模板文件,该模板文件应用于所有的 404异常。

defaults.page_not_found(request, template_name='404.html')

 默认的 404 视图将传递一个变量给模板: request_path,它是导致错误的 URL
 如果 Django 检测 URLconf 中的每个正则表达式后没有找到匹配的内容将调用 404 视图
 如果在 settings 中 DEBUG 设置为 True,那么将永远不会调用 404 视图,而是显示
URLconf 并带有一些调试信息
 在 templates 中创建 404.html

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
找不到了
<hr/>
{{request_path}}
</body>
</html>

 在 settings.py 中修改调试

DEBUG = False
ALLOWED_HOSTS = ['*', ]

 请求一个不存在的地址看看会出现什么神奇的事情!
http://127.0.0.1:8000/test/

—————————————————————————

2.3.2 500(server error)视图

500(server error)视图
当 view 代码发生运行时错误时, Django 将会调用默认地 view 方法
django.views.defaults.server_error, 该方法加载渲染 500.html 模板文件。
 这意味着我们必须在模板根目录定义 500.html 模板文件,该模板文件应用于所有的服务器错误。

defaults.server_error(request, template_name='500.html')

 默认的 500 视图不会传递变量给 500.html 模板
 如果在 settings 中 DEBUG 设置为 True,那么将永远不会调用 500 视图,而是显示
URLconf 并带有一些调试信息

—————————————————————————

2.3.3 400(bad request)视图

from django.views import defaults

 defaults.bad_request(request, template_name='400.html')
 错误来自客户端的操作
 当用户进行的操作在安全方面可疑的时候,例如篡改会话 cookie

感谢语

好了,这篇文章的内容到这就结束了,这篇文章是不是比上篇文章好看了一点点呢?其实这都不太重要,重要的是你有没有从中学习到什么东西呢?这是我的目的,也是我的宗旨!!!最后感谢大佬们的赞赏!!!谢谢!!!

相关文章

网友评论

      本文标题:3.6Django再说View(1)

      本文链接:https://www.haomeiwen.com/subject/ebxmlftx.html