分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 网页技术

Django 路由层(urlconf)

发布时间:2023-09-06 02:28责任编辑:熊小新关键词:url

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 #必须导入viewsurlpatterns = [ ???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=‘2003‘, month=‘03‘, day=‘03‘)。

五 分发(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 adminfrom django.urls import path,re_pathfrom app01 import viewsurlpatterns = [ ???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,redirectfrom 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 reversedef index(request): ???return ?HttpResponse(reverse("app01:index"))

app02.views

from django.core.urlresolvers import reversedef index(request): ???return ?HttpResponse(reverse("app02:index"))

Django 路由层(urlconf)

原文地址:https://www.cnblogs.com/angle6-liu/p/10216728.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved