Django之路由配置系统(urlConfig)

时间:2022-12-18 19:05:47

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

django 项目中的url规则定义放在project 的urls.py目录下,
默认如下:

from django.conf.urls import url
from django.contrib import admin urlpatterns = [
url(r'^admin/', admin.site.urls),
]

url()函数可以传递4个参数,其中2个是必须的:regex和view,以及2个可选的参数:kwargs和name。下面是具体的解释:

  • regex:
    regex是正则表达式的通用缩写,它是一种匹配字符串或url地址的语法。Django拿着用户请求的url地址,在urls.py文件中对urlpatterns列表中的每一项条目从头开始进行逐一对比,一旦遇到匹配项,立即执行该条目映射的视图函数或二级路由,其后的条目将不再继续匹配。因此,url路由的编写顺序至关重要!

需要注意的是,regex不会去匹配GET或POST参数或域名,例如对于https://www.example.com/myapp/,regex只尝试匹配myapp/。对于https://www.example.com/myapp/?page=3,regex也只尝试匹配myapp/。

如果你想深入研究正则表达式,可以读一些相关的书籍或专论,但是在Django的实践中,你不需要多高深的正则表达式知识。

性能注释:正则表达式会进行预先编译当URLconf模块加载的时候,因此它的匹配搜索速度非常快,你通常感觉不到。

  • view:
    当正则表达式匹配到某个条目时,自动将封装的HttpRequest对象作为第一个参数,正则表达式“捕获”到的值作为第二个参数,传递给该条目指定的视图。如果是简单捕获,那么捕获值将作为一个位置参数进行传递,如果是命名捕获,那么将作为关键字参数进行传递。

  • kwargs:
    任意数量的关键字参数可以作为一个字典传递给目标视图。

  • name:
    对你的URL进行命名,可以让你能够在Django的任意处,尤其是模板内显式地引用它。相当于给URL取了个全局变量名,你只需要修改这个全局变量的值,在整个Django中引用它的地方也将同样获得改变。这是极为古老、朴素和有用的设计思想,而且这种思想无处不在。

1.最基础映射

用户访问http://127.0.0.1:8000/index 然后后端使用index()函数处理

urls.py

from django.conf.urls import include, url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/$', views.index),
  ]

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

2、在urls.py里导入views

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

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

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

2.按照顺序放置的动态路由

可以使用正则来匹配URL,将一组url使用一条映射搞定

urlpatterns = [
url(r'^host/(\d+)$', views.host),
url(r'^host_list/(\d+)/(\d+)$', views.host_list),
]

^host/(\d+)$
相对应的url是: ”http://127.0.0.1/host/2“ (\d+)是匹配任意的数字,在分页时灵活运用。
在views.host中需要指定一个形式参数来接受(\d+)$ 的值

 def user_list(request,id):
return HttpResponse(id)

^host_list/(\d+)/(\d+)$

相对应的url是: ”http://127.0.0.1/host/8/9“,匹配到的数字会以参数的形式按照顺序传递给views里面相对应的函数
在views.host_list中需要指定两个形式参数,注意:此参数的顺序严格按照url中匹配的顺序

 def user_list(request,hid,hid2):
return HttpResponse(hid+hid2)

3.传参形势的路由

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

urlpatterns = [
url(r'^user_list/(?P<v1>\d+)/(?P<v2>\d+)$',views.user_list),
] (?P<v1>\d+) 正则表达式的分组,相当于一个字典, key=v1, value=\d+。 {"v1":"\d+"}

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

def user_list(request,v2,v1):

     return HttpResponse(v1+v2)
参数v1 = (?P<v1>\d+) 参数v2 = (?P<v2>\d+)

4.根据不同的app来分发不同的url

如果一个项目下有很多的app,那么在urls.py里面就要写巨多的urls映射关系。这样看起来很不灵活,而且杂乱无章。
我们可以根据不同的app来分类不同的url请求。
首先,在urls.py里写入urls映射条目。注意要导入include方法

