日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Day47 Django基础部分、路由配置、空间名称

發布時間:2023/12/2 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Day47 Django基础部分、路由配置、空间名称 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.最簡單的路由配置

URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要為該URL調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對于客戶端發來的某個URL調用哪一段邏輯代碼對應執行。

?1.1

例1:

?

第一步:在

urls.py中寫入

urlpatterns = [path('admin/', admin.site.urls),path('articles/', views.articles), ]

?

在views.py中寫入給請求返回的response對象

def articles(request):print("文章頁")return HttpResponse("文章頁")

?

?小結:上面這種是最基本的,不帶url后面不帶任何參數的。

1.2 path方法把url寫死了

urls.py中寫入

path("articles/2009/", views.articles),

?

訪問變成了:

原來的articles/沒有用了,路由信息的改變。

?

?1.3re_path

#? 為了解決path上面把url寫死,用re_path

目的:減少代碼冗余,用正則來寫

# articles中需要一個接受參數
# 在urls.py文件中寫,其中artcles函數需要一個接受參數
re_path("^articles/([0-9]{4})/$", views.articles1), # 無名分組
 小結;需要在views函數中寫一個形參,才能接受
([0-9]{4})/$匹配出來的參數 ?# 于是在views中加入一個參數。
def articles(request, y):
print("文章頁")
return HttpResponse("文章頁") ?運行結果如下:

小結:這樣就可以實現的多個url的輸入,滿足正則即可。
# articles中需要2個接受參數
# urls中的代碼:
re_path(r"^articles/([0-9]{4})/([0-9]{2})/$", views.articles), # 無名分組按位置傳參數,articles后面的參數依次傳給views 中的articles函數
# views中的代碼: def articles(request, y,m):
print("文章頁", y, m)
return HttpResponse("文章頁")
?pycharm中控制臺打印出的代碼:

# 即是獲取到了/articles/后面的 /2019/12/等2個參數

?

## 注意^ 和$ 的使用

?1.4 URl和re_path如果要匹配正則規則都需要使用^和$來卡,path內部限制死了的(必須完全匹配)

?1.5

1. path 內部封裝好了,自動限制首尾的規則 2. url 沒有封裝,需要自己手動添加正則規則(同re_path方法)
# 在url前后加上參數都是可以訪問的 /dsdarticles/ 可以訪問 /articles/sdad 可以訪問 如果要卡的話 需要自己寫上正則來匹配
# path內部前后都卡死了的,
其中re_path 和url是一樣的

urls中的代碼:

url('articles/', views.articles_url),
views中的代碼:(上面的2種情況都是沒有參數的 哈哈) def articles_url(request):
print("文章頁")
return HttpResponse("文章頁")

?

1.6無名分組見上面

按位置傳參

1.7 有名分組(按關鍵字傳參)

##(1)傳入一個參數給views中函數/2019

url.py代碼:

re_path("^articles/(?P<year>[0-9]{4})/$", views.articles1), # 有名分組
views中的函數:
處理接受到的url的函數:articles1: def articles1(request, year):
print("文章頁111", year)
return HttpResponse("文章頁1111")

##(1)處理客戶端url中的參數是2個的,參數傳參是關鍵字傳參。

urls.py文件中代碼:

re_path(r"^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$", views.articles),
#得出url傳給articles中的參數是2個 都是關鍵字傳參 在函數articles中必須寫上month和year才行。
views中代碼: def articles(request, month, year):
print("文章頁面", year, month)
return HttpResponse("文章頁")

?1.8

說白了,就是客戶,各種輸入你內部就行,接受判斷并返回??蛻糨斎氲男问?articles/參數/參數 我們需要在內部就行處理,接受參數(有名分組合(關鍵字傳參必須是在url中定義的參數,

在views中對應的函數中的參數)無名分組(按形參順序就行傳參,對應在views中的函數中的參數,可以隨便取名,接受就行))??

小結:針對1.1-1.8的路由層面的

1.url和re_path差不多,內部沒有限制,可以在前面加參數或者后面加參數就行訪問,但是只能每次在項目下URls下添加路由,有點麻煩。

2.解決1的麻煩就是在url和re_path中使用正則表達式,可以在訪問/articles/.... 前面不變的情況下 增加更多的參數的? 上面介紹了加1中參數和2中參數到我們視圖處理函數views中,對應接受就行。

