Django URL與視圖

視圖

在Django中,通過瀏覽器去請求一個頁面時,使用視圖函數來處理這個請求的,視圖函數處理之後,要給瀏覽器返回頁面內容。視圖一般都寫在app的views.py中。並且視圖的第一個參數永遠都是request(一個 HttpRequest)對象。這個對象存儲了請求過來的所有信息,包括攜帶的參數以及一些頭部信息等。在視圖中,一般是完成邏輯相關的操作。視圖函數的返回結果必須是HttpResponseBase對象或者子類的對象。

news/views.py

from django.shortcuts import render
from django.http import HttpResponse

# from django.http import HttpResponse代表導入視圖函數
# 導入的視圖函數繼承與HttpResponseBase對象
# 創建的函數必須是繼承與request
# 視圖函數的返回結果爲HttpResponseBase或者子類的對象

def index(request):
    return HttpResponse("新聞頁")

news/urls.py

# @Time : 2020/6/15 23:14 
# @Author : SmallJ 

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index)
]

URL映射

  • 爲什麼要去urls.py文件中尋找映射呢?
    • 是因爲在settings.py文件中配置了ROOT_URLCONFurls.py,所有Django會去urls.py中尋找。
  • urls.py中我們所有的映射,都應該放在urlpatterns這個變量中。
  • 所有的映射不是隨便寫的,而是使用path函數或者是其他函數進行包裝的。

視圖寫完後,要寫URL進行映射,也即用戶在瀏覽器中輸入什麼url的時候可以請求到這個視圖函數。在用戶輸入了某個url,請求到我們的網站的時候,django會從項目的urls.py文件中尋找對應的視圖。在urls.py文件中有一個urlpatterns變量,以後django就會從這個變量讀取所有的匹配規則。匹配規則需要使用django.urls.path函數進行包裹,這個函數會根據傳入的參數返回URLPattern或者URLResolver的對象。

book/vies.py

from django.shortcuts import render
from django.http import HttpResponse


def book(request):
    return HttpResponse("圖書首頁")

urls.py

