首页 > 其他 > 详细

Django路由系统

时间:2020-02-12 19:01:57      阅读:66      评论:0      收藏:0      [点我收藏+]

URL

1、URL的作用

  URL配置(URLconf)就像Django所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。我们就是以这种方式告诉Django,遇到哪个URL的时候,要对应执行哪个函数。

2、基本格式

# Django 2.0之前的版本的写法
from django.conf.urls import url

urlpatterns = [
     url(正则表达式, views视图,参数,别名),
]


# Django 2.0 版本及之后的写法                                                
from django.urls import path,re_path

urlpatterns = [
    path(articles/2003/, views.special_case_2003),
    path(articles/<int:year>/, views.year_archive),
    path(articles/<int:year>/<int:month>/, views.month_archive),
    path(articles/<int:year>/<int:month>/<slug:slug>/, views.article_detail),
]    

3、参数说明

  • 正则表达式:一个正则表达式字符串
  • views视图:一个可调用对象,通常为一个视图函数
  • 参数:可选的要传递给视图函数的默认参数(字典形式)
  • 别名:一个可选的name参数

4、基本配置

from django.conf.urls import url
from . import views

urlpatterns
= [ url(r^articles/2003/$, views.special_case_2003), url(r^articles/([0-9]{4})/$, views.year_archive), url(r^articles/([0-9]{4})/([0-9]{2})/$, views.month_archive), url(r^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$, views.article_detail), ]

5、注意事项

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

6、补充说明

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

举例:

默认开启:浏览器输入:http://127.0.0.1/index,最后转化为http://127.0.0.1/index/

设置为False:路劲后面不加斜杠,输入什么匹配什么。

普通传参方式

例:浏览器输入http://127.0.0.1:8000/group/?pk=10,后台获取并填充到html页面返回

urls.py

urlpatterns = [
    url(r^group/$, views.group)
]

views.py

def group(request):
    pk = request.GET.get(pk)
    return render(request,group.html,{"pk":pk})

html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>
<div>{{ pk }}</div>
</body>
</html>

结果:

技术分享图片

分组匹配传参

实质:按位置传参给视图函数

注意:url中捕获的参数,其参数类型永远为字符串类型。

例:浏览器访问并传入一个参数,分组方式进行捕获,并将捕获的参数填充到html页面中返回

urls.py文件

from django.conf.urls import url
urlpatterns = [
    url(r^group/(\d+), views.group)
]

views.py文件

def group(request, pk):
    return render(request,group.html,{"pk":pk})

group.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>
<div>{{ pk }}</div> 
</body>
</html>

浏览器输入:http://127.0.0.1:8000/group/10

返回页面

技术分享图片

 

 命名分组传参

实质:按关键字传参给视图函数

urls.py

urlpatterns = [
    url(r‘^group/(?P<name>\w+)$‘, views.group)
]

views.py

def group(request,name):
    return render(request,‘group.html‘,{"name":name})

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>
<div>{{ name }}</div>
</body>
</html>

浏览器输入:http://127.0.0.1:8000/group/laowang

结果:

技术分享图片

 反向解析

1、理解:简单来说就是可以给我们的URL匹配规则起个名字,一个URL匹配模式起一个名字。这样我们以后就不需要写死URL代码了,只需要通过名字来调用当前的URL。

2、前提:url规则后面设定那么属性

  如:

url(r^group/(?P<name>\w+)$, views.group,name=group)

3、应用

  • 在模板中:使用url模板标签。
  • 在Python 代码中:使用django.core.urlresolvers.reverse() 函数。
  • 在更高层的与处理Django 模型实例相关的代码中:使用get_absolute_url() 方法。

  注意:redirect()方法源码中使用了reverse()方法,所以可以直接在redirect()中使用反向解析名称。

4、例句:

  在模板中的应用

<a href="{% url ‘index‘ %}">首页</a>

 

  技术分享图片

 

   在视图函数中的应用

def group(request, name):
    return redirect(index) # 或者 redirect(reverse(‘index‘))

名称空间

 即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL。即:为不同app中的url加上app标识,便于系统找到准确的url

注意:settings文件中的ROOT_URLCONF参数配置,它指向Django项目的首先访问的名称空间,也可称为总空间,其他名称空间属于该空间的一部分子空间。 

settings.py文件
  ...
ROOT_URLCONF = CRM.urls
  ...

总空间urls.py

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

app01中的urls.py

from django.conf.urls import url
from app01 import views
 
app_name = app01
urlpatterns = [
    url(r^(?P<pk>\d+)/$, views.detail, name=detail)
]

app02中的urls.py

from django.conf.urls import url
from app02 import views
 
app_name = app02
urlpatterns = [
    url(r^(?P<pk>\d+)/$, views.detail, name=detail)
]

上述两个app中的url重复,如何找到我们想要的url呢?(根据namespace配置)

模板中的使用:

{% url app01:detail pk=12 pp=99 %}

views中的函数中使用

v = reverse(app01:detail, kwargs={pk:11}) # 注意:kwargs针对命名分组

名称空间下的反向解析及传参(综合)

1、url分发

url(r正则,include(app01.urls‘,namespance=‘app01‘))

2、URL反向解析

# 静态路由
url(r正则,views.func,name=func) # urls.py <a href="{% url ‘app01:func‘ %}"></a>   # 模板 return redirect(reverse(‘app01:func)) # 视图函数中
# 分组
url(r
login/(\d+),views.func,name=func) <a href="{% url ‘app01:func‘ pk %}"></a> return redirect(reverse(‘app01:func,args=(pk,)))
# 命名分组 url(r
login/(?P<pk>\d+),views.func,name=func) <a href="{% url ‘app01:func‘ pk=pk %}"></a> return redirect(reverse(‘app01:func,kwargs={pk:pk}))

Django路由系统

原文:https://www.cnblogs.com/kindvampire/p/12297641.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!