others linux服务器运维 django3 监控 k8s golang 数据库 大数据 前端 devops 理论基础 java oracle 运维日志

django路由urls的详细文档

访问量:1269 创建时间:2020-01-13

django.urls通用函数

为什么这里要说urls通用函数(也可以叫公用函数),这些函数是可以在django的views,template中引用的。

reverse()方向解析url函数

reverse()反向解析url路径函数,根据参数反向解析出路径,用于http的重定向,或者是在网页上解析a标签的链接。reverse()的参数可以是views函数,命令url的name值,如果这个url是有参数的,reverse()也可以增加参数。 reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None) 因为url的route与view函数一一对应,一个视图可以反向解析得到一个url路径。

reverse()案例:

注意:案例操作依托于上一章节创建的项目

#在views视图函数中使用reverse()函数,reverse()可以接受视图函数名称,或者命令url的name作为参数。
#先配置路由
[root@work1 mysite]# vim mysite/urls.py
from django.contrib import admin
from django.urls import path
from . import views
from myblog.views import art,old_art  #<--新增
urlpatterns = [
    path('art',art,name='art'),
    path('old_art',old_art,name='old_art'),   #<--新增
    path('',views.index,name='index'),
    path('admin/', admin.site.urls),
]
#配置myblog的视图,新增old_art视图,使用HttpResponseRedirect重定向到新的路由/art
[root@work1 mysite]# vim myblog/views.py
from django.shortcuts import render,HttpResponseRedirect  #<--新增
from .models import Programa,Article
from django.urls import reverse    #<--新增

def art(req):
    progs=Programa.objects.all()
    art=Article.objects.all()[0]
    return render(req,'art.html',locals())

def old_art(req):             #<--新增
    print(reverse('art'))     #<--新增,此处是使用name='art'的命名路由进行反向解析
    print(reverse(art))       #<--新增,此处使用上面的视图函数art反向解析,效果一样
    return HttpResponseRedirect(reverse('art')) #<--新增

#访问http://你的IP:PORT/old_art,可以查看跳转情况

配置art.html模板增加返回首页 ,访问http://你的IP:PORT/art查看效果

[root@work1 mysite]# vim templates/art.html 

<!DOCTYPE html>
<html>
<head>
<title>django</title>
</head>
<body>
<h3>{{art.title}}</h3>
<p>{{art.content}}</p>
<p>{{art.create_time}}</p>
<a href={% url 'index' %}>返回首页</a>  <!--新增加的一行-->
</body>
</html>
[root@work1 mysite]# vim mysite/urls.py 
from django.contrib import admin
from django.urls import path
from . import views
from myblog.views import art, old_art
urlpatterns = [
    path('art/<art_id>/',art,name='art'),    #<--修改url路由可以接受一个参数art_id
    path('old_art',old_art,name='old_art'),
    path('',views.index,name='index'),
    path('admin/', admin.site.urls),
]
#修改old_art视图;
[root@work1 mysite]# vim myblog/views.py 
from django.shortcuts import render,HttpResponseRedirect
from .models import Programa,Article
# Create your views here.
from django.urls import reverse
def art(req, art_id):
    progs=Programa.objects.all()
    art=Article.objects.get(pk=art_id)   #<--修改
    return render(req,'art.html',locals())

def old_art(req):
    print(reverse('art', args=('1',)))  
    print(reverse(art, args=('1',)))  #<--此处与上面作用相同,注意用法不同
    print(reverse(art, kwargs={'art_id':'1'})) #<--此处与上面作用相同,注意用法不同
    return HttpResponseRedirect(reverse('art', args=('1',)))

#访问http://你的IP:PORT/old_art查看效果

2、在template中使用:

[root@work1 mysite]# vim templates/art.html 

<!DOCTYPE html>
<html>
<head>
<title>django</title>
</head>
<body>
<h3>{{art.title}}</h3>
<p>{{art.content}}</p>
<p>{{art.create_time}}</p>
<a href={% url 'index' %}>返回首页</a>
<a href={% url 'art'  art_id='1' %}>当前页面是{% url 'art' art_id='1' %}</a> <!--新增-->
</body>
</html>
#访问http://你的IP:PORT/art/1查看效果

命名空间namespace

