• Django路由系统


    django路由系统

     

    简而言之,django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系。使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从而返回给客户端http页面数据。

     

     

     

    一、最基础的url映射

    urls.py

    1 from django.conf.urls import include, url
    2 from django.contrib import admin
    3 from app01 import views
    4 
    5 urlpatterns = [
    6     url(r'^admin/', admin.site.urls),
    7     url(r'^index/$', views.index),
    8   ]

    1、先从创建的app下的views.py面定义处理数据的函数

    2、在urls.py里导入views

    3、在urlpatterns里写入一条url与处理函数的l映射关系

    4、url映射一般是一条正则表达式,“^” 字符串的开始,“$“ 字符串的结束

    5、当写成”^$“时,不输入任何url时不会在返回黄页,而是返回后面函数里对应的页面。一般这一条会写在url的最后。如:

    1 url(r'^$', views.index),

     

     

    二、按照顺序放置的动态路由

    1 urlpatterns = [
    2     url(r'^user/(d+)$', views.user),
    3     url(r'^user_list/(d+)/(d+)$', views.user_list),
    4 
    5 ]

    ^user/(d+)$
    相对应的url是: ”http://127.0.0.1/uer/8“ (d+)是匹配任意的数字,在分页时灵活运用。

     

    ^user_list/(d+)/(d+)$

    相对应的url是: ”http://127.0.0.1/uer/8/9“,匹配到的数字会以参数的形式按照顺序传递给views里面相对应的函数

    1 def user_list(request,nid,nid2):
    2 
    3     return HttpResponse(nid+nid2)

     

    三、传参形式的动态路由

    利用正则表达式的分组方法,将url以参数的形式传递到函数,可以不按顺序排列。

    1 urlpatterns = [
    2 
    3     url(r'^user_list/(?P<v1>d+)/(?P<v2>d+)$',views.user_list),
    4 
    5 ]

    (?P<v1>d+)

    正则表达式的分组,相当于一个字典, key=v1, value=d+。 {"v1":"d+"}

    然后将此参数传递到views里对应的函数,可以不按照顺序

    1 def user_list(request,v2,v1):
    2 
    3     return HttpResponse(v1+v2)

    参数v1 = (?P<v1>d+)

    参数v2 = (?P<v2>d+)

     

     

    四、根据不同的app来分发不同的url


    如果一个项目下有很多的app,那么在urls.py里面就要写巨多的urls映射关系。这样看起来很不灵活,而且杂乱无章。

    我们可以根据不同的app来分类不同的url请求。

    首先,在urls.py里写入urls映射条目。注意要导入include方法

    1 from django.conf.urls import include, url
    2 from django.contrib import admin
    3 
    4 urlpatterns = [
    5 
    6     url(r'^app01/', include('app01.urls')),
    7 
    8 ]

    这条关系的意思是将url为”app01/“的请求都交给app01下的urls去处理

    其次,在app01下创建一个urls.py文件,用来处理请求的url,使之与views建立映射

    1 from django.conf.urls import include, url
    2 from app01 import views
    3 
    4 urlpatterns = [
    5 
    6     url(r'index/$', views.index),
    7 
    8 ]

    想对于url请求为:  "http://127.0.0.1/app01/index/"

     

     

     

    五、通过反射机制,为django开发一套动态的路由系统

    在urls.py里定义分类正则表达式

     1 from django.conf.urls import patterns, include, url
     2 from django.contrib import admin
     3 from DynamicRouter.activator import process
     4 
     5 urlpatterns = patterns('',
     6     # Examples:
     7     # url(r'^$', 'DynamicRouter.views.home', name='home'),
     8     # url(r'^blog/', include('blog.urls')),
     9 
    10     url(r'^admin/', include(admin.site.urls)),
    11     
    12     
    13     ('^(?P<app>(w+))/(?P<function>(w+))/(?P<page>(d+))/(?P<id>(d+))/$',process),
    14     ('^(?P<app>(w+))/(?P<function>(w+))/(?P<id>(d+))/$',process),
    15     ('^(?P<app>(w+))/(?P<function>(w+))/$',process),
    16     ('^(?P<app>(w+))/$',process,{'function':'index'}),
    17 )

     

    在同目录下创建activater.py

    #!/usr/bin/env python
    #coding:utf-8
    
    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),e:
            #导入失败时,自定义404错误
            return HttpResponse('404 Not Found')
        except Exception,e:
            #代码执行异常时,自动跳转到指定页面
            return redirect('/app01/index/')
        
        return result
        

     

  • 相关阅读:
    web.xml中<security-constraint>安全认证标签说明
    TPS与QPS
    Idea无法加载主类
    动态历史
    领导之路
    aven依赖分析,jar包冲突解决利器intellij idea插件Maven Helper强烈建议安装
    Maven 电脑每次重启 mvn -v 都显示 不是命令
    IntelliJ IDEA 最新版 2019.1 安装与激活
    @Param注解的使用
    Mybatis通用Mapper介绍与使用
  • 原文地址:https://www.cnblogs.com/chenchao1990/p/5278900.html
Copyright © 2020-2023  润新知