Django 的路由层(URLconf)

URL配置(conf)就像是Django所支撑的网站的目录;

本质就是:URL与调用该URL执行的视图函数的映射表;

通俗的讲:就是用户使用哪个url,URL(conf)就需要告诉服务器执行哪个程序代码.

一  路由配置的简单使用

path :不能使用正则 ,path('路径',views.方法)

re_path :可以使用正则 ,re_path(r'正则表达式路径',views.方法)
from django.urls import path,re_path 

from app01 import views #必须导入views

urlpatterns = [
re_path(r'^articles/2003/$', views.special_case_2003), ]

二  路由配置使用注意事项

  •   若要从URL中获取一个值,只需要在对应的URL处放置一对圆括号
re_path(r'^articles/([0-9]{4})/$', views.year_archive) 
#传送给views时会携带小括号的数值,故需要相应的形参接受
  • 不需要添加一个前导的反斜杠,因为每个URL 都有。
re_path(r'/articles/$', views.year_archive)  #错误写法
  • 每个正则表达式前面的'r' 是可选的但是建议加上.

三 路由配置与views传值过程解析

'''
url配置:
re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), 对应url请求时候的传值过程 /articles/2005/03/ 请求将匹配列表中的第三个模式。
Django 将调用函数views.month_archive(request, '2005', '03')。 '''

四 有名分组

  1 基本格式

path('index/(? P<year> \d{4})',views.year)

对应views中

def year(request,year):

     return HttpResponse(year)

  2 传值方式---关键字传参

/articles/2003/03/03/ 
请求将调用函数views.article_detail(request, year='', month='', day='')。

五 分发(include)

  1、分发意义

  ULR解耦合。把每一个应用的视图函数放入自己的文件中,全局的urls只需要分配该路径属于某一个应用的视图函数。这样解决如果有一个程序出了问题不会影响到其他的应用的执行。

urlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^app01/', include('app01.urls')),
] 之后app01中的urls,再对匹配成功的url进行分发

六 反向解析

  1 使用场景

在模板中:使用url 模板标签。
     {%  url '别名' %}
在Python 代码中:使用from django.urls import reverse()函数
  rev_url=reverse('别名')
  

  2 html文件中的反向解析

项目.urls.py 设置别名 name='Index'

from django.contrib import admin
from django.urls import path,re_path from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index,name='Index'),
path('login/', views.login) ]

app01.views.py中 导入 inverse

from django.shortcuts import render,HttpResponse,redirect

from django.urls import reverse #导入方向解析函数

# Create your views here.

def index(request):

    return render(request,'index.html')

def login(request):
print(request.method)
if request.method=='GET':
return render(request,'login.html')
else:
re_path=reverse('Index') #反向解析
return redirect(request,re_path)

  3 html 文件中的反向解析

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'Log' %}" method="post">
{% csrf_token %} 用户名 <input type="text" name="user"> 密码 <input type="text" name="pwd">
<input type="submit">
</form>
</body>
</html>

  4 反向解析解析过程分析

  根据别名,在urlpatterns中找到对应的路径并返回

五 名称空间(解决反向解析出现找不到正确url的问题)

  命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

  由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回.

  我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。

project的urls.py

urlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^app01/', include("app01.urls",namespace="app01")),
re_path(r'^app02/', include("app02.urls",namespace="app02")),
]

app01.urls

urlpatterns = [
re_path(r'^index/', index,name="index"),
]

app02.urls

urlpatterns = [
re_path(r'^index/', index,name="index"),
]

app01.views 

from django.core.urlresolvers import reverse

def index(request):

    return  HttpResponse(reverse("app01:index"))

app02.views

from django.core.urlresolvers import reverse

def index(request):

    return  HttpResponse(reverse("app02:index"))