namespace可以用于对不同app的反向解析path时,区分app,防止不同app的视图解析出相同的path地址。

#修改url.py
[root@work1 mysite]# vim mysite/urls.py 

from django.contrib import admin
from django.urls import path, include  #<--add include
from . import views
from myblog.views import old_art
urlpatterns = [
    path('art/',include(('myblog.urls', 'myblog'), namespace='myblog')), #<--修改
    path('old_art/', old_art, name='old_art'),
    path('',views.index,name='index'),
    path('admin/', admin.site.urls),
]
#新增加myblog/urls.py,并编辑
[root@work1 mysite]# vim myblog/urls.py 

from django.urls import path, include
from . import views
urlpatterns = [
    path('<art_id>/', views.art, name='art'),
]
#修改视图文件
[root@work1 mysite]# vim myblog/views.py 

from django.shortcuts import render,HttpResponseRedirect
from .models import Programa,Article
# Create your views here.
from django.urls import reverse
def art(req, art_id):
    progs=Programa.objects.all()
    art=Article.objects.get(pk=art_id)
    return render(req,'art.html',locals())

def old_art(req):
    print(reverse('myblog:art', args=('1',)))  #<--需要变更的地方
    print(reverse('myblog:art', kwargs={'art_id':'1'}))  #<--需要变更的地方
    return HttpResponseRedirect(reverse('myblog:art', args=('1',))) #<--需要变更的地方
#修改template文件
[root@work1 mysite]# vim templates/art.html 

<!DOCTYPE html>
<html>
<head>
<title>django</title>
</head>
<body>
<h3>{{art.title}}</h3>
<p>{{art.content}}</p>
<p>{{art.create_time}}</p>
<a href={% url 'index' %}>返回首页</a>
<a href={% url 'myblog:art'  art_id='1' %}>当前页面是{% url 'myblog:art' art_id='1' %}</a> <!--修改此行代码-->
</body>
</html>
#访问你的http://你的IP:PORT/old_art和http://你的IP:PORT/art/1查看效果

reverse_lazy()

此函数用于url文件没加载时解析路径, 是reverse()的延迟加载版本,django有自身的模块加载顺序,有时没加载url配置,但是需要解析url,可以使用延迟加载. reverse_lazy(viewname, urlconf=None, args=None, kwargs=None, current_app=None)

resolve()

根绝url解析命名url_name,常用于调试。

用法

from django.urls import resolve resolve('/art/1/').func resolve('/art/1/').url_name

get_script_prefix()

用于获取网站的url前缀,整个项目都是在http://www.example.com/ 下的,get_script_prefix()用于获取url的前缀,set_script_prefix是用于设置前缀的函数,此函数了解即可。

django.urls常用函数(只在urls.py文件中使用)

函数名 解释用法
path() 不使用正则表达式,path(route, view, kwargs=None, name=None)
re_path() 用于url正则表达式匹配,re_path(r'^bio/(?P\w+)/$', views.bio, name='bio'),
include() 用于引用其他app的urls.py文件,用法include(module, namespace=None),include(module, namespace=None),include((pattern_list, app_namespace), namespace=None)
register_converter() 注册自定义的参数类型转换,通过url传递参数时可以定义参数转换为自己定义的类型
static() 不常用
url() django 1.*版本中使用的url(),支持正则表达式与re_path()功能相同,已经建议弃用url()函数
handler400 非debug模式下(settings.py中配置DEBUG = False,ALLOWED_HOSTS = ['*'),用于自定义400错误的页面,写在urls.py中末尾加一行handler404="app_name.views.your_func_name"
handler403 非debug模式下,用于自定义403错误的页面,写在urls.py中末尾加一行handler403="app_name.views.your_func_name"
handler404 非debug模式下,用于自定义404错误的页面,写在urls.py中末尾加一行handler404="app_name.views.your_func_name"
handler500 非debug模式下,用于自定义500错误的页面,写在urls.py中末尾加一行handler500="app_name.views.your_func_name"

正则表达式与url传参

在re_path函数中()括号中的表达式表示一个参数。传递给视图的参数如何接收使用可以查看python函数传参的相关文档,下面是部分例子:

正则表达式明细表:

登陆评论: 使用GITHUB登陆