使用django的时候,如果我们希望我们编写的view可以被正常访问,就需要配置url。

在django的官方文档中,url()的例子如下:

polls/urls.py

from django.conf.urls import url

from . import views

urlpatterns = [
url(r'^$', views.index, name='index'),
]

mysite/urls.py

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

首先给我们展示了,如何将 app 中的 url.py 加入到 project的 url.py中

如上所示,通过使用导入的 include 就可以帮我们做到,

现在我们重点说一下 url() :

url() 函数具有四个参数: regex(必需)、view(必需)、kwargs(可选)、name(可选)

url(regex, view, kwargs=None, name=None)

url()参数:regex

  这里其实是一个正则表达式,对应了URL模式。Django 从第一个正则表达式开始,依次将请求的URL 与 每个正则表达式进行匹配,知道找到匹配的那个位置。需要注意的是,这里的正则表达式不会匹配URL中 POST/GET 的参数和域名。例如:在http://www.epython.cn/myapp/ 请求中,URLconf 查找的是 myapp/ ;在http://www.epython.cn/myapp/?page=3 请求中,URLconf 查找的也是 myapp/ 。

url()参数:view

  当django 找到一个匹配的正则表达式时,就会调用 view参数 指定的 视图函数,并将HttpRequest对象作为第一个参数,从正则表达式中 ”捕获“ 的其他值作为其他参数,传入到该试图函数中。如果正则表达式使用简单的捕获方式,值将作为位置参数传递;如果使用命名的捕获方式,值将作为关键字参数传递。

from django.conf.urls import url
from account import views urlpatterns = [
url(r'^login/', views.login), # 第一个参数是regex , 第二个参数是view
url(r'^logout/', views.logout),
]

url()参数:kwargs

url(r'^login/', views.login, {'summary': True})

对应的视图函数

def login(request, summary):
print(summary)
return HttpResponse("Login Func.")

url()参数:name

  name用来命名你的URL,这样你就可以在django的其他地方,尤其是模板中,通过名称来明确的引用这个URL,这个强大的特性可以让你,仅仅修改一个文件就可以改变全局的URL模式。

url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),

  name 可以简单的理解为给前面的regex参数起了一个别名,在regex 改变后,我们不用修改 Template 、views 或 model中的代码。

  来看一个简单的例子:

#  url.py
url(r'^plus/(\d+)/(\d+)/$', views.plus, name='plus'), # index.html
<a href="/plus/12/24/">计算 12+24</a>

现在如果我们需要计算的话只需要访问 /plus/12/24/ 就可以了。

有一天我们需要改变一下url 将  /plus/12/24/ 修改成  /12_plus_24/, 这样就会导致我们修改改了url.py之后,对应的Template、views 或 model中对应的地址也需要修改,需要修改的地方越多,我们付出的代价也就越大。

而使用通过 name 参数,我们就可以解决这个问题。

url.py
url(r'^/(\d+)_plus_(\d+)/$', views.plus, name='plus'), index.html
<a href="{% url 'plus' 12 24 %}">计算 12+24</a>

注意: 从第一种方式 变成第二种方式,name 不能修改。

URL中的namespace

在真实的django项目中, 可能会有多个app(五个、十个、或者更多);这个时候需要区分URL中的app的名字。例如,polls 应用具有一个detail 视图,相同项目中的博客应用可能也有这样一个视图。当使用模板标签{% url %}时,人们该如何做才能使得Django知道为一个URL创建哪个应用的视图?

这个时候就需要用到URLconf中的 namespace 。

