一、URL路由
对于高质量的Web 应用来说,使用简洁、优雅的URL路由是一个非常值得重视的细节。Django 让你随心所欲设计你的URL,不受框架束缚。为了给一个应用设计URL,你需要创建一个Python 模块,通常称为URLconf(URL configuration)
。这个模块是纯粹的Python 代码,包含URL 模式(简单的正则表达式)到Python 函数(你的视图)的简单映射。
二、Django 如何处理一个请求
- django 加载(
manage.py
中的)ROOT_URLCONF
指定的模块,并寻找可用的urlpatterns
.它是django.conf.urls.url()
实例的一个Python 列表。 - Django 依次匹配每个 URL,在与请求的URL 匹配的第一个url停下来
- 一旦其中的一个正则表达式匹配上,Django 将导入并调用给出的视图,它是一个简单的Python 函数(或者一个基于类的视图)
- 如果没有匹配到正则表达式,或者如果过程中抛出一个异常,Django 将调用一个适当的错误处理视图:
handler404, handler500, handler403, handler400
(1)from django.conf.urls import url
URLconf:URLconf
是一个python模块,是一个URL模式(简单正则表达式)到Python函数(视图)之间的映射。
urlpatterns:urlpatterns
是一个 url() 实例类型的Python 列表。urlpatterns 中的每个正则表达式在第一次访问它们时被编译。
url函数
url(regex, view, kwargs=None, name=None)
- regex: 一个字符串(原始字符串)或简单的正则表达式
- view: view参数是一个视图函数或as_view()的结果(基于类的视图)
- kwargs: 传递额外的参数给视图
- name: url名称
(2)from django.conf.urls import include
Include语法
include(module, namespace=None, app_name=None)
include(pattern_list)
include((pattern_list, app_namespace), namespace=None)
include((pattern_list, app_namespace, instance_namespace))
- module: URLconf模块
- namespace:URL命名空间
- app_name: app的命名空间
- pattern_list: 可迭代的django.conf.urls.url()实例
- app_namespace: 应用的命名空间
- instance_namespace: 实例的命名空间
include 示例
urlpatterns = [
url( r'^$', RedirectView.as_view(url="/dashboard/")),
url(r'^dashboard/', include("dashboard.urls")),
url(r'^accounts/', include("accounts.urls")),
url(r'^admin/', admin.site.urls),
]
urlpatterns = [
url(r"^user/", include([
url(r'^list/$', view.userlist, name="user_list"),
url(r'^info/$', view.userinfo, name="userer_inf),
url(r'^modify/', include([
url(r'status/$',view.modifystatus, name="user_modify_status"),
]))
]))
]
表示访问路径:/user/list /user/info /user/modify/status
三、url参数——位置参数
若要从URL 中捕获一个值,只需要在它周围放置一对圆括号
devops/dashboard/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
#url(r'^articles/2019/$', views.special_case_2019),
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),
]
视图
devops/dashboard/views.py
from django.http import HttpResponse
import json
# def special_case_2019(request):
# return HttpResponse("article 2019")
def year_archive(request, *args, **kwargs):
return HttpResponse(json.dumps(args))
def month_archive(request, *args, **kwargs):
return HttpResponse(json.dumps(args))
def article_detail(request, *args, **kwargs):
return HttpResponse(json.dumps(args))
请求地址:http://127.0.0.1:8000/dashboard/articles/2019/01/13/
调用函数:views.article_detail(request, “2019”, “01”, “13”)
页面显示:[“2019”, “01”, “13”]
四、url参数——关键字参数
语法:
(?P<name>pattern)
- name是传给视图参数的名字,
- pattern是一个正则表达式,也是关键字参数的值
url参数——关键字参数示例
devops/dashboard/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2019/$', views.special_case_2019),
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),
]
视图
devops/dashboard/views.py
from django.http import HttpResponse
import json
# def special_case_2019(request):
# return HttpResponse("article 2019")
def year_archive(request, *args, **kwargs):
return HttpResponse(json.dumps(kwargs))
def month_archive(request, *args, **kwargs):
return HttpResponse(json.dumps(kwargs))
def article_detail(request, *args, **kwargs):
return HttpResponse(json.dumps(kwargs))
请求地址:http://127.0.0.1:8000/dashboard/articles/2019/01/13/
调用函数:views.article_detail(request, year=‘2019’, month=‘01’, day=‘13’).
页面显示:{“year”: “2019”, “month”: “01”, “day”: “13”}
五、url参数——额外参数
URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数
django.conf.urls.url() 函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数
devops/dashboard/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'name': 'blog'}),
]
请求地址:http://127.0.0.1:8000/dashboard/blog/2019/01/
调用函数:views.year_archive(request, year=‘2019’,name=‘blog’)
页面显示:{“year”: “2019”, “month”: “01”, “name”: “blog”}
六、URL反向解析(了解)
django给每个URL取了一个名字,存储每个URL与name的映射关系
根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。这种方式叫做反向解析URL、反向URL匹配、反向URL查询或者简单的URL反查。
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
]
URL反向解析示例:
视图中使用:
from django.core.urlresolvers import reverse
year = 2019
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
模板中使用:
<a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a>