视图(一)
视图层主要包括url分配和视图函数
参考资料:https://docs.djangoproject.com/zh-hans/2.0/topics/http/urls/
一、URL调度器
设计url的标准是简洁和优雅。当为一个app设计url时,我们会创建一个叫做URLconf模块,用来实现url表达式和视图函数之间的连接。
1、django处理请求的过程
首先django会确定使用哪个root URLconf。一般来说,会使用ROOT_URLCONF设置中的值,但是如果HttpRequest对象中有urlconf属性,那就会使用这个属性的值。
django找到对应的python模块,然后找到变量urlpatterns。这个就是之前写过的url表达式的列表,但是单个示例也是可以的。
django开始匹配其中的url模式
如果匹配的话,django就会导入对应的视图函数,然后传入几个参数
一个HttpRequest实例
如果匹配之后,没有任何对应的视图,位置参数??这段不懂,
在表达式中定义的关键词变量
如果没有匹配的话,或者出现异常,django会触发一个错误界面。
If the matched URL pattern returned no named groups, then the matches from the regular expression are provided as positional arguments.
是不是说尖括号中提取变量的时候,没有给命名,所以会传入位置参数,而位置参数就是说,第几个从url提取出来的就第几个传入视图函数,按顺序排列。
from django.urls import path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:month>/<slug:slug>/', views.article_detail)
]用尖括号来提取url中的变量
使用转换器可以加上类型,比如
<int:name>,可以接受整数型变量
示例和结果
2、路径转化器
str:除了破折号之外的非空字符串,默认类型
int:匹配0和正整数
slug:匹配slug字符串,可以包括连词符或者下划线
uuid:不懂,大概这样
075194d3-6885-417e-a8a8-6c931e272f00path:任何非空字符串,包括破折号
当然也可以自定义路径转化器,只需要写一个类即可
regex:匹配的表达式
to_python:传给视图函数
to_url:传给url??
传给url是什么什么意思?是指显示在url中吗?但是这个url不是直接输过来的吗?不懂
3、使用正则表达式
上面的那种方式,还需要去创建单独的类,其实很麻烦,但是可以使用re_path而不是path,就可以直接用正则表达式去匹配,格式(?P<name>pattern)
优点是方便快捷,缺点是只能匹配正则表达式的内容,如果是一个类的话,还可以匹配较多的情况;另一个缺点是就是不论匹配到什么类型的数据,最后返回的都是字符串,这个问题也还好吧,就是在视图函数中要做些处理。
4、使用未命名的正则表达式
未命名的匹配组之前提到过,但是重点是只能使用一种,要么都是命名的,要么都是没命名的,如果混合,只要命名的会传入视图函数,而未命名的会被忽略。
5、嵌套参数
试想url传入的一个参数是嵌套的,我们只需要里面的一个数值,但是并不需要整个参数
blog/page-2可以被上面两种匹配,但是第一种会有两个位置参数,page-2和2,而第二种会有一个关键词参数,page_number:2,而(?:.)会被忽略
6、URLconf在什么上查找
在上面两个url中国,URLconf都是在寻找myapp,也就是说不论提交的请求时get,post哈市head,都会指向相同的视图函数
7、指定试图参数的默认值
很简单
8、错误处理
当django不能找到请求url的匹配,或者当一个异常出现的时候,django会触发一个错误界面。
后面的说明确实有些看不懂
handler400
handler403
handler404
handler500
9、包含其他的URLconfs
urlpatterns可以包含放在其他地方中的URLconf,使用include主要有两种可能,一种是URLconf放在其他模块了,而放在其他的模块的原因可能是为了具体匹配某种url情况
另一种情况就是url中的path太多了,进行分类
这样的好处是避免同一前缀被重复使用,当然也可以这样做
10、捕获的参数
父URLconf捕获到的参数也会传给子URLconf
11、传递额外的参数给视图函数
在使用URL匹配url时,除了从url中提取出来的参数,django允许你传入额外的参数到视图函数中,但是必须以字典的形式
传入视图的参数会是views.year_archive(request, year=2005, foo='bar')
当然include,也是可以的
include内的所有子URLconf都会接收到后面的参数
12、反向解析URLs
在使用django时,一个常见的情况是我们需要得到对应的urls形式,而不是在URLconf匹配到那一段,这个可能会用在页面展示的时候等等。
顺便原文提到非常不建议硬编码urls
使用url映射器可以解决这个问题,url映射器可以被使用在两种方向
根据url匹配不同的视图函数
从视图和参数开始找到关联的url
总之,这就是个可双向使用的工具。
django提供了三个层次上的方法
模板:使用 url 模板 tag
python代码: 使用reverse()函数
在处理django模型示例的URls的相关高阶代码:使用
原来这才是为什么传入一个name的原因吗?等等,我的思维好像跳的太快了,这只是一个传入视图的参数不是吗?但是好像之前的视图函数并没有处理这个name参数啊?而且是如何与url挂钩的呢?
这好像跟我理解的不一样啊,这样得到的只是部分url,我还以为得到的是完整的url
13、命名空间
这部分是给应用命名,两种方式
1、
2、
使用这个的原因是避免歧义,当有多个应用的时候,应用中可能会出现重名的视图,这时模板中调用视图的urls时可能与预想的会出现差别,所以使用app_name来限制不同的应用中的重名视图。
Last updated
Was this helpful?