#  mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin urlpatterns = [
url(r'^polls/', include('polls.urls', namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
]

最初的index.html

#  polls/templates/polls/index.html
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

修改后的index.html

#  polls/templates/polls/index.html
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>

Django中url()的更多相关文章

  1. Django中url匹配规则的补充

    Django中url匹配规则是在urls.py文件中配置的. 1.关于正则匹配优先级 在url匹配列表中,如果第一条和第二条同时满足匹配规则,则优先匹配第一条. 在url匹配列表中,如果第一条为正则模 ...

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

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

  3. django中url 和 path 的区别

    django中 url 和 path 都是配置路径,有什么不同? django.urls path django.conf.urls  url path 与 url 是两个不同的模块,效果都是响应返回 ...

  4. django 中url与path小记

    1. 在django 2.0中增加了一些新的特性 更简单的URL路由语法 (Simplified URL routing syntax) admin应用的针对移动设备的优化改进(Mobile-frie ...

  5. Django——URL详解/Django中URL是如何与urls文件匹配的

    URL标准语法 protocol://hostname[:port]/path/[:parameters][?query]#fragment https://i.cnblogs.com/EditPos ...

  6. Django 中url补充以及模板继承

    Django中的URL补充 默认值 在url写路由关系的时候可以传递默认参数,如下: url(r'^index/', views.index,{"name":"root& ...

  7. Django中url使用命名空间的错误

    出的错误: 1. Reverse for 'llist' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) ...

  8. Django中URL有关

    django 模板中url的处理   在模板中直接添加‘/home’这样的链接是十分不推荐的,因为这是一个相对的链接,在不同网页中打开可能会返回不一样的结果. 所以推荐的是 1 <a href= ...

  9. django中url,静态文件,POST请求的配置 分类: Python 2015-06-01 17:00 789人阅读 评论(0) 收藏

    平时使用的是pycharm,所以这篇文章主要也是使用pycharm默认创建的django项目为基础进行讲解.项目目录如下图: 1.URL的配置 当创建好项目后,运行项目就可以看到django默认的页面 ...

  10. Django中url的反向查询

    明确几个概念: application namespace:   正在部署的app的名称,一个app的多个实例应该具有相同的application namespace.   可以通过在URLconf模 ...

随机推荐

  1. 【贪心算法】POJ-3190 区间问题

    一.题目 Description Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one wil ...

  2. NodeJs实现客户端登陆

    nodejs的api中有一个process进程对象,process 对象是一个 global (全局变量),提供有关信息,控制当前 Node.js 进程.作为一个对象,它对于 Node.js 应用程序 ...

  3. sitemesh入门

    今天在公司用到了sitemesh这个框架. 网上的资料已经有很多了.  在此就不做具体介绍了, 仅仅做个笔记. sitemesh是一种模板框架,是为了解决页面重复代码而设计的. 设计思想 siteme ...

  4. 关于SVM数学细节逻辑的个人理解(二):从基本形式转化为对偶问题

    第二部分:转化为对偶问题进一步简化 这一部分涉及的数学原理特别多.如果有逻辑错误希望可以指出来. 上一部分得到了最大间隔分类器的基本形式:   其中i=1,2,3...m 直接求的话一看就很复杂,我们 ...

  5. FastReport 变量列表使用

    使用报表变量时,引用“frxVariables”单元. 变量定义在“TfrxVariable” 类: TfrxVariable = class(TCollectionItem) published p ...

  6. linux下安装java jdk

    第一步:查看java对应版本               yum search java 我自己装的是1.8版本的java包 第二步:装java包 yum install java-1.8.0-ope ...

  7. 初识Linq to Entity

    技术介绍: LINQ(Language Integrated Query,语言集成查询)是一组用于C#和VB.NET语言的扩展,它允许编写C#或者VB.net代码,以与查询数据库相同的方式操作内存数据 ...

  8. C++ STL 常用查找算法

    C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...

  9. BZOJ 2732: [HNOI2012]射箭

    2732: [HNOI2012]射箭 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2532  Solved: 849[Submit][Status] ...

  10. 3Sum - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 3Sum - LeetCode 注意点 和two sum那道题不一样的是这题返回的是具体的数字,不是下标 解法 解法一:将每个数字都作为target,剩下 ...