URL配置采用的是一个纯Python写的URLconf模块来弄的,这个模块能够把url模式与具体的视图函数一一对应起来
Django是如何处理一个请求的
- Django决定URLconf模块所使用的跟路由,跟路由的由
ROOT_URLCONF
所指定,但是如果进来的请求带了urlconf的属性,那么就会忽略掉ROOT_URLCONF
这个属性指定的内容 - Django加载指定模块,并且查找对应的url模式,这个模式列表是一个
django.conf.urls.url()
实例 - Django开始从上往下找查找URL列表
- 定位成功后,开始调用具体的视图模块,调用的时候回传入以下内
- 一个
HttpRequest
实例 - 假如有具名参数,把具名参数传入
kwargs
其他参数
- 一个
- 如果找不到或者出错了,执行错误捕捉页面
URL配置示例
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
绑定变量配置示例
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]
设置默认变量
# URLconf
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/$', views.page),
url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]
# View (in blog/views.py)
def page(request, num="1"):
# Output the appropriate page of blog entries, according to num.
...
引用其他路由
from django.conf.urls import include, url
urlpatterns = [
# ... snip ...
url(r'^community/', include('django_website.aggregator.urls')),
url(r'^contact/', include('django_website.contact.urls')),
# ... snip ...
]
也可以内部引用
from django.conf.urls import include, url
from apps.main import views as main_views
from credit import views as credit_views
extra_patterns = [
url(r'^reports/$', credit_views.report),
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(r'^credit/', include(extra_patterns)),
]
传递扩展变量
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]
反向生成URL
在URL跳转的时候基本都用这个,在定义url的时候我们定义了name,reverse的时候就用这个来反向生成
url定义
from django.conf.urls import url
from . import views
urlpatterns = [
#...
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
#...
]
在页面中使用
<a href="{% url 'news-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 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>
在代码中跳转
from django.urls import reverse
from django.http import HttpResponseRedirect
def redirect_to_year(request):
# ...
year = 2006
# ...
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
URL命名空间
admin模块里面可以设置app的namespace,设置之后反射跳转要带上命名空间
例如
from django.conf.urls import url
from . import views
app_name = 'polls'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
...
]
这里设置了app_name,所以reverse的时候要带上命名空间
reverse('polls:index', current_app=self.request.resolver_match.namespace)
前端同理
{% url 'polls:index' %}