?# 上面的URl中的路由信息全部寫在了主項目中url中:

?3.不足的地方:每次都需要在主項目的urls中去寫上路由的配置信息,有點繁瑣,不利于維護。

解決辦法:在每一個app中建立url,在主項目下的url創建分組,從主文件向下app的url中找即可。

?2.路由分發

?在上圖的主項目的url中寫上上面的路由分發。

然后對應在app01的url寫上真的路由信息:

?

然后對應在app01的url寫上真的路由信息:(同下)

?在app02的URls中寫上真的路由信息:(只是在主項目的文件下url中就行查找,是哪個下對應的url路由信息,不至于不像之前沒有分組的時候那么亂,全部寫在一起,只需要在主文件的URl寫上最上面的那個信息即可)

# 類似于在廣東省下面去找深圳市是一樣的道路

views中的代碼:

def test(request):
return HttpResponse('app02-test')

?

?3.反向解析

3.1例子:暫時還沒有用反向解析

在app01 url.py中的代碼是:

from django.urls import path, re_path from app01 import viewsurlpatterns = [path('test/', views.test),path('articles/', views.articles_url),path('login/', views.login, name="login"),path('index/', views.index) # 當登錄成功 重定向跳轉index 也必須配置在這個下面]

?

app01中的views的代碼是:

def login(request):if request.method == "GET":return render(request, "login.html")else:username = request.POST.get('username')pwd = request.POST.get('pwd')if username == "alex" and pwd == "123":return redirect("/app01/index/")else:return redirect('app01/login')def index(request):return HttpResponse("<h2>index頁面</h2>")

?

在主項目文件夾下的模板文件夾的文件是 login.html是:

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h3>用戶登錄</h3> <form action="/app01/login/" method="post"><p>用戶名:<input type="text" name="username"></p><p>密碼: <input type="password" name="pwd"></p><input type="submit"> </form></body> </html>
運行結果:登錄成功 成功跳轉!

?

3.2 使用反向解析

?3.2.1?

path('login/', views.login, name="login"), 個人覺得還是改的是設計login的地方 沒啥卵用!
分析:首先我們將這個路由不改動的時候, 第一步:我們是先去解析出路由ulr,本句是沒使用正則的,即是 第二步:我們是去在視圖函數的login,處理一些用戶需要的邏輯,首先,本句是登錄,根據函數中的邏輯去調用temprate 中的登錄模板的,然后,再次提交數據的時候,會調用index,完成本次訪問。 也就是Django內部的一個執行流程。 小結:即是變動的時候,我們去改語句中對應的視圖函數,和對應用到的模板2個地方即可。

?



當去修改'login/' 為'login2/'會導致很多地方都會修改!所以這個時候會利用到別名啦!
注意:用戶實際登錄的時候還是使用的是login2去登錄,反向解析只是讓內部少做變動。(1)模板中的文件login.html需要改動(2)視圖函數中的login改動
在template下修改login.html文件為:
只需在上面的基礎上修改第一行為:<form action="{% url 'login' %}" method="post">
其中一旦url中配置文件一改變,模板文件中的temptate下的login.html 和views視圖下的文件也需要跟著去改:具體改法如下:
重點1:修改模板temprate中的文件 login.html

運行代碼:

?

根據視圖函數login可以知道第一次確實是得到頁面。

重點2:(反向解析改動的第二個地方,視圖函數)
? # view中的函數 def login(request):if request.method == "GET":return render(request, "login.html")else:username = request.POST.get('username')pwd = request.POST.get('pwd')if username == "alex" and pwd == "123":return redirect("/app01/index/")else:# return redirect('app01/login') 不改動的時候print(reverse('login'))return redirect(reverse('login'))### 改為這樣,他會自己根據url中login的變動而變動
運行結果是:
把下面的視圖函數中的
print(reverse('login'))打印出來的值是:

?再試一次:

先改url中的名字:

?哈哈 按照邏輯是不會打印的是:成功是:

index那個頁面跳轉成功!

?

登錄失敗看看:

?

?

?3.3 在反向解析的基礎上就行傳遞參數

3.3.1 無名參數

第一:在app下的url中代碼:

urlpatterns = [re_path(r'^login/([0-9]{2})/$', views.login, name="login"),path('index/', views.index)] 小結:即是用戶傳遞的進來的是2位數的參數。

?

第二:

temprate下的form表單就行修改,在反向解析的前提下:

感覺就是隨意放一個參數在后面,不多深究

第三:

視圖view中的加參數:

1.相關的login函數是必須加的“

2.在跳轉的地方加上參數

def login(request, pk):if request.method == "GET":return render(request, "login.html")else:username = request.POST.get('username')pwd = request.POST.get('pwd')if username == "alex" and pwd == "123":return redirect("/app01/index/")else:print(reverse('login', args=(10,))) # 無名分組return redirect(reverse('login', args=(10,))) # 位置傳參
運行代碼:必然要輸入錯誤的密碼才會打印。


問題:個人覺得反向定位的這個地方 表單位置 根本不用加12 感覺就是亂加的沒啥依據 后續看看!

?

3.3.2有名參數在方向解析的基礎上

?第一:在app01下的url的代碼是:

urlpatterns = [# path('login3/', views.login, name="login"),# 沒有參數的時候# re_path(r'^login/([0-9]{2})/$', views.login, name="login"),無名分組 順序傳參# 有名分組 關鍵字傳參re_path(r'^login/(?P<m>[0-9]{2})/$', views.login, name="login"),path('index/', views.index)]

?

?

第二:

temprate下的form表單就行修改,在反向解析的前提下:

感覺就是隨意放一個參數在后面,不多深究

{#<form action="/app01/login/" method="post">#}# 無名分組時候用的 <form action="{% url 'login' m=12 %}" method="post"># 有名分組時候用

?

第三:?

?

視圖view中的加參數:

1.相關的login函數是必須加的(這次有名分組傳遞的是一個參數)

2.看下視圖函數中的全部代碼:

def login(request, m):if request.method == "GET":return render(request, "login.html")else:username = request.POST.get('username')pwd = request.POST.get('pwd')if username == "alex" and pwd == "123":return redirect("/app01/index/")else:# print(reverse('login', args=(10,))) # 無名分組print(reverse('login', kwargs={"m":"07"})) # 有名分組# return redirect(reverse('login', args=(10,))) # 位置傳參return redirect(reverse('login', kwargs={"m":"07"})) # 關鍵字傳參# return redirect(reverse('app01:login')) # 加上名稱空間寫法# return redirect('app01/login') 不改動的時候# 沒有分組 即是沒有參數的情況# print(reverse('login'))# 這個也也是沒有使用分組的情況 但是設計login 反正url路由將其名字改掉使用反向解析# 也就是驗證那句話 哪里需要用的到地方都需要改數據,只能說使用反向解析去改的話,可以一勞永益,改一次之后# 無論你在路由怎么改寫login1到login 這里都是使用的路由對應url中的別名,嘿嘿!# return redirect(reverse('login'))

?

運行結果:以登錄失敗的方式進去:結果看樣子就是對的! 有名關鍵字傳參成功

?

?總結:

上面的例子中只是在外面套了一層重定向即是再次就行一次跳轉而已。

上面登錄失敗,再次登錄頁面出現。

## 上面的例子中 登錄失敗可以是 #return redirect(reverse('login')) # 防止url中訪問的地址改名,反向解析,并跳轉,至重新登錄return redirect(reverse('login', kwargs={"m":"07"})) # ,反向解析基礎上加上關鍵字傳參,最后重定向至重新登錄# return redirect(reverse('login', args=(10,))) # 反向解析加上位置傳參,最后重定向至重新登錄

?

登錄成功:

return redirect("/app01/index/") 反向解析大致: 1.定義name 別名 path('login1/', views.login, name="login"), 2.在視圖中反向解析 from django.urls import reversereverse("login")無名分組 re_path(r'^login1/([0-9]{2})/$', views.login, name="login"), reverse("login", args=("12",))有名分組 re_path(r'^login1/(?P<month>[0-9]{2})/$', views.login, name="login"), reverse("login", kwargs={"month": "12"}) 3.在模板中使用反向解析 path方法(url)# 不使用參數的時候 <form action="{% url 'login' %}" method="post">re_path(無名分組) <form action="{% url 'login' 12 %}" method="post">re_path(有名分組) <form action="{% url 'login' month=12 %}" method="post">

?4.名稱空間

4.1 例子

1.新建一個app02

第一:app02中的url代碼:

from django.urls import path, re_path from app02 import viewsurlpatterns = [path('test/', views.test),path('login/', views.login, name="login"), ]

?

第二:app02 中的視圖(view中的代碼)

def login(request):if request.method == "GET":return render(request, "login1.html")else:# print(request.POST)print(request.body)username = request.POST.get('username')pwd = request.POST.get('pwd')if username == "alex" and pwd == "123":return redirect("/app02/test/")else:# print(reverse('login', args=(10,))) # 無名分組# print(reverse('login', kwargs={"m":"07"})) # 有名分組# return redirect(reverse('login', args=(10,)))# return redirect(reverse('login', kwargs={"m":"07"}))return redirect(reverse('app02:login'))

?

第三:同時建立temprate中的模板代碼:

運行:app01/login1/代碼發現:串了,可以在總項目的URl的配置下可以看到:

如果是訪問各個app下的相同的url 下的login1會發現后面把前面覆蓋了。

運行結果:

如下 發現登錄的是login1窗口彈出的是app02的確實app01的訪問的url被覆蓋了。

?解決辦法:名稱空間

?4.2 加命名空間

1.為了出現上面在各個不同的app應用取相同的名字的:

只有加上命名空間:

第一步:

在總項目的url下面加一個:

path('app01/', include(("app01.urls", "app01"))), # 加上名稱空間app01# path('app02/', include("app02.urls")), # 普通的路由分發path('app02/', include(("app02.urls", "app02"))), # 加上名稱空間app02
注意:include 里面是一個元祖不是一個字符串
注意普通的路由分發的寫法是:
path('app01/', include("app01.urls")), # 普通的路由分發
path('app02/', include("app02.urls")), # 普通的路由分發 ?小結:即是上面的的寫法是名稱空間加上普通路由分發的結合寫法。

?

?第二步:修改視圖函數中login中的值:(在對應的app的login函數中,重定向返回函數的時候加上)

def login(request):if request.method == "GET":return render(request, "login1.html")else:# print(request.POST)print(request.body)username = request.POST.get('username')pwd = request.POST.get('pwd')if username == "alex" and pwd == "123":return redirect("/app02/test/")else:# print(reverse('login', args=(10,))) # 無名分組# print(reverse('login', kwargs={"m":"07"})) # 有名分組# return redirect(reverse('login', args=(10,)))# return redirect(reverse('login', kwargs={"m":"07"}))# return redirect(reverse('login')) 普通的反向解析# 在反向解析的基礎上加上名稱空間寫法return redirect(reverse('app02:login'))

?

?

?第三步:在模板中修改一下:

在普通的反向解析版本的基礎上加上,<form action="{% url 'app01:login' %}">這個,。媽媽再也不用擔心,其他的app項目設置的訪問rul和我重名啦!

這樣的話,訪問app01? 中login1:

訪問app02 中login1:

總結: 1.名稱空間定義名稱空間 path('app01/', include(("app01.urls", "app01"))), path('app02/', include(("app02.urls", "app02"))),在conf.py源碼的44行 namespace = namespace or app_name2.使用名稱空間在視圖中 reverse('app01:login') 在模板中 <form action="{% url 'app01:login' %}" method="post">

?

5. 視圖層

?1.request對象

1.1 reqeust對象的屬性:

  • GET(***)
1. GET QueryDict 響應頭的內容(url后的參數) 2. 獲取一個值 request.GET.get("name") 3. 獲取多個值 request .GET.getlist("name") # 返回值為list

?

  • POST(***)
  • QueryDict 響應體里的內容
  • body
  • 原生請求體的內容
  • path (***)
  • 返回當前請求的路徑(url)
  • method(***)
  • 返回當前請求的請求方式

2.1reqeust對象的方法

  • get_full_path()
  • 獲取當前請求的完整路徑(包含參數,不包含錨點)
  • is_ajax()
  • 判斷當前請求是否是ajax請求.返回值為布爾值

2.HTTPResponse對象(響應三劍客)

2.1HTTPResponse

直接返回字符串,響應體里面的內容

2.2?render

返回一個模板文件第一個參數 request第二個參數 模板文件(login.html)第三個參數(可選) 模板需要渲染的值

?

2.3?redirect

  重定向

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/longerandergou/p/11128027.html

總結

以上是生活随笔為你收集整理的Day47 Django基础部分、路由配置、空间名称的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。