92django_url
目录
url 1
去掉url和static硬编码:... 1
url反向解析:... 2
url命名空间:... 2
django如何处理一个请求:... 3
错误处理:... 6
url
mysite/mysite/urls.py #入口url
def url(regex, view, kwargs=None, name=None): #view是function object,不是函数调用;view函数的第一参数永远是request,不探讨CBV,view函数的返回值永远是HttpResponse对象,显式或隐式;
url(r'^hello/$', hello), #django默认会给url后加/,此处定义,hello前不带/,hello后一定要有/,这样即使用户访问http://127.0.0.1:8000/hello也会自动跳到http://127.0.0.1:8000/hello/上;若此处配置为r'^hello$',用户访问http://127.0.0.1:8000/hello/,访问的地址无论是否带/都会报404;所以记住,此处定义的url,hello前没有/,hello后要有/;
url(r'^$', views.index, name='index') #app中的urls.py,可通过name反解出url;
url(r'^polls/', include('polls.urls')), #项目中的urls.py,include里是str,在用到时才动态导入;
url反向解析:
正解析,url-->view;
反解析,view-->url;
>>> from django.shortcuts import reverse
>>> reverse('detail',kwargs={'question_id':1}) #可以根据路由名称,返回具体的路径;未指明namespace的,用reverse(路由name);指明namespace,用reverse(命名空间namespace:路由name);路由name即views.方法名
'/polls/1/'
另,reverse_lazy(),为解决循环依赖;
在模板中,使用url模板标签;
在py代码中,使用django.core.urlresolvers.reverse();
在更高层与处理django模型实例相关的代码中,用get_absolute_url();
url命名空间:
app namespace和instance namespace:
方便查找特定view的具体路径信息;
通常使用app namespace;
若app有多个include,使用instance namespace;
app namespace:
mysite/polls/urls.py #方1,建议使用,在app_name/urls.py中定义
app_name = 'polls'
mysite/mysite/urls.py
url(r'^polls/', include('polls.urls', app_name='polls')), #方2,在项目下定义mysite/mysite/urls.py
instance namespace:
instance级别,名称不可以重复;
mysite/mysite/urls.py #总路由文件
url(r'^polls/', include('polls.urls', namespace='polls')),
例:
mxonline/organization/urls.py #某一app
urlpatterns = [
url(r'^list/$', OrgView.as_view(), name='org_list'),
url(r'^add_ask/$', AddUserAskView.as_view(), name='add_ask'),
]
mxonline/mxonline/urls.py #总路由文件
url(r'^org/', include('organization.urls', namespace='org')),
django如何处理一个请求:
响应流程:
1、项目启动后,根据mysite/mysite/settings.py中ROOT_URLCONF = 'mysite.urls'决定根urlconf;
2、mysite/mysite/urls.py中urlpatterns是由drango.conf.urls.url()函数调用(或实例)组成的列表;
3、django依次匹配每个url模式,在与请求的url匹配的第一个模式停下来;
4、一旦其中的一个正则表达式匹配上,django将导入并调用给出的view(是一个简单的py函数或一个基于类的view),view将获得如下参数:
1个HttpRequest实例;
如果匹配的正则表达式返回了没有命名的组,那么正则表达式匹配的内容将作为位置参数提供给view;
关键字参数由正则表达式匹配的命名组组成,但可被django.conf.urls.url()的可选参数kwargs覆盖;
5、如果没有匹配到正则表达式,或者如果过程中抛异常,django将调用一个适当的错误处理view;
注:
图中middlewares是一个整体,有多个功能;
主路由文件的urlpatterns列表中由上至下顺序查找对应的路由规则,若有include则再进入子的urlpatterns列表由上至下查询;
由上至下的顺序,有可能上面的路由屏蔽掉下面的路由,带来非预期的结果;
例,多种url:
urlpatterns = [
url(r'^article/2003/$', views.special_case_2003),
url(r'^article/([0-9]{4})/$', views.year_archive),
url(r'^article/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^article/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]
注:
若要从url中捕获一个值,只需要加上();
匹配的路径,不需要在前面加/,因为每个url都有,如应是article而不是/article;
每个正则表达式前面的r约定加上,目的告诉py这个字符串是raw原始的,字符串中的任何字符都不应转义;
默认捕捉到的都是字符串;
如/article/2005/03或/article/2019/01/?blog=hi,请求将匹配urlpatterns的第3个元素,django将调用函数views.month_archive(request,'2005','03');
如/article/2019/1/不匹配任何模式;
如/article/2003/将匹配列表第一个元素,不是第二个,按顺序依次匹配;
/article/2003,不匹配任何一个模式;
如/article/2019/01/03/,请求将调用views.article_detail(request,year='2019',month='01',day='03');
例,url多种组合:
url(r'^community/', include('django_website.aggregator.urls')),
url(r'^contact/', include('django_website.contact.urls')),
url(r'^reports/(?P<id>[0-9]+)/$', credit_views.report),
url(r'^charge/$', credit_views.charge),
url(r'^$', main_views.homepage),
url(r'^help/', include('apps.help.urls')),
url(r'^credit/', include(extra_patterns)),
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/', include([
url(r'^history/$', views.history),
url(r'^edit/$', views.edit),
url(r'^discuss/$', views.discuss),
url(r'^permissions/$', views.permissions),
])),
url(r'^$', main_views.homepage),
url(r'^help/', include('apps.help.urls')),
url(r'^credit/', include(extra_patterns)),
url(r'^log/', include(other_log)),
url(r'^(?P<username>\w+)/blog/', include('foo.urls.blog')), #捕获,参数的继承
url(r'^$', views.blog.index),
url(r'^archive/$', views.blog.archive),
url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}), #传递额外选项
错误处理:
当django找不到一个匹配请求的url正则表达式时,或当抛出一个异常时,django将调用一个错误处理view;
默认错误处理view,django.conf.urls中:
handler400 = 'django.views.defaults.bad_request'
handler403 = 'django.views.defaults.permission_denied'
handler404 = 'django.views.defaults.page_not_found'
handler500 = 'django.views.defaults.server_error'
urlpatterns = [...]
urlpatterns += [...] #常用,便于分组;
转载于:https://blog.51cto.com/jowin/2394756
92django_url相关推荐
最新文章
- 为什么您应该使用基于标准的开发实践
- 005_系统运维之SLA与SLO的关系
- 自动生成Insert数据的SQL脚本
- 2019年5月21号总结
- SQL Server资源管理之内存管理篇(上)
- 【线上分享】边缘计算与云原生架构应用及实践解析
- C++右值引用和完美转发
- 分析.cpp文件编译生成的汇编文件里语句的作用
- mysql中预定义常量_PHP预定义常量
- Exchange 2013 、Lync 2013、SharePoint 2013
- ExtJs 设置GridPanel表格文本垂直居中
- 神经网络的Dropout的理解
- nodejs mysql 增删改查_#NodeJS# MySQL的介绍安装使用以及使用NodeJS链接MySQL实现增删改查...
- 【预测模型-ELAMN预测】基于哈里斯鹰算法优化ELMAN神经网络实现数据回归预测matlab代码
- 为什么大容量的服务器SAS硬盘普遍都只有7200rpm的转速?
- 架构师说低代码:走出半生,归来仍是“毒瘤”!
- Tab页面知识整理及其方法分析
- 用keil怎么擦除_keil如何使用?图文教程告诉你keil怎么使用
- 【渝粤题库】陕西师范大学209008 教师伦理学 作业
- 微众税银首席风险官许卫 :AI在金融风控领域的实践应用
热门文章
- vue 模仿今日头条demo
- github命令行操作
- 20天持续压测,告诉你云存储性能哪家更强?
- C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别
- Android APK应用安装原理(2)-查找APK并自动安装
- Flex+fluorineFx +ASP.NET开发的IIS部署
- vue-cli 如何打包上线的方法示例
- MySQL · 捉虫动态 · event_scheduler 慢日志记错
- ASP .NET 如何在 SQL 查询层面实现分页
- 为jQuery写插件