URL配置(URLconf)就像Django所支撑网站的目录。URL与要为该URL调用的视图函数之间的映射表。

URLconf配置

样式:

from django.conf.urls import url

urlpatterns = [
url(正则表达式, views视图函数, 别名) # url实例化对象
]

详解:

  • 正则表达式:通过URL请求获得url地址,匹配是否有这个目录
  • views视图函数:一个可调用对象,通常为一个视图函数
  • 参数:可选的要传递给视图函数的默认参数(字典形式
  • 别名:一个可选的name参数
  • urlpatterns: 是url实例化对象的列表

正则表达式

django 1.11版本的语法:

from django.conf.urls import url
from appname import views urlpatterns = [
url(r'^login/(参数){}/$', views.login),
]

django 2.0版本的语法:

from django.urls import path,re_path
from appname import views urlpatterns = [
path('^login/<参数>/$', views.login),
re_path(r'^login/(参数){}/$', views.login),
]

注意

  1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
  2. 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
  3. 不需要添加一个前导的反斜杠因为每个URL都有。例如,应该是articles而不是/articles。
  4. 每个正则表达式前面的'r' 是可选的但是建议加上。

是否开启URL访问地址后面不为/跳转至带有/的路径的配置项

APPEND_SLASH=True

Django settings.py配置文件中默认没有APPEND_SLASH这个参数,但Django默认这个参数为APPEND_SLASH=True。其作用就是自动在网址结尾加'/'。如果在settings.py中设置了 APPEND_SLASH=False,此时我们再请求 http://www.example.com/blog 时就会提示找不到页面。

分组命名匹配

即在正则表达式中使用()来达成分组命名匹配,一旦使用分组命名匹配,则会对相应的视图函数进行传参

位置传参

简单的分组命名匹配是通过"()"完成的,但是分组匹配到的只会传给对应的视图函数,在这个视图函数中,以位置参数进行传参:

# urls.py中的url的配置
from django.conf.urls import url
from jingdian1956 import views urlpatterns = [
url(r'^a/([0-9]{4})/([0-9]{2})/$', views.position_args),
] # jingdian1956.views.py中的配置
from django.shortcuts import HttpResponse def position_args(request, arg1, arf2):
return HttpResponse('123====%s=====%s' % (arg1, arf2))

关键字传参

Python的正则表达式中,分组命名正则表达式组的语法是"(?Ppattern)",其中,name是组名,也是对应视图函数中的关键字参数的名字,两者一定要一致pattern是正则表达式的式子:

# urls.py中的url的配置
from django.conf.urls import url
from jingdian1956 import views urlpatterns = [
url(r'^test/(?P<book_id>[0-9]{0,})/$', views.book),
] # jingdian1956.views.py中的配置
from django.shortcuts import HttpResponse def book(request, book_id):
print(book_id)
return HttpResponse(book_id)

在实际应用中,使用分组命名匹配的方式可以让你的URLconf 更加明晰且不容易产生参数顺序问题的错误,但是有些开发人员则认为分组命名组语法太丑陋、繁琐。

至于究竟应该使用哪一种,你可以根据自己的喜好来决定。

URLconf的匹配位置

URLconf在请求的URL上查找,将它当做一个普通的Python字符串。不包括GET和POST参数以及域名。

例如,http://127.0.0.1/ 请求中,URLconf将查找/。

在http://127.0.0.1/?username=@@@&password=@@@ 请求中,URLconf 仍将查找/。

URLconf 不检查请求的方法。换句话讲,所有的请求方法 —— 同一个URL的POST、GET、HEAD等等 —— 都将路由到相同的函数。

# urls.py中的url的配置
from django.conf.urls import url
from jingdian1956 import views urlpatterns = [
url(r'^$', views.home),
] # jingdian1956.views.py中的配置
from django.shortcuts import HttpResponse, render def home(request):
username = request.GET.get('username') or request.POST.get('username')
if username:
return HttpResponse(username)
return render(request, '_form.html') # HTML中的form表单
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>form</title>
</head>
<body>
<div>
<form action="" name="form" method="post">
{% csrf_token %}
<div id="id1">
<input name="username" type="text" placeholder="请输入用户名">
</div>
<div id="id2">
<input type="password" name="password" placeholder="请输入密码">
</div>
<div id="id3">
<input type="submit" value="login">
</div>
</form>
</div>
<div>
<form action="" name="form" method="get">
{% csrf_token %}
<div id="id1">
<input name="username" type="text" placeholder="请输入用户名">
</div>
<div id="id2">
<input type="password" name="password" placeholder="请输入密码">
</div>
<div id="id3">
<input type="submit" value="login">
</div>
</form>
</div>
</body>
</html>

捕获的参数永远都是字符串

每个在URLconf中捕获的参数都作为一个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配方式。例如,下面这行URLconf 中:

url(r'^articles/(?P[0-9]{4})/$',views.year_archive),

传递到视图函数views.year_archive()中的year参数永远是一个字符串类型。

视图函数中指定默认值

# urls.py中
from django.conf.urls import url from . import views urlpatterns = [
url(r'^test/$', views.page),
url(r'^test/page(?P<num>[0-9]+)/$', views.page),
] # views.py中,可以为num指定默认值
def page(request, num="1"):
return HttpResponse(num)

在上面的例子中,两个URL模式指向相同的view-views.page-但是第一个模式并没有从URL中捕获任何东西。

如果第一个模式匹配上了,page()函数将使用其默认参数num=“1”,如果第二个模式匹配,page()将使用正则表达式捕获到的num值。

传递额外选项来查看功能

URLconfs有一个钩子,允许您将额外的参数作为Python字典传递给视图函数。

该django.conf.urls.url()函数可以采用可选的第三个参数,该参数应该是传递给视图函数的额外关键字参数的字典

from django.conf.urls import url
from . import views urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]

