Django之URL反向解析


1、反向解析的概述和來由

Django中提供了關於URL的映射的解決方案,可以做兩個方向的使用

  • 1.普通解析過程:由客戶端的瀏覽器發起一個url請求,Django根據url解析,把url中的參數捕獲,調用相應的視圖,獲取相應的數據,然后返回給客戶端顯示。

  • 2.反向解析:通過一個視圖的名字,再加上一些參數和值,逆向獲取相應的url。簡單來說,反向解析(本質)就是指通過一些方法,得到一個結果,該結果可以訪問到對應的url並觸發視圖函數的運行

反向解析的應用場景,是因為在軟件開發初期,url地址的路徑設計可能並不完美,后期需要進行調整,如果項目中很多地方使用了該路徑,一旦該路徑發生變化,就意味着所有使用該路徑的地方都需要進行修改,這是一個非常繁瑣的操作。

因此,解決方案就是在編寫一條url(regex,view,kwargs=None,name=None)時,可以通過參數nameurl地址的路徑部分起一個別名,項目中就可以通過別名來獲取這個路徑。以后無論路徑如何變化別名與路徑始終保持一致。這種通過別名獲取路徑的過程就稱為反向解析。

2、反向解析的示例

示例:登錄成功跳轉到index.html頁面

  • urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    
    url(r'^login/$', views.login,name='login_page'), # 路徑login/的別名為login_page
    url(r'^index/$', views.index,name='index_page'), # 路徑index/的別名為index_page
]
  • views.py
from django.shortcuts import render 
from django.shortcuts import reverse # 用於反向解析
from django.shortcuts import redirect #用於重定向頁面
from django.shortcuts import HttpResponse

def login(request):
    if request.method == 'GET':
        # 當為get請求時,返回login.html頁面,頁面中的{% url 'login_page' %}會被反向解析成路徑:/login/
        return render(request, 'login.html')
	
    # 當為post請求時,可以從request.POST中取出請求體的數據
    name = request.POST.get('name')
    pwd = request.POST.get('pwd')
    if name == 'kevin' and pwd == '123':
        url = reverse('index_page')  # reverse會將別名'index_page'反向解析成路徑:/index/       
        return redirect(url) # 重定向到/index/
    else:
        return HttpResponse('用戶名或密碼錯誤')


def index(request):
    return render(request, 'index.html')
  • login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄頁面</title>
</head>
<body>
<!--強調:login_page必須加引號-->
<form action="{% url 'login_page' %}" method="post">
    <p>用戶名:<input type="text" name="name"></p>
    <p>密碼:<input type="password" name="pwd"></p>
    <p><input type="submit" value="提交"></p>
</form>
</body>
</html>
  • index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>
<h3>我是index頁面...</h3>
</body>
</html>

測試:
運行項目,在瀏覽器中輸入http://127.0.0.1:8000/login/
會看到登錄頁面,輸入正確的用戶名密碼后會跳轉到index.html頁面,當修改路由表中匹配路徑的正則表達式時,程序其余部分均無需修改

因此,反向解析的一般用法是

# 后端views.py反向解析的使用
  	from django.shortcuts import render,HttpResponse,redirect,reverse
  	url = reverse('login_page')
# 前端模版login.html文件中,反向解析的使用
 	{% url 'login_page' %}

3、url分組的反向解析

如果路徑中存在分組(無名分組和有名分組)的反向解析,例如

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    
    url(r'^aritcle/(\d+)/$',views.article,name='article_page'), # 無名分組
    url(r'^user/(?P<uid>\d+)/$',views.article,name='user_page'), # 有名分組
]

對應反向解析的寫法是

# 1 針對無名分組,比如要反向解析出:/aritcle/1/ 這種路徑,寫法如下
在views.py中,反向解析的使用:
	url = reverse('article_page',args=(1,)) 
在模版login.html文件中,反向解析的使用
	{% url 'article_page' 1 %}

    
# 2 針對有名分組,比如要反向解析出:/user/1/ 這種路徑,寫法如下
在views.py中,反向解析的使用:
	url = reverse('user_page',kwargs={'uid':1}) 
在模版login.html文件中,反向解析的使用
	{% url 'user_page' uid=1 %}

參考:小猿取經


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM