Django基础之二(URL路由)
URL路由
简介
- 对于高质量的web应用来说,使用简洁,优雅的URL路由是一个值得尊重的细节,Django可以随心所欲的设计URL,不受框架的约束
- 为了给一个应用设计URL,你需要一个Python模块,通常被称为URLconf,这个模块是纯粹的URL模式(简单的正则表达式)到python函数(视图函数)的简单映射
Django如何处理一个请求
- django加载ROOT_URLCONF指定的模块,并寻找可用的urlpatterns,它是django.conf.urls.url()实例的一个python列表
- django依次匹配每个URL,在与请求URL匹配的第一个url停下来
- 一旦其中的一个正则表达式匹配上,Django将导入并调用所给的视图,这个视图是一个简单的python函数或者类
- 如果没有匹配到正则表达式,或者如果过程中跑出异常,django将调用一个适当的错误处理视图:handler404,handler500,handler403,handler400
URLconf
URLconf是一个python模块,是一个URL模式(简单的正则表达式)到python视图(函数或者类)之间的映射
urlpatterns
- urlpatterns:是一个url()实例类型的python列表
- urlpatterns:中的每个正则表达式在第一次访问他们时被编译
url函数
url(regex,view,kwargs=None,name=None)
- regex:一个字符串(原始字符串)或简单的正则表达式
- view:是一个视图函数(类)或者as_view()的结果
- kwargs:传递额外的参数给视图
- name:url名称
include 语法
include(module,namespace=None,app_name=None) include(pattern_list) include((pattern_list,app_namespace),namespace=None) include((pattern_list,app_namespace,instance_namwespace))
- module:URLconf模块
- namespace:URL命名空间
- app_name:app的命名空间
- pattern_list:可迭代的djang.conf.urls.url()实例
- app_namespace:应用名称空间
- instance_namespace:实例的命名空间
实例:
- 主urls.py from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^dashboard/',include('dashboard.urls')), url(r'^admin/',admin.site.urls) ] - dashboard.urls配置文件 from django.conf.urls import url,include from . import views urlpatterns = [ url(r'^user/',include([ url(r'^list/$',view.userlist,name='user_list'), url(r'^info/$',view.userinfo,name='user_linfo'), url(r'^modify/',include([ url(r'status/$',view.modifystatus,name='modify_status') ])) ])) ] - dashboard.views视图 from django.shortcuts import render from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse('Index Page') def userList(request): return HttpResponse("User List Page") def userStatus(request): return HttpResponse("User Status Page") def UserInfo(request): return HttpResponse("User Info Page") - 请求方式 curl http://192.168.33.10:8080/dashboard/user/user_list/ curl http://192.168.33.10:8080/dashboard/user/modify/status/ curl http://192.168.33.10:8080/dashboard/user/modify/info/
url参数
若要从URL中捕获一个值,只需要在他周围放置一对圆括号
urlpatterns = [ url(r'^article/2003/$',views.special_case_2003,name='special_case_2003'), url(r'^article/(2004)/$',views.articleViewInfo,name='special_case_2003'), url(r'^user/([0-9]{4})/$',views.userInfo), url(r'^date/([0-9]{4})/([0-9]{2})/([0-9]{2})$',views.dateInfo) ]
对应的视图函数
def special_case_2003(request): return HttpResponse("2003") def articleViewInfo(request,*args,**kwargs): print(args) #位置参数获取 return HttpResponse('request2004') def userInfo(request,*args,**kwargs): return HttpResponse(json.dumps(args)) def dateInfo(request,*args,**kwargs): data = {"year":args[0],"month":args[1],"day":args[2]} # return HttpResponse(json.dumps(data)) return JsonResponse(data)
关键字参数
语法 (?P<name>pattern) - name是传给视图参数的名字, - pattern是一个正则表达式,也是关键字参数的值
实例:
url: url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$',views.articleInfoView) ------------------------- view视图函数 def articleInfoView(request,*args,**kwargs): return JsonResponse(kwargs)
请求方式:http://192.168.33.10:8080/dashboard/articles/2004/12/21/
url参数-额外参数
URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数
django.conf.urls.url() 函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数
url: url(r'users/(?P<name>[a-z]+)',views.users,{'extra_args':'hehehe'}) view视图函数: from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}), ] 请求地址:/blog/2005/ 调用函数:views.year_archive(request, year='2005',foo='bar')
url反向解析
django给每个URL取了一个名字,存储每个URL与name的映射关系
根据Django 视图的标识和将要传递给它的参数的值,获取与之关联的URL。这种方式叫做反向解析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'), ] ----------------------- 视图函数 from django.core.urlresolvers import reverse 模板: <a href="{% url 'news-year-artive' yearvar%}">{{ yaervar }}Archieve</a>