from django.conf.urls import include, url
from django.contrib import admin urlpatterns = [ url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')), ]

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

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

from django.conf.urls import include, url
from app01 import views urlpatterns = [ url(r'index/$', views.index), ]

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

5.通过反射机制,为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

6.FBV和CBV

所谓FBV和CBV 是指url 和view的对应关系

  • FBV function base view /url/ --> 函数
  • CBV class base view /url/ -->类

上述都是FBV的方式。下面对CBV进行说明:

  • urls.py
url(r'^cbv',views.CBVtest.as_view()),
  • views.py
class CBVtest(View):
def dispatch(self, request, *args, **kwargs):
print("类似装饰器:before")
result = super(CBVtest, self).dispatch(request, *args, **kwargs)
print("类似装饰器:after")
return result def get(self, request): # 定义get方法,get请求执行这个方法
print(request.method)
return HttpResponse('cbvget') def post(self, request): # 定义post方法,post请求执行这个方法
print(request.method)
return HttpResponse('cbvpost')

Django之路由配置系统(urlConfig)的更多相关文章

  1. Django路由配置系统,视图函数

    一.路由配置系统(URLconf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个 ...

  2. Django路由配置系统、视图函数

    一.路由配置系统(URLconf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个 ...

  3. Django视图层之路由配置系统(urls)

    视图层之路由配置系统(urls) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个U ...

  4. django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统

    Django基础二 request request这个参数1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过1. request.method GET,POST ...2. reques ...

  5. Django基础--Django基本命令、路由配置系统(URLconf)、编写视图、Template、数据库与ORM

    web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构. 使用框架可以帮你快速开发特定的系统. 简单地说,就是你用别人搭建好的舞台来做表演. 尝试搭建一个简单 ...

  6. Django之路由分发系统

    web的基本工作流程 首先,我们先来思考一下我们平常在上网浏览网页时候的场景,大致就是打开一个web浏览器,输入某一个网站的地址,然后转到该网址,在浏览器中得到该网址的页面.从这个场景中我们可以抽象出 ...

  7. django 简单路由配置

    Django==2.0.1 版本路由配置: 1.在manage.py同级目录下新建一个应用app1 在app1下新建urls.py文件,定义一个app1的空白路由: from django.urls ...

  8. 荣誉墙项目day26 django 项目路由配置

    项目路由配置文件包括:配置目录里的urls.py文件和各个app目录里的urls.py文件 1.include()——从项目主路由分配到各APP主路由 from django.conf.urls im ...

  9. 路由配置系统&lpar;URLconf&rpar;

    URL配置(URLconf)就像Django所支撑网站的目录. 它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这种方式告诉Django,对于URL(1)调用代码(1), 对于URL ...

随机推荐

  1. Anliven - To-Do List

    2016 - December Name Type Start Deadline Status Output Comments Last Review SQL必知必会(第4版) Book 2016-1 ...

  2. Windows Store App 全球化:引用类库资源

    前面几个小节介绍了如何引用自身项目的资源,而有时在应用程序开发过程中可能需要访问其他项目中的资源.例如,当几个人或十几个人一起设计一个解决方案时,每个人的工作都是不同的,编写的项目也是不同的,但是每个 ...

  3. 一次千万级别的SQL查询简单优化体验

    背景:从两张有关联的表查询数据,A表数据量1400万,B表数据量8000万.A与B通过ID逻辑关联,没有实际的外键.B表是后来扩展出来的. 问题:根据某个ID查询时超时,运行时跑不出结果. 原因:使用 ...

  4. cxf restful

    Restful 服务端 1 创建好pojo.dao.service, dao进行数据库操作,service提供服务 @Path("/roomservice") @Produces( ...

  5. 利用AuthorizeAttribute属性简单避免 MVC 中的跨域攻击

    跨域攻击---自然来路页面和目标页面不在同一个域下,所以直接判断来路域和当前自己的域就可以了. 可以广泛应用于表单提交,ajax调用或者某些不想让用户直接输入网址看到的页面 [csharp] view ...

  6. Android 图片三级缓存之内存缓存(告别软引用&lpar;SoftRefrerence&rpar;和弱引用&lpar;WeakReference&rpar;)

    因为之前项目同事使用了图片三级缓存,今天整理项目的时候发现同事还是使用了软引用(SoftRefrerence)和弱引用(WeakReference),来管理在内存中的缓存.看到这个我就感觉不对了.脑海 ...

  7. 从腾讯QQgame高性能服务器集群架构看&ldquo&semi;分而治之&rdquo&semi;与&ldquo&semi;自治&rdquo&semi;等分布式架构设计原则

    转载:http://space.itpub.net/17007506/viewspace-616852 腾讯QQGame游戏同时在线的玩家数量极其庞大,为了方便组织玩家组队游戏,腾讯设置了大量游戏室( ...

  8. 浅显易懂的谈一谈python中的装饰器!!

    hello大家好~~我是稀里糊涂林老冷,一天天稀里糊涂的. 前一段时间学习了装饰器,觉着这东西好高大上哇靠!!哈哈,一定要总结一下,方便以后自己查阅,也希望帮助其他伙伴们共同进步! 装饰器: 大家可以 ...

  9. CI框架在模型中切换读写库和读写库

    如果你想在控制器中切换在application/config/database.php中配置好的数据库group,那么你可以参考这篇博客:CI框架在控制器中切换读写库和读写库 如果你是希望在模型中切换 ...

  10. bzoj千题计划310:bzoj5285&colon; &lbrack;Hnoi2018&rsqb;寻宝游戏&lpar;思维题&plus;哈希&rpar;

    https://www.lydsy.com/JudgeOnline/problem.php?id=5285 |0 和 &1 没有影响 若填‘|’,记为0,若填‘&’,记为1 先只考虑最 ...