Django路由系统
Django的路由系统让Django可以根据URI进行匹配,进而发送至特定的函数去处理用户请求。有点类似nginx的location功能。
Django的路由关系分为三种:普通关系、动态关系、分组分发。这三种关系都记录在urls.py中。
路由-普通关系
普通关系表示一个url对应一个函数,例如:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^detail/', views.detail),
]
路由-动态关系
动态关系表示通过正则的方式去实现动态匹配。例如:
urlpatterns = [
url(r'^detail/(\d+)/', views.detail), # 动态路由之:单参数的路由
url(r'^detail2/(\d+)/', views.detail2), # 动态路由之:多参数的路由
url(r'^detail3/(?P<p1>\d+)/(?P<x2>\d+)/', views.detail3), # 动态路由之:命名参数,两个参数分别被命名为p1和x2
url(r'^index/(\d+)/', views.index), # 分页显示
]
动态路由,也是动态关系的一种,动态路由其实通过映射也可以实现,需要自己来实现
主要代码实现 1、url.py 配置url映射 2、activator.py 根据url中获取的参数,通过反射调用指定 app/view.py 中的函数 如: http://127.0.0.1:9000/app01/index/ ==》 执行app01/view.py文件中的index函数 http://127.0.0.1:9000/app02/index/ ==》 执行app02/view.py文件中的index函数 http://127.0.0.1:9000/app01/login/ ==》 执行app01/view.py文件中的login函数 # 具体代码: # 总入口urls.py from django.conf.urls import include, url from django.contrib import admin from DynamicRouter.activator import process urlpatterns = [ # Examples: # url(r'^$', 'DynamicRouter.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), ('^(?P<app>(\w+))/(?P<function>(\w+))/(?P<page>(\d+))/(?P<id>(\d+))/$',process), ('^(?P<app>(\w+))/(?P<function>(\w+))/(?P<id>(\d+))/$',process), ('^(?P<app>(\w+))/(?P<function>(\w+))/$',process), ('^(?P<app>(\w+))/$',process,{'function':'index'}), ] # activator.py代码 from django.shortcuts import render_to_response,HttpResponse,redirect def process(request,**kwargs): '''接收所有匹配url的请求,根据请求url中的参数,通过反射动态指定view中的方法''' app = kwargs.get('app',None) function = kwargs.get('function',None) try: appObj = __import__("%s.views" %app) viewObj = getattr(appObj, 'views') funcObj = getattr(viewObj, function) #执行view.py中的函数,并获取其返回值 result = funcObj(request,kwargs) except (ImportError,AttributeError) as e: #导入失败时,自定义404错误 return HttpResponse('404 Not Found') except Exception as e: #代码执行异常时,自动跳转到指定页面 return redirect('/app01/index/') return result