Django之Urls
1. Django路由系统
路由简单的来说就是根据用户请求的 URL 链接来判断对应的处理程序,并返回处理结果,也就是 URL 与 Django 的视图建立映射关系。
2. Django路由系统常用的几种方式
1. 普通路径
from django.urls import path
from shuaige import views
urlpatterns = [
path('login/',views.login)
]
2. 正则路径
from django.urls import path
from django.urls import re_path
urlpatterns = [
re_path(r'^login/$',views.login)
]
3. 正则路径中的无名分组
按照位置参数传参,一一对应
urls.py
from django.contrib import admin
from django.urls import path
from django.urls import re_path
urlpatterns = [
re_path(r'^index/(\d+)/(\d+)$',views.ceshi)
]
views.py
def ceshi(request,a,b):
print(a)
print(b)
return HttpResponse('aaaaa')
要注意添加对应的位置参数
4. 正则路径中的有名分组
有名分组按关键字传参,与位置顺序无关
urls.py
from django.contrib import admin
from django.urls import path
from django.urls import re_path
urlpatterns = [
re_path(r'^index/(?P<a>\d+)/(?P<b>\d+)$',views.ceshi)
]
views.py
def ceshi(request,b,a):
print(a)
print(b)
return HttpResponse('aaaaa')
5. 路由分发
存在问题:Django 项目里多个app目录共用一个 urls 容易造成混淆,后期维护也不方便。
解决:使用路由分发,让每个app目录都单独拥有自己的urls
1. 在每个app目录里创建一个urls.py文件
1. 创建两个app
py manage.py startapp zhangxueyou
py manage.py startapp guofucheng
2. 分别在两个app目录下创建urls.py文件
zhangxueyou/urls.py
from django.urls import path,include
from django.urls import re_path
from zhangxueyou import views
urlpatterns = [
path('login/', views.login )
]
guofucheng/urls.py
from django.urls import path
from django.urls import re_path
from guofucheng import views
urlpatterns = [
path('login/', views.login)
]
2. 在项目名称目录下的urls文件里,统一将路径分发给各个app目录
在项目的urls.py文件中
from django.urls import path,include
from django.urls import re_path
urlpatterns = [
path('zhangxueyou/', include("zhangxueyou.urls")),
path('guofucheng/', include("guofucheng.urls"))
]
3. 访问路径
http://172.16.7.244:8081/zhangxueyou/login/
http://172.16.7.244:8081/guofucheng/login/
6. 反向解析
随着功能的增加,路由层的url发生变化,就需要去更改对应的视图层和模板层的url,非常麻烦,不便维护。
这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作。
反向解析一般用在模板中的超链接及视图中的重定向。
1. 普通路径
urls.py 给路由起个别名
path('houzi/',views.ceshi,name="ceshi")
views.py 使用reverse反向解析
from django.urls import reverse
def ceshi(request):
return redirect(reverse('ceshi'))
在模板templates中的HTML文件,利用{% url "路由别名" %}反向解析
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'ceshi' %}" method="post">
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="password" name="pwd"></p>
<input type="submit">
</form>
</body>
</html>
7. 命名空间
命名空间是表示标识符的可见范围
为了防止反向解析的名称一样,导致无法正确解析,所以加入了命名空间的概念。
urls.py
path("app01/", include(("app01.urls","app01")))
path("app02/", include(("app02.urls","app02")))
views.py
return redirect(reverse("app01:login")
html
<form action="{% url 'app01:login' %}" method="post">

浙公网安备 33010602011771号