Django---URL
来源:互联网 发布:软考程序员有必要考吗 编辑:程序博客网 时间:2024/05/16 16:58
- Django的URL配置
- 1 静态路由
- 2 动态路由
- 位置参数
- 关键字参数
- 3 路由分发
- 4 向view函数中传参
- 5 向include中传参
- 6 URL别名
- Django的URL配置
1. Django的URL配置
1.1 静态路由
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hello/$', hello), url(r'^time/$', current_datetime),]
像^time/$
这样的url是固定了,也就是静态的,请求时只能以这种格式
1.2 动态路由
位置参数
- 设置位置参数
urlpatterns = [ # ... url(r'^time/plus/(\d+)/(\d+)/$', hours_ahead), # ...]
像^time/plus/(\d+)/$
这样可以匹配以time/plus/
开头后接一组数字的结尾的URL成为动态路由。
动态路由的关键是使用正则表达式,需要注意的是正则表达式必须包含在圆括号中
接收位置参数
在views中定义的函数中添加参数来获取def hours_ahead(request, a1, a2): try: a1 = int(a1) a2 = int(a2) except ValueError: raise Http404() html = "<html><body>The first one is %s, and the second one is %s</body></html>" % (a1, a2) return HttpResponse(html)
以URL
http://127.0.0.1:8000/time/plus/22/33/
为例,可以看出第一个参数a1
接收URL中的22
,第二个参数a2
接收URL中的33
。打印结果The first one is 22, and the second one is 33
如果将参数中的a1
和a2
的位置调换,那么a1
和a2
的值结汇调换。打印结果The first one is 33, and the second one is 22
关键字参数
设置关键字参数
通过?P<arg>
作为正则表达式的前缀实现关键字参数设置,其中arg为参数的名称,在views中设置视图函数要使用。具体用例如下所示。urlpatterns = [ ... url(r'^time/plus/(?P<a2>\d+)/(?P<a1>\d+)/$', views.hours_ahead),...]
接收关键字参数
视图函数如下所示:def hours_ahead(request, a1, a2): try: a1 = int(a1) a2 = int(a2) except ValueError: raise Http404() html = "<html><body>The first one is %s, and the second one is %s</body></html>" % (a1, a2) return HttpResponse(html)
以
http://127.0.0.1:8000/time/plus/22/33/
为例,虽然函数参a1
的位置在a2
之前,但a1
接收33
,a2
接收22
,按照URL中的顺序接收。
打印结果如下所示The first one is 33, and the second one is 22
1.3 路由分发
from django.conf.urls import include, urlfrom apps.main import views as main_viewsfrom credit import views as credit_viewsextra_patterns = [ url(r'^reports/(?P<id>[0-9]+)/$', credit_views.report), url(r'^charge/$', credit_views.charge),]urlpatterns = [ url(r'^$', main_views.homepage), url(r'^help/', include('apps.help.urls')), # 包含其他URL文件 url(r'^credit/', include(extra_patterns)), # 当前文件URL分组]
使用URL分组的方法使得URL更加简洁,
不分组的URL
from django.conf.urls import urlfrom . import viewsurlpatterns = [ url(r'^(?P<page_slug>\w+)-(?P<page_id>\w+)/history/$',views.history), url(r'^(?P<page_slug>\w+)-(?P<page_id>\w+)/edit/$', views.edit), url(r'^(?P<page_slug>\w+)-(?P<page_id>\w+)/discuss/$', views.discuss), url(r'^(?P<page_slug>\w+)-(?P<page_id>\w+)/permissions/$',views.permissions),]
使用URL分组
from django.conf.urls import include, urlfrom . import viewsextra_patterns = [ url(r'^history/$', views.history), url(r'^edit/$', views.edit), url(r'^discuss/$', views.discuss), url(r'^permissions/$', views.permissions),]urlpatterns = [ url(r'^(?P<page_slug>\w+)-(?P<page_id>\w+)/', include(extra_patterns)),]
如果只分一组,为了不新命名一个组可以使用如下方式
urlpatterns = [ 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), ] )),]
通过分组减少了重复代码的书写,也减少了输入错误。
1.4 向view函数中传参
url中有三个参数,一般我们适用前两个,分别是匹配URL的正则表达式和与之对应的views函数,此外还有第三个参数,用来向views函数中传递参数。第三个参数的格式为字典格式,如下所示。
from django.conf.urls import urlfrom . import viewsurlpatterns = [ url( r'^reviews/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'} ),]
如果发送一个/reviews/2005/ 的请求,Django会调用函数
views.year_archive(request,year='2005',foo='bar')
1.5 向include中传参
向include中传参,就是对include中包含的每一个URL传相同的参数
# main.pyfrom django.conf.urls import include, urlurlpatterns = [ url(r'^reviews/', include('inner'), {'reviewid': 3}),]# inner.pyfrom django.conf.urls import urlfrom mysite import viewsurlpatterns = [ url(r'^archive/$', views.archive), url(r'^about/$', views.about),]
这种方式和下面的方式是等价的
# main.pyfrom django.conf.urls import include, urlfrom mysite import viewsurlpatterns = [ url(r'^reviews/', include('inner')),]# inner.pyfrom django.conf.urls import urlurlpatterns = [ url(r'^archive/$', views.archive, {'reviewid': 3}), url(r'^about/$', views.about, {'reviewid': 3}),]
1.6 URL别名
from django.conf.urls import urlfrom . import viewsurlpatterns = [#...url(r'^reviews/([0-9]{4})/$', views.year_archive, name='reviews-year-archive'),#...]
<a href="{% url 'reviews-year-archive' 2012 %}">2012 Archive</a>{# Or with the year in a template context variable: #}<ul> {% for yearvar in year_list %} <li><a href="{% url 'reviews-year-archive' yearvar %}">{{ yearvar }}Archive</a></li> {% endfor %}</ul>
from django.core.urlresolvers import reversefrom django.http import HttpResponseRedirectdef redirect_to_year(request): # ... year = 2012 # ... return HttpResponseRedirect(reverse('reviews-year-archive', args=(year,)))
- Django URL
- Django url
- Django---URL
- django 中文 url 问题
- DJANGO获取当前URL
- django中url配置
- Django的url解析
- Django URL 解析
- django URL映射过程
- Django的url用法
- django--URL配置
- django url正则
- django过滤器-----url
- django url调度
- django url使用汇总
- Django URL调度
- django简化url配置
- Django URL 分发
- 文件管理的输入与输出
- lnmp之nginx
- python中的列表及注意事项
- HDOJ 1890 Robotic Sort
- [EMACS]helm-mode学习小结
- Django---URL
- zip函数用法
- 十个不错的javascript知识,也许会对你有帮助
- <JavaScript>Basic
- 调用startActivityForResult之后,onActivityResult立即响应
- Android Wi-Fi Wi-Fi联盟PMK Caching认证简介
- 【NKOJ3958/BZOJ2693】【莫比乌斯反演】jzptab
- 51Nod-1719-数值计算
- hdu 1728 逃离迷宫 普通的队列 / 优先队列