學習筆記,僅供參考
參考自:Django打造大型企業官網;
本系列Blog以應用爲主,理論基礎部分我在後端專欄的Django系列博客已經寫過了,如果有些需要補充的知識點,我會在這個系列中,儘量詳細的寫一下。
URL命名與反轉
學前準備
- 創建兩個新的APP
創建front應用,用於管理前臺相關代碼:
python manage.py startapp front
創建cms應用,用於管理後臺相關代碼:
python manage.py startapp cms
- 對兩個APP進行配置
settings.py:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book',
'cms',
'front',
]
URL命名及反轉
- 情況1(url命名不衝突)
cms應用下的urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index),
path('login/', views.login),
]
front應用下的urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index),
path('login/', views.login),
]
主urls.py:
from django.contrib import admin
from django.urls import path
from . import views
from django.conf.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.baidu),
path('login/', views.login, name = "signin"),
path('book/', include('book.urls')),
path('cms/', include('cms.urls')),
path('front/', include('front.urls')),
]
在主urls.py中,對代表登錄頁面的url進行命名。
cms應用下的views.py:
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("CMS首頁")
def login(request):
return HttpResponse("CMS登錄頁面")
front應用下的views.py:
from django.http import HttpResponse
from django.shortcuts import redirect,reverse
# Create your views here.
def index(request):
username = request.GET.get("username", "")
if username:
return HttpResponse("front首頁")
else:
login_url = reverse('signin')
#利用url的name參數反轉得到相應的url
print("-+"*15)
print(login_url)
print("-+"*15)
return redirect(login_url)
def login(request):
return HttpResponse("front登錄頁面")
利用url的name參數進url反轉,跳轉到主頁的登錄界面。
主views.py
from django.http import HttpResponseRedirect
from django.http import HttpResponse
def baidu(request):
return HttpResponseRedirect("https://www.baidu.com/")
def login(request):
return HttpResponse("主頁的登錄頁面")
現在,我們在瀏覽器中輸入http://127.0.0.1:8000/front/:
回車,跳轉到首頁的登錄界面:
控制檯輸出:
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/login/
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
[03/Jul/2020 07:34:16] "GET /front/ HTTP/1.1" 302 0
[03/Jul/2020 07:34:16] "GET /login/ HTTP/1.1" 200 21
- 情況2(url命名衝突)
當url命名出現衝突的情況下,即在開發過程中,在不同應用中,設置相同的url的name參數的情況,這樣可能就可能出現url反轉的混亂。
這時,我們可以通過給app起名字的方式,即設置應用命名空間app_name變量,解決該問題。同時,在視圖函數中,我們還需要用命名空間:name
的方式對url進行反轉。
front應用下的urls.py:
app_name = 'front'
urlpatterns = [
path('', views.index),
path('login/', views.login, name = "signin"),
]
cms應用下的urls.py:
app_name = 'cms'
urlpatterns = [
path('', views.index),
path('login/', views.login, name = "signin"),
]
front應用下的views.py:
def index(request):
username = request.GET.get("username", "")
if username:
return HttpResponse("front首頁")
else:
login_url = reverse('cms:signin')
#利用url的name參數反轉得到相應的url
print("-+"*15)
print(login_url)
print("-+"*15)
return redirect(login_url)
def login(request):
return HttpResponse("front登錄頁面")
跳轉到cms應用的登錄頁面。
cms應用下的views.py:
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("CMS首頁")
def login(request):
return HttpResponse("CMS登錄頁面")
現在,我們向http://127.0.0.1:8000/front/發起請求:
可以看到,頁面跳轉到了CMS的登錄界面。
查看控制檯輸出:
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/cms/login/
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
[03/Jul/2020 07:56:30] "GET /front/ HTTP/1.1" 302 0
[03/Jul/2020 07:56:30] "GET /cms/login/ HTTP/1.1" 200 15