现在的你刀枪不入, 是因为曾经的万剑穿心。
奉上目录
- URLconf
1.1 url()方法
1.2 包含其他的URLconfs
1.2.1 include方法
1.2.2 多个urlconf的使用
1.3 URL的反向解析 - 视图函数
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"来访问
- 首先我们在 view.py 中定义 index 函数:
def index(reqeust):
booklist = BookInfo.books.all()
return render(reqeust, 'booktest/index.html', {'booklist': booklist})
- 然后在项目的 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的使用
- 再在项目的 url.py 中使用 include() 包含应用 app 的 urlconf
from django.conf.urls import include, url
urlpatterns = [
url(r'^'booktest/', include('booktest.urls')),# 包含 booktest 应用的 urlconf
]
- 在应用中创建 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
感谢语
好了,这篇文章的内容到这就结束了,这篇文章是不是比上篇文章好看了一点点呢?其实这都不太重要,重要的是你有没有从中学习到什么东西呢?这是我的目的,也是我的宗旨!!!最后感谢大佬们的赞赏!!!谢谢!!!
网友评论