背景:当我们页面中存放的请求路径与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之反向解析和命名空间的更多相关文章

  1. Django-url反向解析和命名空间

    一.urls硬编码 在反向解析和命名空间之前我们先来说说URLS硬编码,用django 开发应用的时候,可以完全是在urls.py 中硬编码配置地址,在views.py中HttpResponseRed ...

  2. python 之 Django框架(路由系统、include、命名URL和URL反向解析、命名空间模式)

    12.36 Django的路由系统 基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名) ...

  3. Django url反向解析与路由分发名称空间

    url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...

  4. Django【第2篇】:Django之反向解析

    Django框架之第二篇 一.知识点回顾 1.MTV模型 model:模型,和数据库相关的 template:模板,存放html文件,模板语法(目的是将变量如何巧妙的嵌入到HTML页面中). view ...

  5. Django 的反向解析与有无名分组

    无名分组(将加括号的正则表达式匹配到的内容当做位置参数自动传递给对应的视图函数) url(r'^test/(\d+)/',views.test), # 匹配一个或多个数字 def test(reque ...

  6. Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式

    Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...

  7. Django正向解析和反向解析

    转载:https://blog.csdn.net/jeekmary/article/details/79673867 先创建一个视图界面 urls.py index.html index页面加载的效果 ...

  8. django反向解析和正向解析

    Django的正向解析和反向解析 先创建一个视图界面 urls.py index.html index页面加载的效果 正向解析 test/?result=1 所谓正向解析就是直接在这里写地址 向url ...

  9. django反向解析URL和URL命名空间

    django反向解析URL和URL命名空间 首先明确几个概念: 1.在html页面上的内容特别是向用户展示的url地址,比如常见的超链接,图片链接等,最好能动态生成,而不要固定. 2.一个django ...

随机推荐

  1. Nginx之反向代理

    所谓,反向代理就是,客户端向A服务器地址发送请求,A服务器接收到客户端请求后又将请求转发给了B服务器,最后又将B服务响应的数据响应给了客户端. 通过配置文件,可以实现Nginx的反向代理. 代码: s ...

  2. Java-POJ1005-I Think I Need a Houseboat

    盗用的翻译,哈哈哈!白嫖就完事了. 题目: 密西西比河岸某处陆地因为河水侵蚀,每年陆地面积都在减少,每年减少50平方英里,减少的陆地面积呈半圆形,即该半圆形面积以每年50平方英里的速度增长.在第一年初 ...

  3. 这是一篇通过open live writer发布的博文

    这两天零零总总的尝试了两三款写博客的软件,总感觉不怎么上手,最后还是使用博客园官方推荐的工具写博吧,简单方便,目前的功能基本都有,尤其是粘贴图片特别方便,回想之前的几篇博文,真是一种煎熬哈哈(对于我这 ...

  4. torchvision的理解和学习 加载常用数据集,对主流模型的调用.md

    torchvision的理解和学习 加载常用数据集,对主流模型的调用 https://blog.csdn.net/tsq292978891/article/details/79403617 加载常用数 ...

  5. mybatis 查询list,内容为null,但list的size 为1

    List<Integer> cityList = resourcePartnerService.selectCityList(userId); 需要在SQL里where语句加上 字段不为n ...

  6. JavaWeb项目忘记添加依赖

    有的时候我们建项目的时候忘记添加项目的依赖了,这里示范一个提示错误,就是 The superclass "javax.servlet.http.HttpServlet" was n ...

  7. 熬最深的夜喝最劣的酒————浅谈生成器(generator)

    测试(test)def s(): print("stup1") n = "第一步" yield n # 类似于return 但是又不同于 赖克宝,剁一下,跳一下 ...

  8. MyBatis(5)——解决属性名与列名不一致的问题

    解决属性名与列名不一致的问题 问题描述: 当实体类的属性与数据库的列名不对应时取不到该列数据 说明:MyBatis会根据查询的列名设值(列名的setter方法),然后以此列名为做查询等操作,在此过程中 ...

  9. 工具 - deepin vscode中的oh-my-zsh乱码

    解决办法 https://blog.zhaytam.com/2019/04/19/powerline-and-zshs-agnoster-theme-in-vs-code/ git clone htt ...

  10. 搭建 Kubernetes 高可用集群

    使用 3 台阿里云服务器(k8s-master0, k8s-master1, k8s-master2)作为 master 节点搭建高可用集群,负载均衡用的是阿里云 SLB ,需要注意的是由于阿里云负载 ...