視圖
在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_URLCONF
爲urls.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
- 利用
django
的redirects 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產生混淆,可以使用應用命名空間,來做區分。定義應用命名空間非常簡單,只要在app
的urls.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)
]