对于高质量的web应用来说,使用简洁,优雅的URL路由是一个值得尊重的细节,Django可以随心所欲的设计URL,不受框架的约束 为了给一个应用设计URL,你需要一个Python模块,通常被称为URLconf,这个模块是纯粹的URL模式(简单的正则表达式)到python函数(视图函数)的简单映射 Django如何处理一个请求 1.决定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但是如果传入的HttpRequest对象具有urlconf属性(由中间件设置), 则其值将被用于代替ROOT_URLCONF设置。通俗的讲,就是你可以自定义项目入口url是哪个文件! 2.加载该模块并寻找可用的urlpatterns。 它是django.conf.urls.url()实例的一个列表。 3.依次匹配每个URL模式,在与请求的URL相匹配的第一个模式停下来。也就是说,url匹配是从上往下的短路操作,所以url在列表中的位置非常关键。 4.导入并调用匹配行中给定的视图,该视图是一个简单的Python函数(被称为视图函数),或基于类的视图。 视图将获得如下参数: (1)一个HttpRequest 实例。 (2)如果匹配的正则表达式返回了没有命名的组,那么正则表达式匹配的内容将作为位置参数提供给视图。 (3)关键字参数由正则表达式匹配的命名组组成,但是可以被django.conf.urls.url()的可选参数kwargs覆盖。 5.如果没有匹配到正则表达式,或者过程中抛出异常,将调用一个适当的错误处理视图。 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:实例的命名空间 include示例: # 主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 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‘}) 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.urls import reverse from django.http import HttpResponseRedirect def redirect_to_year(request): # ... year = 2006 # ... return HttpResponseRedirect(reverse(‘news-year-archive‘, args=(year,))) 模板中使用: <a href="{% url ‘news-year-artive‘ yearvar%}">{{ yaervar }}Archieve</a> 类视图 视图是一个可调用的对象,它接收一个请求然后返回一个响应,这个可调用对象可以不只是函数,Django提供一些可以用作视图的类 基于类的视图使用Python 对象实现视图,它提供除函数视图之外的另外一种方式 view 属性 http_method_names:添加未知的请求方法 方法 as_view():将类视图转换成可被调用的函数视图 dispatch(): 根据请求去匹配http_method_names下的对应函数去处理请求 http_method_not_allowed():返回405错误 实例 from django.views import View class IndexView(View): http_method_names = [‘get‘, ‘post‘, ‘put‘, ‘patch‘, ‘delete‘, ‘head‘, ‘options‘, ‘trace‘,‘list‘] def get(self,request,*args,**kwargs): return HttpResponse(IndexView) def post(self,request,*args,**kwargs): data = request.POST return HttpResponse(data) #需要将list方法加入 http_method_names,否则会经过,dispatch,http_method_not_allowed():返回405错误 def list(self,request,*args,**kwargs): return HttpResponse("ListView") 请求方式: In [27]: import requests In [28]: url = ‘http://192.168.33.10:8080/dashboard/index/‘ In [29]: res = requests.request(‘list‘,url) In [30]: res.content Out[30]: b‘ListView‘