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
通过映射实现动态路由

相关文章:

  • 2021-10-28
  • 2022-02-10
  • 2021-06-13
  • 2022-12-23
  • 2021-05-23
  • 2021-06-20
猜你喜欢
  • 2021-11-12
  • 2021-10-05
  • 2021-10-28
  • 2021-12-05
  • 2021-06-18
  • 2022-02-28
  • 2022-02-23
相关资源
相似解决方案