django之反向解析和命名空间
背景:当我们页面中存放的请求路径与url文件中的url一致时,如果url改了是不是所有的请求路径都要跟着改?显然不现实,这里我们就要用到反向解析。
如下图所示,输入url后会跳转到登录页面,输入用户名密码后跳转到欢迎页面。
# 在公共项目中urls中的url from django.contrib import admin
from django.urls import path, re_path, include
from website import views urlpatterns = [
path('admin/', admin.site.urls),
path('data/', views.data),
path('login./', views.login),
] # 在应用中views文件中的视图函数
from django.shortcuts import render, HttpResponse def login(request):if request.method == 'GET':
return render(request, 'login.html')
elif request.method == 'POST':
if request.POST.get('user') == 'admin' and request.POST.get('pwd') == '':
return HttpResponse('welcome to world')
else:
return HttpResponse('用户名或密码错误')
# 在公共项目统一目录层建的templates层存放页面文件 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/static/js.js"> </script>
</head>
<body> <h4>
登录页面
</h4>> <form action="http://127.0.0.1:8000/login/" method="post">
用户名<input type="text" name="user">
密码<input type="password" name="pwd">
<input type="submit">
</form>
</body>
</html>
现在我需要把公共项目中的url改变,再次点击登录后报错了
urlpatterns = [
path('admin/', admin.site.urls),
path('data/', views.data),
path('login.html/', views.login),
]
报错如图所示:

