小程序开发笔记(五)Django路由

2022/3/18 pythonDjango

# 一、路由配置

路由简单的来说就是根据用户请求的URL链接来判断对应的处理程序,并返回处理结果,也就是URL与Django的视图建立映射关系

Django路由在urls.py配置,urls.py中的每一条配置对应相应的处理方法

from django.urls import path
from . import views, testdb, search, search_post

urlpatterns = [
    path('hello/', views.hello),
    path('test/', views.test),
    path('mysql_add/', testdb.testdb_add),
    path('mysql_quire/', testdb.testdb_quire),
    path('mysql_edit/', testdb.testdb_edit),
    path('mysql_delete/', testdb.testdb_delete),
    path('search_form/', search.search_form),
    path('search/', search.search),
    path('search_post/', search_post.search_post),
]

# 二、路由分发

Django项目里多个app目录共用一个 urls 容易造成混淆,后期维护也不方便

解决:使用路由分发(include),让每个app目录都单独拥有自己的 urls

步骤:

  • 在每个 app 目录里都创建一个urls.py文件
  • 在项目名称目录下的urls文件里,统一将路径分发给各个app目录
from django.contrib import admin 
# 从django.urls引入include
from django.urls import path, include

urlpatterns = [ 
    path('admin/', admin.site.urls), 
    path("app01/", include("app01.urls")), 
    path("app02/", include("app02.urls")), 
]

在各自 app 目录下,写自己的 urls.py 文件,进行路径跳转。

app01的urls.py:

from django.urls import path,re_path
# 从自己的app目录引入views
from app01 import views 

urlpatterns = [ 
    re_path(r'^login/(?P<m>[0-9]{2})/$', views.index),
] 

app02的urls.py:

from django.urls import path,re_path
# 从自己的app目录引入views
from app02 import views 

urlpatterns = [ 
    re_path("^xxx/(?P[0-9]{4})/$", views.xxx), 
]

# 三、反向解析

随着功能的增加,路由层的url发生变化,就需要去更改对应的视图层和模板层的url,不便维护

可以利用反向解析,当路由层url发生改变,在视图层和模板层动态反向解析出更改后的url,免去修改的操作

反向解析一般用在模板中的超链接及视图中的重定向

步骤:

  • 在urls.py中给路由起别名,name="路由别名",如:path("login1/", views.login, name="login")
  • 在views.py中,从django.urls中引入reverse,利用reverse("路由别名")反向解析:return redirect(reverse("login"))
  • 在模板templates中的HTML文件中,利用{% url "路由别名" %}反向解析,如:<form action="{% url 'login' %}" method="post">