Django 路由层(urlconf)的更多相关文章

  1. 解析Django路由层URLconf

    目录: 一  Django中路由的作用 二  路由的分组 三  路由分发 四  反向解析 五  名称空间 六  Django2.0版的path 一.Django中路由的作用 URL配置(URLconf ...

  2. Django2.0路由层-URLconf

    目录 DJango2.0路由层-URLconf 概述 urlpatterns 实例 path转换器 自定义path转换器 使用正则表达式 命名组(有名分组) URLconf匹配请求URL中的哪些部分 ...

  3. 关于Django路由层简单笔记

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

  4. Django路由层与视图层

    表与表之间建关系 图书管理系统为例 书籍表 出版社表 作者表 三个表之间的关系: 考虑表之间的关系:换位思考 1.书籍和出版社是一对多,外键字段建立在书籍表中 2.书籍和作者是多对多, 需要建立第三方 ...

  5. Django路由层与视图层、pycharm虚拟环境

    一. Django路由层 路由层即对应项目文件下的urls.py文件.实际上每个APP中也可以有自己的urls.py路由层.templates文件夹及static文件夹.Django支持这么做,也为实 ...

  6. 关于Django中路由层(URL-conf)

    关于路由层 路由层其实就是项目中urls.py那个文件,那里面存放着url和视图函数的对应关系它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来 ...

  7. Django路由层

    路由层简单配置 urlpatterns = [ url(r'^admin/$', admin.site.urls), url(r'^articles/2003/$', views.special_ca ...

  8. Django --- 路由层(urls)

    目录 1.orm表关系如何建立 2.django请求生命周期流程图 3.urls.py路由层 4.路由匹配 5.无名分组 6.有名分组 7.反向解析 8.路由分发 9.名称空间 10.伪静态 11.虚 ...

  9. django 路由层 伪静态网页 虚拟环境 视图层

    路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态网页 虚拟环境 视图层 JsonResponse FBV与CBV 文件上传 项目urls.py下面 from app01 import ...

随机推荐

  1. redis 系列25 哨兵Sentinel (高可用演示 下)

    一. Sentinel 高可用环境准备 1.1 Sentinel 集群环境 环境 说明 操作系统版本 CentOS  7.4.1708  IP地址 172.168.18.200 网关Gateway 1 ...

  2. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  3. 行为驱动:Cucumber + Selenium + Java(二) - 第一个测试

    在上一篇中,我们搭建好了Selenium + Cucumber + Java的自动化测试环境,这一篇我们就赶紧开始编写我们的第一个BDD测试用例. 2.1 创建features 我们在新建的java项 ...

  4. iOS逆向开发(8):微信自动添加好友

    这一次,小程演示怎么让一个APP自动地运行,从而代替手工的操作.同样以"微信"以例,实现在一个微信群里面,对所有的成员,自动地一个一个地发出添加好友的请求. 知识点还是之前介绍的东 ...

  5. [十三]基础数据类型之AbstractStringBuilder

      String内部是一个private final char value[]; 也就意味着每次调用的各种处理方法,返回的字符串都是一个新的,性能上,显然.... 所以,对于可变字符序列的需求是很明确 ...

  6. Java提高班(五)深入理解BIO、NIO、AIO

    导读:本文你将获取到:同/异步 + 阻/非阻塞的性能区别:BIO.NIO.AIO 的区别:理解和实现 NIO 操作 Socket 时的多路复用:同时掌握 IO 最底层最核心的操作技巧. BIO.NIO ...

  7. 学习编写Dockerfile

    前言 我们学习docker的话,其主要目的还是要用来改变我们部署应用程序的传统习惯,达到解放生产力,解放人力的目的.这篇则自己来熟悉一下dockerfile常用命令.并且尝试改变下生产环境手动部署应用 ...

  8. ps 命令的十个简单用法

    注记 ps 命令有两种不同的语法风格 -- BSD 与 UNIX 两种风格.新手常常对这两种形式产生误解,因此我们有必要在这里作一个简单的说明: ps aux 与 ps -aux 是不同的,例如 -u ...

  9. .Net语言 APP开发平台——Smobiler学习日志:如何快速实现按钮组功能

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的“Smobil ...

  10. 浅谈_依赖注入 asp.net core

    1.1什么是依赖 我们先看下图 可以简单理解,一个HomeController类使用到了DBContext类,而这种关系是有偶然性,临时性,弱关系的,但是DBContext的变化会影响到HomeCon ...