因为我们登录时action中的路径找不到http://127.0.0.1:8000/login/路径,现在已经被改成了http://127.0.0.1:8000/login.html/,此时难道我们需要一直改这个路径吗?不存在的!
接下来到了反向解析的重点
在公共项目中的urls文件中把url加一个属性name
from django.contrib import admin
from django.urls import path, re_path, include
from website import views urlpatterns = [
path('admin/', admin.site.urls),
path('data/', views.data),
path('login.html/', views.login, name='hello')
]
在html中把action路径改为{{% url 'hello' %}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/static/js.js"> </script>
</head>
<body> <h4>
登录页面
</h4>> <form action="{% url 'hello' %}" method="post">
用户名<input type="text" name="user">
密码<input type="password" name="pwd">
<input type="submit">
</form>
</body>
</html>
此时再次去访问页面就不会报错啦!
还有个反向解析办法就是导入reverse模块
在公共项目中的urls文件中
from django.contrib import admin
from django.urls import path, re_path, include
from website import views urlpatterns = [
path('admin/', admin.site.urls),
path('login/', views.login, name='hello'), # 路由配置 路径--------》视图函数 re_path(r'^articles/2003/', views.special_case_2003, name='one'),
re_path(r'^articles/([0-9]{4})/$', views.year_archive, name='two'),
re_path(r'^articles/(?P<y>[0-9]{4})/(?P<m>[[0-9]{2})/$', views.month),
在应用中的views文件中的视图函数
from django.shortcuts import render, HttpResponse
import time
from django.urls import reverse # Create your views here. def special_case_2003(request): return HttpResponse('special_case') def year_archive(request, year): return HttpResponse(year) def month(request, m, y): return HttpResponse(y+'+'+m) def login(request): print(reverse('one')) # reserve中放的是路径中的name
print(reverse('two', args=(4099,))) # 当有元祖时参数必须放在args中 if request.method == 'GET':
return render(request, 'login.html')
elif request.method == 'POST':
if request.POST.get('user') == 'admin' and request.POST.get('pwd') == '':
return HttpResponse('welcome to world')
else:
return HttpResponse('用户名或密码错误')
输入ur:http://127.0.0.1:8000/login/后,查看reserve中的路径为下图所示

这样就把反向解析的路径获取到了 !!!
此时有个问题就来了,如果在两个应用中的url相同且对应的name也相同,那会获取到哪个路径呢?经测试得出会获取到第二个,因为第一个被第二个覆盖了。那怎么解决呢?
如下图所示
# 公共项目中的url from django.contrib import admin
from django.urls import path, re_path, include
from website import views urlpatterns = [
path('admin/', admin.site.urls),
path('data/', views.data),
path('login/', views.login, name='hello'), # 路由配置 路径--------》视图函数 # 分发
re_path(r'website/', include(('website.urls', 'website'))),
re_path(r'website1/', include(('website1.urls', 'website1')))
# 在第一个项目中的url文件 from django.urls import path, re_path
from website import views urlpatterns = [ # 路由配置 路径--------》视图函数 re_path('index', views.index, name='index') ] # 在第一个项目中的views文件 from django.shortcuts import render, HttpResponse
from django.urls import reverse def index(request): return HttpResponse(reverse('website:index')) 这里返回第一个项目的index
# 在第二个项目中的url文件 from django.urls import path, re_path
from website1 import views urlpatterns = [ # 路由配置 路径--------》视图函数 re_path('index', views.index, name='index') ] # 在第二个项目中的views文件 from django.shortcuts import render, HttpResponse
from django.urls import reverse def index(request): return HttpResponse(reverse('website1:index')) # 这里返回第二个项目的index
请尊重作者劳动成果,有需要请转载,标明出处!!!
django之反向解析和命名空间的更多相关文章
- Django-url反向解析和命名空间
一.urls硬编码 在反向解析和命名空间之前我们先来说说URLS硬编码,用django 开发应用的时候,可以完全是在urls.py 中硬编码配置地址,在views.py中HttpResponseRed ...
- python 之 Django框架(路由系统、include、命名URL和URL反向解析、命名空间模式)
12.36 Django的路由系统 基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名) ...
- Django url反向解析与路由分发名称空间
url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...
- Django【第2篇】:Django之反向解析
Django框架之第二篇 一.知识点回顾 1.MTV模型 model:模型,和数据库相关的 template:模板,存放html文件,模板语法(目的是将变量如何巧妙的嵌入到HTML页面中). view ...
- Django 的反向解析与有无名分组
无名分组(将加括号的正则表达式匹配到的内容当做位置参数自动传递给对应的视图函数) url(r'^test/(\d+)/',views.test), # 匹配一个或多个数字 def test(reque ...
- Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式
Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...
- Django正向解析和反向解析
转载:https://blog.csdn.net/jeekmary/article/details/79673867 先创建一个视图界面 urls.py index.html index页面加载的效果 ...
- django反向解析和正向解析
Django的正向解析和反向解析 先创建一个视图界面 urls.py index.html index页面加载的效果 正向解析 test/?result=1 所谓正向解析就是直接在这里写地址 向url ...
- django反向解析URL和URL命名空间
django反向解析URL和URL命名空间 首先明确几个概念: 1.在html页面上的内容特别是向用户展示的url地址,比如常见的超链接,图片链接等,最好能动态生成,而不要固定. 2.一个django ...
随机推荐
- js时间相关操作
取值 this.divEndDate.attr("value",new Date()); var date = new Date(); date.getYear(): 取2 ...
- Activiti+Shiro实战
有人曾说:人的差距都在业余时间拉开的……嗯,我现在深刻理解着这句话,作为一个程序员,技术男,就得不断学习新的技术,跟上时代步伐,才会让自己更有价值~~~~以下这个项目是个人利用业余时间学习并实践的~如 ...
- Codeforces Round #615 (Div. 3) A-F简要题解
contest链接:https://codeforces.com/contest/1294 A. 给出a.b.c三个数,从n中分配给a.b.c,问能否使得a = b = c.计算a,b,c三个数的差值 ...
- js面向对象的程序设计 --- 中篇(创建对象) 之 原型模式
·原型模式 我们创建的每一个函数都由一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有 实例共享的属性和方法. 如果按照字面意思来理解,那 ...
- Vue的iview组件框架select远程搜索,选中后不刷新的问题
1.场景:弹框内有一个下拉组件(支持搜索),当选择完数据后弹框关闭,再次打开后,下拉框内的数据是刚才选中的数据.原因:分析后觉得是搜索内容没有清空,导致下拉的数据只有一个 2.解决方案 a .解决:调 ...
- IntelliJ IDEA 2017.3尚硅谷-----断点调试
- 记manjaro图形驱动删除后的一次补救
#一.前言 众所周知,NVIDIA的闭源驱动在Linux上的兼容性不是很好,再加上我不玩游戏,于是我就想卸载独显只留核显.我以为我装了独显和核显两种驱动,原本想直接删除独显驱动,没想到删除的是bumb ...
- pwnable.kr-echo1-Writeup
pwnable.kr - echo1 - writeup 原文链接:https://www.cnblogs.com/WangAoBo/p/pwnable_kr_echo1.html 旧题新做,发现这道 ...
- 使用maven 打包springboot项目步骤以及所遇到的问题
1.首先必须确保java和maven是安装好的,并且环境变量配置正确 2.接着可以看一下我们项目中的pom.xml中的以下配置 packaging那里很关键,表示我们打包项目的类型,可以为jar 也可 ...
- MySQL性能优化---优化方案
1.对查询进行优化,应尽量避免全表查询,首先考虑在where及order by涉及的列上建立索引: 2.应尽量避免where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描: ...