在这个例子中,对于请求/blog/2005/,Django将调用 。views.year_archive(request, year='2005', foo='bar')

在联合框架中使用此技术 将元数据和选项传递给视图。


处理冲突

可以使用URL模式捕获命名关键字参数,并在其额外参数字典中传递具有相同名称的参数。发生这种情况时,将使用字典中的参数而不是URL中捕获的参数。


将额外选项传递给include()

同样,您可以传递额外的选项include()。当您传递额外的选项时include(),包含的URLconf中的每一行都将传递额外的选项。

例如,这两个URLconf集在功能上是相同的:

设置一个:

# main.py
from django.conf.urls import include, url urlpatterns = [
url(r'^blog/', include('inner'), {'blogid': 3}),
] # inner.py
from django.conf.urls import url
from mysite import views urlpatterns = [
url(r'^archive/$', views.archive),
url(r'^about/$', views.about),
]

设置二

# main.py
from django.conf.urls import include, url
from mysite import views urlpatterns = [
url(r'^blog/', include('inner')),
] # inner.py
from django.conf.urls import url urlpatterns = [
url(r'^archive/$', views.archive, {'blogid': 3}),
url(r'^about/$', views.about, {'blogid': 3}),
]

请注意,无论行的视图是否实际接受这些选项为有效,额外选项将始终传递到包含的URLconf中的每一行。因此,只有在您确定所包含的URLconf中的每个视图都接受您传递的额外选项时,此技术才有用。

路由分发

可用于从重复使用单个模式前缀的URLconf中删除冗余。便于管理和维护

include其他的URLconfs

在任何时候,您urlpatterns都可以“include”其他URLconf模块。这基本上是“root”一组URL低于其他URL。

# 项目下的urls.py中的配置
from django.conf.urls import url, include
from jingdian1956 import urls urlpatterns = [
url(r'^sss/', include(urls)),
] # jingdian1956下的urls的配置
from django.conf.urls import url, include
from . import views urlpatterns = [
url(r'^$', views.second),
url(r'^11/$', views.secondOne),
url(r'^22/$', views.secondTwo),
] # jingdian1956下的views的配置
from django.shortcuts import HttpResponse def second(request):
return HttpResponse('second_menu') def secondOne(request):
return HttpResponse('second_one_menu') def secondTwo(request):
return HttpResponse('second_two_menu')

请注意,此示例中的正则表达式没有$ (字符串结尾匹配字符),但包含尾部斜杠。每当Django遇到include()(django.conf.urls.include())时,它都会删除与该点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf以进行进一步处理。

URL的反向解析

是一个DRY机制。除了其它有点,它还允许设计的URL可以自动更新而不用遍历项目的源代码来搜索并替换过期的URL。

获取一个URL最开始想到的信息是处理它视图的标识(例如名字),查找正确的URL的其它必要的信息有视图参数的类型(位置参数、关键字参数)和值。

Django提供了一个解决方案,使URL映射器成为URL设计的唯一存储库。您使用URLconf提供它,然后它可以在两个方向上使用:

  • 从用户/浏览器请求的URL开始,它调用正确的Django视图,提供它可能需要的任何参数以及从URL中提取的值。
  • 从标识相应的Django视图以及将传递给它的参数值开始,获取关联的URL。

第一个是我们在前面几节中讨论过的用法。第二个是所谓的URL反向解析,反向URL匹配,反向URL查找或简单的URL反转。

Django提供了用于执行URL反转的工具,这些工具匹配需要URL的不同层:

  • 在模板中:使用url模板标记。
  • 在Python代码中:使用该reverse()函数。
  • 在与处理Django模型实例的URL相关的更高级代码中:该get_absolute_url()方法。
# urls.py中的配置
from django.conf.urls import url
from fuck import views urlpatterns = [
url(r'^s/([0-9]{4})/$', views.fuck_, name='wtf'),
] # views.py中的配置

URL的命名空间

Django路由URL的更多相关文章

  1. Django路由(url)

    1.基本配置 from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', ...

  2. django中url路由配置及渲染方式

    今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...

  3. Django的URL路由系统

    一. URL配置 URL配置就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图之间的映射表.你就是以这种方式告诉Django,对于哪个URL调用的这段代码. 基本格式 from ...

  4. Django之URL路由系统

    一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...

  5. Django之url路由

    Django之url路由 url路由介绍 url路由是关联url及其视图函数关系的过程. 作用就是使views里面处理数据的函数与请求的url建立映射关系 url路由配置 Django的url路由配置 ...

  6. Django之URL控制器(路由层)

    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), 一.视图层路由配置系统 URL配置(URLconf)就像Django ...

  7. Django学习---路由url,视图,模板,orm操作

    Django请求周期 url ->  路由系统  ->函数或者类 -> 返回字符串 或者 模板语言 Form表单提交: 点击提交 -> 进入url系统  ->  执行函数 ...

  8. Python菜鸟之路:Django 路由补充1:FBV和CBV - 补充2:url默认参数

    一.FBV和CBV 在Python菜鸟之路:Django 路由.模板.Model(ORM)一节中,已经介绍了几种路由的写法及对应关系,那种写法可以称之为FBV: function base view ...

  9. Django 02 url路由配置及渲染方式

    Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...

随机推荐

  1. vue学习笔记——脚手架安装

    项目启动:npm run build 脚手架 vue cli vue cli --2 安装命令 #全局安装 npm install --global vue-cli #卸载vue-cli  npm u ...

  2. Javascript中的原型链,__proto__和prototype等问题总结

    1.js中除了原始数据类型 都是对象. 包括函数也是对象,可能类似于C++函数对象把 应该是通过解释器 进行()操作符重载或其他操作, 用的时候把它当函数用就行 但是实际上本质是一个对象 原型也是一个 ...

  3. webpack学习笔记(4)--webpack.config.js

    devtool参数 这个参数控制是否生成,以及如何生成source map,已经在官网的doc说明总结了. 下表总结了各个参数和使用的情况 devtool 构建速度 重新构建速度 生产环境 品质(qu ...

  4. NOIP2018提高组省一冲奖班模测训练(五)

    NOIP2018提高组省一冲奖班模测训练(五) http://www.51nod.com/Contest/ContestDescription.html#!#contestId=79 今天有点浪…… ...

  5. BA-Johnson楼控简介

  6. POJ 2019

    简单的RMQ,可我怎么写都WA.不明白,找了一个和我相似的贴过了,要赶着去外婆家. #include <iostream> #include <algorithm> #incl ...

  7. Boost.Asio c++ 网络编程翻译(16)

    TCP异步服务端 核心功能和同步服务端的功能类似,例如以下: class talk_to_client : public boost::enable_shared_from_this<talk_ ...

  8. 使用Jquery Ajax请求 下载压缩文件

    使用第三方组件:  ICSharpCode.SharpZipLib 给按钮绑定一个点击事件 后台处理: public ActionResult DownZip(string ids) { if (st ...

  9. Spark SQL概念学习系列之分布式SQL引擎

    不多说,直接上干货! parkSQL作为分布式查询引擎:两种方式 除了在Spark程序里使用Spark SQL,我们也可以把Spark SQL当作一个分布式查询引擎来使用,有以下两种使用方式: 1.T ...

  10. Ubuntu16.04下沙盒数据导入到 Neo4j 数据库(图文详解)

    不多说,直接上干货! 参考博客 http://blog.csdn.net/u012318074/article/details/72793914   (表示感谢)  前期博客 Neo4j沙盒实验申请过 ...