欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Django命名空間app_name和namespace-創(chuàng)新互聯(lián)

前言: django命名空間解決什么問題?

  1. 在多個(gè)app之間,有可能產(chǎn)生同名的url,這個(gè)時(shí)候避免反轉(zhuǎn)url的時(shí)候混淆,可以使用應(yīng)用命名空間做區(qū)分。應(yīng)用命名空間使用。在應(yīng)用url中定義 app_name;

    10多年的船山網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整船山建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“船山網(wǎng)站設(shè)計(jì)”,“船山網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
  2. 一個(gè)app,可以創(chuàng)建多個(gè)url映射到一個(gè)app中,所以就會產(chǎn)生一個(gè)問題,在做反轉(zhuǎn)的時(shí)候,如果不使用命名空間,就會混淆,為了避免這個(gè)問題。我們可以使用實(shí)例命名空間。在include函數(shù)中添加namespace即可;

下面通過兩個(gè)案例說明

一: 場景1,不同應(yīng)用中的命名空間

(1)新建app應(yīng)用

#python manage.py startapp app01
#python manage.py startapp app02

(2)主URL配置

from django.contrib import admin
from django.conf.urls import url, include
from django.urls import path

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

(2)app01配置 project_django/app01/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index,name='index'),
    path('login', views.login,name='login'),
]

(3)app01配置 project_django/app01/views.py

from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect,reverse

# Create your views here.

def index(request):
    if request.GET.get("username"):
        return HttpResponse("front page app01!")
    else:
        return redirect(reverse("login"))

def login(request):
    return HttpResponse("Login page app01!")

(4)app02配置 project_django/app02/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index,name='index'),
    path('login', views.login,name='login'),
]

(5)app02配置 project_django/app02/views.py

from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect, reverse

# Create your views here.

def index(request):
    if request.GET.get("username"):
        return HttpResponse("front page app02!")
    else:
        return redirect(reverse("login"))

def login(request):
    return HttpResponse("Login page app02!")

我們可以看到每個(gè)app下面的urls都定義了name=index和name=login。 而每個(gè)views下面的reverse都是login。這個(gè)時(shí)候django回去找誰呢? 當(dāng)我們?yōu)g覽器打開路徑: http://127.0.0.1:8000/app01 的時(shí)候,我們會發(fā)現(xiàn)跳轉(zhuǎn)異常,竟然跳轉(zhuǎn)到地址: http://127.0.0.1:8000/app02/login 上面。

這個(gè)時(shí)候我們使用命名空間app_name,就可以很好解決這個(gè)問題。

修改配置

(1)app01配置 project_django/app01/urls.py

from django.urls import path
from . import views

#命名空間
app_name = 'app01'   #這里變化了

urlpatterns = [
    path('', views.index,name='index'),
    path('login', views.login,name='login'),
]

(2)app01配置 project_django/app01/views.py

from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect,reverse

# Create your views here.

def index(request):
    if request.GET.get("username"):
        return HttpResponse("front page app01!")
    else:
        return redirect(reverse("app01:login"))   #這里變化了

def login(request):
    return HttpResponse("Login page app01!")

(3)app02配置 project_django/app02/urls.py

from django.urls import path
from . import views

app_name = 'app02'   #這里變化了

urlpatterns = [
    path('', views.index,name='index'),
    path('login', views.login,name='login'),
]

(4)app02配置 project_django/app02/views.py

from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect, reverse

# Create your views here.

def index(request):
    if request.GET.get("username"):
        return HttpResponse("front page app02!")
    else:
        return redirect(reverse("app02:login"))  #這里變化了

def login(request):
    return HttpResponse("Login page app02!")

當(dāng)我們?yōu)g覽器打開路徑: http://127.0.0.1:8000/app01 的時(shí)候,就會正常跳轉(zhuǎn)地址: http://127.0.0.1:8000/app01/login 了

二: 場景2,同一個(gè)應(yīng)用中的命名空間

先新啟一個(gè)實(shí)例, #python manage.py startapp book

1. 我們先看一下代碼案例,假設(shè)

(1)主URL,project_django/project_django/urls.py

from django.contrib import admin
from django.conf.urls import url, include
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book1/', include('book.urls')),
    path('book2/', include('book.urls')),
]

多個(gè)url,指向同一個(gè)app。

(2)應(yīng)用book的子URL,project_django/book/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.book_list),
    path('login', views.book_login, name="login"),
]

(3)視圖,project_django/book/views.py

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
from django.shortcuts import redirect,reverse

def book_list(request):
    if request.GET.get("username"):
        return HttpResponse("My book list !!!!")
    else:
        return redirect(reverse("login"))

def book_login(request):
    return HttpResponse("Please Login!!!!")

通過上面案例,我們可以知道。
當(dāng)執(zhí)行http://127.0.0.1:8000/book2/ 的時(shí)候就會跳轉(zhuǎn)http://127.0.0.1:8000/book2/login
當(dāng)執(zhí)行http://127.0.0.1:8000/book1/ 的時(shí)候發(fā)現(xiàn)還是跳轉(zhuǎn)http://127.0.0.1:8000/book2/login

這不是我們想要的結(jié)果,我們希望訪問/book1/的時(shí)候跳轉(zhuǎn)/book1/login;訪問/book2/的時(shí)候跳轉(zhuǎn)/book2/login; 那么通一個(gè)應(yīng)用中的兩個(gè)實(shí)例,我們?nèi)绾螀^(qū)分?

2. 案例修改

(1)主URL

from django.contrib import admin
from django.conf.urls import url, include
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book1/', include('book.urls'),  namespace='book1')),  #變更部分
    path('book2/', include('book.urls'),  namespace='book2')),  #變更部分
]

(2)應(yīng)用book的子URL

from django.urls import path
from . import views

app_name = "book"

urlpatterns = [
    path('', views.book_list),
    path('login', views.book_login, name="login"),
]

(3)視圖

def book_list(request):
        #獲取當(dāng)前namespace名稱。
    current_namespace = request.resolver_match.namespace   #變更部分
    if request.GET.get("username"):
        return HttpResponse("My book list !!!!")
    else:
        print(current_namespace)
                #動態(tài)返回命名空間信息
        return redirect(reverse("%s:login"% current_namespace))  #變更部分

def book_login(request):
    return HttpResponse("Please Login!!!!")

三: include介紹

(1)include(module,namespace=Node)

  • module:應(yīng)用app的名稱.urls
  • namespace:實(shí)例命名空間。如果指定實(shí)例命名空間,那么必須指定應(yīng)用命名空間。
    也就是在應(yīng)用app的urls.py添加app_name=’xxx‘
    如果不加app_name,報(bào)錯(cuò)信息:'Specifying a namespace in include() without providing an app_name '

(2)include((pattern_list,app_namesapace),namespace=None)

  • 如果不想在子app中的urls加app_name,那么就可以利用這種方法實(shí)現(xiàn);
  • 例子:include(('book.urls','book'),namespace='book')

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。

網(wǎng)頁標(biāo)題:Django命名空間app_name和namespace-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://chinadenli.net/article36/dsgcpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、軟件開發(fā)、靜態(tài)網(wǎng)站、網(wǎng)站營銷、定制網(wǎng)站、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司