URL的反向解析

摘要:
在某些场景中,一个视图是通用的,所以在URL和视图之间存在多对一的关系。对于这些情况,当反查URL时,只有视图的名字还不够。URL的名称使用的字符串可以包含任何你喜欢的字符。如果你的URL模式叫做comment,而另外一个应用中也有一个同样的名称,当你在模板中使用这个名称的时候不能保证将插入哪个URL。在URL名称中加上一个前缀,比如应用的名称,将减少冲突的可能。

简单来说就是可以给我们的URL匹配规则起个名字,一个URL匹配模式起一个名字。

这样我们以后就不需要写死URL代码了,只需要通过名字来调用当前的URL

举个简单的例子:

url(r'^home', views.home, name='home'),  # 给我的url匹配模式起名(别名)为 home,别名不需要改,路径你就可以随便改了,别的地方使用这个路径,就用别名来搞
url(r'^index/(d*)', views.index, name='index'),  # 给我的url匹配模式起名为index

这样:

在模板里面可以这样引用:

{% url 'home' %}  #模板渲染的时候,被django解析成了这个名字对应的那个url,这个过程叫做反向解析

在views函数中可以这样引用:(后面再讲这个视图函数应用反向解析的内容,上面的是模板应用反向解析的过程)

from django.urls import reverse

reverse("index", args=("2018", ))

例子:
考虑下面的URLconf:


from django.conf.urls import url

from . import views

urlpatterns = [
    # ...
    url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
    # ...
]

根据这里的设计,某一年nnnn对应的归档的URL是/articles/nnnn/

你可以在模板的代码中使用下面的方法获得它们:


<a href="http://t.zoukankan.com/{% url 'news-year-archive' 2012 %}">2012 Archive</a>

<ul>
{% for yearvar in year_list %}
<li><a href="http://t.zoukankan.com/{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>

在Python 代码中,这样使用:


from django.urls import reverse
from django.shortcuts import redirect

def redirect_to_year(request):
    # ...
    year = 2006
    # ...
    return redirect(reverse('news-year-archive', args=(year,))) #或者直接return redirect('news-year-archive',year) redirect内部会自动调用reverse来进行反向解析

如果出于某种原因决定按年归档文章发布的URL应该调整一下,那么你将只需要修改URLconf 中的内容。

在某些场景中,一个视图是通用的,所以在URL 和视图之间存在多对一的关系。对于这些情况,当反查URL 时,只有视图的名字还不够。

注意:

为了完成上面例子中的URL 反查,你将需要使用命名的URL 模式。URL 的名称使用的字符串可以包含任何你喜欢的字符。不只限制在合法的Python 名称。

当命名你的URL 模式时,请确保使用的名称不会与其它应用中名称冲突。如果你的URL 模式叫做comment,而另外一个应用中也有一个同样的名称,当你在模板中使用这个名称的时候不能保证将插入哪个URL。

在URL 名称中加上一个前缀,比如应用的名称,将减少冲突的可能。我们建议使用myapp-comment而不是comment

今日内容

1.urlconf

urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^blog/$', views.blog),
url(r'^blog/[0-9]{4}/$', views.blogs),
]

2.正则表达式

^ $ [0-9] [a-zA-Z] d w . * + ?

3.分组和命名分组

分组

url(r'^blog/([0-9]{4})/$', views.blogs),   —— 》 分组  将捕获的参数按位置传参传递给视图函数

命名分组

url(r'^blog/(?P<year>[0-9]{4})/$', views.blogs),  —— 》 命名分组 将捕获的参数按关键字传参传递给视图函数

4.include

urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls')),
]

app01.urls

from django.conf.urls import url
from . import views
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^blog/$', views.blog),
url(r'^blog/(?P<year>[0-9]{4})/(?P<month>d{2})/$', views.blogs),
]

5.URL的命名和反向解析

静态路由

url(r'^blog/$', views.blog, name='blog'),

反向解析

模板

{% url 'blog' %}   _>  /blog/

py文件中

from django.urls import reverse
reverse('blog')  _> '/blog/'

分组

url(r'^blog/([0-9]{4})/(d{2})/$', views.blogs, name='blogs'),

反向解析

模板

{% url 'blogs' 2222 12 %}"  ——》  /blog/2222/12/

py文件中

from django.urls import reverse
reverse('blogs',args=('2019','06'))  ——》 /app01/blog/2019/06/

命名分组

url(r'^blog/([0-9]{4})/(d{2})/$', views.blogs, name='blogs'),

反向解析

模板

{% url 'blogs' 2222 12 %}"  ——》  /blog/2222/12/
{% url 'blogs' year=2222 month=12 %}"  ——》  /blog/2222/12/

py文件中

from django.urls import reverse
reverse('blogs',args=('2019','06'))  ——》 /app01/blog/2019/06/ 
reverse('blogs',kwargs={'year':'2019','month':'06'})  ——》 /app01/blog/2019/06/

6.namespace

urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),

]

{% url 'app01:blogs' 2222 12 %}

reverse('app01:blogs',args=('2019','06'))

免责声明:文章转载自《URL的反向解析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android 布局详解解决Mac OS X Lion狮子系统及win7多分区教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Feign 动态URL 解决记录

Feign中使用动态URL请求 (应当是spring-cloud-starter-openfeign,不知道和一般的feign有何差别) 在spring项目下,假设有这样个Feign的消费接口,原来写死请求百度 @FeignClient(value = "test-service", url="http://www.baidu.com") public i...

[实例]JAVA调用微信接口发送图文消息,不用跳到详情页

packagecom.test; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importjava.net.HttpURLConnection; importjava.net.MalformedURLException; importj...

[转]Windows 注册自定义的协议

[转自] http://blog.sina.com.cn/s/blog_86e4a51c01010nik.html 1、注册应用程序来处理自定义协议          你必须添加一个新的key以及相关的value到HKEY_CLASSES_ROOT中,来使应用程序可以处理特殊的URL协议。          新注册的key必须与协议scheme相匹配才可以...

SVN安装

Svn 搭建教程 一、首先准备三个软件: 1.VisualSVN-Server-3.8.1-x64(svn服务端) 2.TortoiseSVN-1.10.0.28176-x64-svn-1.10.0.msi(svn客户端) 3.LanguagePack_1.10.0.28176-x64-zh_CN.msi(TortoiseSVN 的汉化包) 软件下载路径...

第五篇 基于.net搭建热插拔式web框架(拦截器---请求管道)

  好了,前边我们把核心内容介绍完了,接下来要做的就是拦截用户的请求,并把请求转向沙箱内。   这里我们准备通过实现一个HttpModule类来完成请求的拦截与转发。新建一个HuberHttpModule类,并继承IHttpModule。下面我们暂时只处理Application_BeginRequest事件。   先获取request和response对象...

企业微信第三方应用开发几个注意点

不知不觉已经搞企业微信开发2年了,公司的产品(慧人力,云报餐)目前和同行比起来算是功能比较齐全的了,平时重心主要在业务上,没有对企业微信授权流程进行笔记整理。关于企业微信API,新手看有点迷糊,如果有人讲一遍就会好很多,下面把第三方应用开发中几个不好理解的地方分享下。 1、服务商平台,创建一个非通讯录应用 应用主页指的是手机端登录后访问的第一个页面,...