"""book_data URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include


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

在這裏插入圖片描述

在這裏插入圖片描述

URL添加參數

注意:視圖views.py文件中創建的視圖函數傳參時必須與urls.py文件中path路由的名字相對應

採用在url中使用變量的方式:在path的第一個參數中,使用<參數名>的方式可以傳遞參數。然後在視圖函數也要寫一個參數,視圖函數中的參數必須和url中的參數名稱保持一致。

book/views.py

from django.shortcuts import render
from django.http import HttpResponse


def book(request):
    return HttpResponse("圖書首頁")


def book_article(request, book_id):
    return HttpResponse("圖書的id爲:%s" % book_id)


book/urls.py

# @Time : 2020/6/15 23:29 
# @Author : SmallJ 

from django.urls import path
from . import views

urlpatterns = [
    path("", views.book),
    path("artilce/<book_id>", views.book_article)
]

在這裏插入圖片描述

URL中添加多個參數時

book/views.py

from django.shortcuts import render
from django.http import HttpResponse


def book(request):
    return HttpResponse("圖書首頁")


def book_article(request, book_id):
    return HttpResponse("圖書的id爲:%s" % book_id)


def book_author(request, book_name, book_age):
    # 當有多個參數的時候,可以使用括號括起來
    return HttpResponse("圖書的作者爲:%s,今年歲數爲: %d" % (book_name, int(book_age)))

book/urls.py

# @Time : 2020/6/15 23:29 
# @Author : SmallJ 

from django.urls import path
from . import views

urlpatterns = [
    path("", views.book),
    path("artilce/<book_id>", views.book_article),
    path("author/<book_name>/<book_age>", views.book_author)
]

在這裏插入圖片描述

查詢字符串的方式傳遞參數

request.GET.get()

  • 爲什麼會有兩次GET.get。
  • 主要是因爲源碼中,GET的返回結果爲QueryDict, 這是一種字典類型。
  • 使用get的好處在於當沒有值的時候會返回None,字典操作。

news/views.py

from django.shortcuts import render
from django.http import HttpResponse

# from django.http import HttpResponse代表導入視圖函數
# 導入的視圖函數繼承與HttpResponseBase對象
# 創建的函數必須是繼承與request
# 視圖函數的返回結果爲HttpResponseBase或者子類的對象


def index(request):
    return HttpResponse("新聞頁")


def news_article(request):
    news_id = request.GET.get('id')
    return HttpResponse("這是新聞頁面的id頁爲:%s" % news_id)

news/urls.py

from django.shortcuts import render
from django.http import HttpResponse

# from django.http import HttpResponse代表導入視圖函數
# 導入的視圖函數繼承與HttpResponseBase對象
# 創建的函數必須是繼承與request
# 視圖函數的返回結果爲HttpResponseBase或者子類的對象


def index(request):
    return HttpResponse("新聞頁")


def news_article(request):
    news_id = request.GET.get('id')
    return HttpResponse("這是新聞頁面的id頁爲:%s" % news_id)

在這裏插入圖片描述

當存在多個查詢字符串值時 news/views.py

from django.shortcuts import render
from django.http import HttpResponse

# from django.http import HttpResponse代表導入視圖函數
# 導入的視圖函數繼承與HttpResponseBase對象
# 創建的函數必須是繼承與request
# 視圖函數的返回結果爲HttpResponseBase或者子類的對象


def index(request):
    return HttpResponse("新聞頁")


def news_article(request):
    news_id = request.GET.get('id')
    classify = request.GET.get('class')
    return HttpResponse("這是新聞頁面的id頁爲:%s,這個是第%s類" % (news_id, classify))


注意:多個值查詢使用&符號進行連接

在這裏插入圖片描述

Django內置的轉換器

URL中傳參的情況,傳遞參數是通過<>尖括號來進行指定的。並且在傳遞參數的時候,可以指定這個參數的數據類型,比如文章的id都是int類型,那麼就可以寫<int:id>

  • str : 非空的字符串類型。默認的轉換器。但是不能包括斜杆。
  • int : 匹配任意的零或正數的整形。到視圖函數中就是一個 int類型。
  • uuid :匹配uuid字符串。
  • path : 匹配非空的英文字符串,可以包括斜杆。
  • slug : 由英文中的橫杆 -,或者下劃線_連接英文字符或者數字而成的字符串。

book/urls.py

# @Time : 2020/6/15 23:29 
# @Author : SmallJ 

from django.urls import path
from . import views
from django.urls import converters
urlpatterns = [
    path("", views.book),
    path("artilce/<str:book_id>", views.book_article),
    path("author/<str:book_name>/<int:book_age>", views.book_author)
]

在這裏插入圖片描述

URL命名和反轉URL

用Django開發web應用,經常會遇見從一箇舊的url轉向一個新的url。這種映射也許有規則,也許沒有。但都是爲了實現業務的需要。當有一天項目經理需要你更換url路由的時候,你就會需要使用到URL命名與反轉更加方便實現。

  • url中配置REdirectView
  • view中通過HttpResponseRedirect實現redirect
  • 利用djangoredirects app實現
  • 命名和反轉URL : from django.shortcuts import redirect, reverse
    • redirect : 爲http中的函數跳轉
    • reverse : 把url對應的視圖函數的name值進行反轉

front/views.py

from django.shortcuts import render
from django.http import HttpResponse

# redirect 爲重定向的意思
from django.shortcuts import redirect, reverse

# 做個判斷,就是當沒有進行登錄的時候,跳轉到登陸頁面
# 定義前端頁面


def index(request):
    # 這裏的get是以問號參數來傳遞
    username = request.GET.get('username')
    if username:
        return HttpResponse('前臺首頁')
    else:
        # redirect 爲重定向
        # 如果寫login的話就會把url的地址寫死
        # reverse:反轉
        # 主要就是通過reverse進行反轉,把url對應的視圖函數的name值進行
        return redirect(reverse('front:login'))


def login(request):
    return HttpResponse("前臺登錄頁面")

front/urls.py

# @Time : 2020/6/14 16:15 
# @Author : SmallJ 


from django.urls import path
from front import views


# 命名空間
app_name = 'front'

# 配置路由
urlpatterns = [
    path("", views.index, name='index'),
    path("signin/", views.login, name='login')
]

在這裏插入圖片描述

cms/urls.py

# @Time : 2020/6/14 16:13 
# @Author : SmallJ 


from django.urls import path
from cms import views

# 命名空間
app_name = 'cms'

# 配置路由
urlpatterns = [
    path("", views.index, name='index'),
    path("login/", views.login, name='login')
]

cms/views.py

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.


# 定義後端模板
def index(request):
    return HttpResponse('後臺頁面')


def login(request):
    return HttpResponse("後臺登陸界面")

在這裏插入圖片描述
在這裏插入圖片描述

應用命名空間

在多個app之間,有可能產生同名的url。這時候爲了避免反轉url的時候產生url產生混淆,可以使用應用命名空間,來做區分。定義應用命名空間非常簡單,只要在appurls.py中定義一個叫做app_name的變量,來指定這個應用的命名空間即可。

from django.urls import path
from front import views


# 命名空間
app_name = 'front'

# 配置路由
urlpatterns = [
    path("", views.index, name='index'),
    path("signin/", views.login, name='login')
]

以後在做反轉的時候就可以使用應用命名空間:url名稱的方式進行反轉。

login_url = reverse('font:login')

在這裏插入圖片描述

指定默認的參數

爲什麼需要使用默認的參數,在將來我們做網站開發的時候,將會遇到翻頁的情況翻頁的時候有的第一頁的url 和 首月的url的內容是一致的
這是怎麼回事呢?

  • 例如: 豆瓣的首頁:https://movie.douban.com/top250
  • 通過規律發現豆瓣的首頁: https://movie.douban.com/top250?start=0&filter=

book/views.py

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("這是圖書首頁")


def index_number(request, page_number):
    return HttpResponse("這是圖書的第%s頁" % page_number)

book/urls

# @Time : 2020/6/17 23:45 
# @Author : SmallJ 

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index),
    path("p/<page_number>/", views.index_number)
]

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述
需求:我需要在不進行傳參的時候顯示圖書的第一頁,這該怎麼實現呢?

  • 給參數一個默認值,在不進行傳參的時候使用默認值。
  • 在給對應的參數多寫一個對應的路由規則。

book/views.py

from django.shortcuts import render
from django.http import HttpResponse

"""
爲什麼需要使用默認的參數,在將來我們做網站開發的時候,將會遇到翻頁的情況
翻頁的時候有的第一頁的url 和 首月的url的內容是一致的
這是怎麼回事的
例如: 豆瓣的首頁:https://movie.douban.com/top250
通過規律發現豆瓣的首頁: https://movie.douban.com/top250?start=0&filter=
"""

# 給參數一個默認值,在不進行傳參的時候使用默認值
# 在多寫一個路由的規則


def index(request):
    return HttpResponse("這是圖書首頁")


def index_number(request, page_number=1):
    return HttpResponse("這是圖書的第%s頁" % page_number)

book/urls.py

# @Time : 2020/6/17 23:45 
# @Author : SmallJ 

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index),
    # 傳的參數
    path("p/<int:page_number>/", views.index_number),
    # 默認的參數
    path("p", views.index_number)
]

在這裏插入圖片描述

在這裏插入圖片描述

re_path函數

有時候我們在寫url匹配的時候,想要寫使用正則表達式來實現一些複雜的需求,那麼這時候我們可以使用re_path來實現。re_path的參數和path參數一摸一樣,只不過第一個參數也就是route參數可以爲一個正則表達式。

在正則表達式中定義變量,需要使用圓括號括起來。這個參數是有名字的,那麼需要使用?P<參數的名字>。然後在後面添加正則表達式的規則。

正則表達式 作用
^ 匹配字符串開頭的位置
$ 匹配字符串結尾的位置
from django.urls import path, re_path
from django.conf.urls import url
from . import views
# from django.conf.urls import url 這導入的url實際上返回return re_path
# re_path : 第一個參數也就是route參數可以成爲正則表達式
# @Time : 2020/6/17 23:45 
# @Author : SmallJ 

from django.urls import path, re_path
from django.conf.urls import url
from . import views

# from django.conf.urls import url 這導入的url實際上返回return re_path
# re_path : 第一個參數也就是route參數可以成爲正則表達式

urlpatterns = [
    path("", views.index),
    path("p/<int:page_number>/", views.index_number),
    path("p", views.index_number),
    # 正則表達式
    # ^ 開始  $結尾
    re_path(r"^article/(?P<year>\d{4})/", views.year_index),
    re_path(r"^article/(?P<month>\d[1-12])/", views.month_index)
]

在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章