Django架构中路由系统使用

本文探讨了如何在Django中利用正则表达式、参数传递和反射机制实现灵活的URL路由,包括单个、动态和分类路由,以及视图函数的高效分发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据HTTP请求中的URL,查找路由表,将HTTP请求分发到 不同的视图去处理:

1、单一路由对应

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

2、基于正则的路由

url(r'^index/(\d*)', views.index),
url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),

3、添加额外的参数,默认的参数

 url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}), 

4、为路由映射设置名称

url(r'^home', views.home, name='h1'),
url(r'^index/(\d*)', views.index, name='h2'),

5、根据app对路由规则进行分类

可以创建多个路由,分发到其他路由使用include()

 url(r'^web/',include('web.urls')), 

动态url:

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    #url----function
    '''
    url(r'^index/',index ),
    url(r'^Login/',login ),
    #配置动态的URL,因为此时不确定我会产生多少条url,此时在函数中需要加上一个捕获的参数,id,用来捕获用户的id
    #尖括号里面的值需要与业务逻辑层次上对应,模板格式
    url(r'^list/(?P<name>\d*)/(?P<id>\d*)/',list ),
    #设置默认值
    url(r'^list/(?P<name>\d*)/',list ,{'id':222}),
    '''


]

分类的url:

urlpatterns = [
    url(r'^admin/', admin.site.urls),




    #url----file
    #file-----url>function 类似于路径映射,本来是单纯的由jango里面的urls(全局的url)统一的配置路由信息,但是如果我的app多了之后这就会显得有点乱,所以此时可以指定URL路径,由各自的APP去执行url,每个路径多加了一个分类的路径
    url(r'^ad/', include('ad.urls')),
    url(r'^web/',include('web.urls')),

]

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

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

from django.conf.urls import patterns, include, url
from django.contrib import admin
from DynamicRouter.activator import process

urlpatterns = patterns('',
    # 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'}),
)

在同目录下创建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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值