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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django 路由层

發(fā)布時(shí)間:2023/12/1 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django 路由层 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Django的下載與基本命令

  • 下載Django:pip3 install django==2.0.1
  • 創(chuàng)建一個(gè)django project: django-admin startproject luffy
  • 在mysite目錄下創(chuàng)建應(yīng)用:python manage.py startapp app01
  • 啟動(dòng)django項(xiàng)目:python manage.py runserver 8080 我們?cè)L問:http://127.0.0.1:8080/時(shí)就可以看到:
  • python manage.py makemigrations
  • python manage.py migrate
  • python manage.py createsuperuser
  • 命令行查看django版本:python -m django --version

一、文件介紹

  • manage.py ----- Django項(xiàng)目里面的工具,通過它可以調(diào)用django shell和數(shù)據(jù)庫等。
  • settings.py ---- 包含了項(xiàng)目的默認(rèn)設(shè)置,包括數(shù)據(jù)庫信息,調(diào)試標(biāo)志以及其他一些工作的變量。
  • urls.py ----- 負(fù)責(zé)把URL模式映射到應(yīng)用程序。

靜態(tài)文件

?
1 2 3 4 5 #在settings.py中: STATIC_URL = '/static/' STATICFILES_DIRS=( ????os.path.join(BASE_DIR,'static'), )

路由

URL配置(URLconf)就像Django 所支撐網(wǎng)站的目錄。它的本質(zhì)是URL與要為該URL調(diào)用的視圖函數(shù)之間的映射表;你就是以這種方式告訴Django,對(duì)于客戶端發(fā)來的某個(gè)URL調(diào)用哪一段邏輯代碼對(duì)應(yīng)執(zhí)行。

一、簡(jiǎn)單的路由配置

  • 若要從URL 中捕獲一個(gè)值,只需要在它周圍放置一對(duì)圓括號(hào)。
  • 不需要添加一個(gè)前導(dǎo)的反斜杠,因?yàn)槊總€(gè)URL 都有。例如,應(yīng)該是^articles 而不是 ^/articles。
  • 每個(gè)正則表達(dá)式前面的'r' 是可選的但是建議加上。它告訴Python 這個(gè)字符串是“原始的” —— 字符串中任何字符都不應(yīng)該轉(zhuǎn)義
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 在urls.py中: from django.urls import path,re_path from app01 import views # 路由配置: 路徑--------->視圖函數(shù) urlpatterns = [ ????path('admin/', admin.site.urls), ????#無名分組:捕獲的值作為位置參數(shù)傳遞給視圖函數(shù) ????re_path(r'^articles/([0-9]{4})/$', views.year_archive), #year_archive(request,'2009') ????re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),# month_archive(request,'2009','12') ????re_path(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), # month_archive(request,'2009','12','1'),# month_archive(request,'2009','12','13') ????#有名分組:捕獲的值作為關(guān)鍵字參數(shù)傳遞給視圖函數(shù) ????re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),# month_archive(request, year='2005') ????re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), # month_archive(request, year='2005', month='03') ????re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail), # month_archive(request, year='2003', month='03', day='03') ]

二、分發(fā)

?
1 2 3 4 5 6 7 8 9 10 11 # 在urls.py中: from django.urls import path, re_path, include urlpatterns = [ ????path('admin/', admin.site.urls), ????# 分發(fā) ????re_path(r"^app01/", include("app01.urls")), ????re_path(r"^app02/", include("app02.urls")), ????re_path(r"^", include("app01.urls")), ]

三、反向解析

獲得URL 的最終形式,,對(duì)于不同層級(jí),Django 提供不同的工具用于URL 反查:

  • 在模板中:使用url 模板標(biāo)簽。
  • 在Python 代碼中:使用from django.urls import reverse
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 # 在urls.py中: from django.urls import path, re_path, include from app01 import views urlpatterns = [ ????path('admin/', admin.site.urls), ????# 反向解析 ????path('login.html/', views.login, name="Log"), ????re_path(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'), ????re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive, name='news-year'), ] # 在模板中:注意參數(shù) """ <form action="{% url 'Log' %}" method="post"></form> <a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a> <ul> {% for yearvar in year_list %} <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li> {% endfor %} </ul> <!--多個(gè)參數(shù)--> <a href="{% url "n4" i1 i2 %}">編輯</a> """ # 在views.py中: from django.urls import reverse from django.shortcuts import render, HttpResponse, redirect def redirect_to_year(request): ????# 無參 ????url = reverse('Log') ????print(url) ????# 有參 ????year = 2006 ????url88 = reverse('news-year-archive', args=(year,)) ????url99 = reverse('news-year', kwargs={'year':2008}) ????return HttpResponse('OK')

四、名稱空間

命名空間(英語:Namespace)是表示標(biāo)識(shí)符的可見范圍。一個(gè)標(biāo)識(shí)符可在多個(gè)命名空間中定義,它在不同命名空間中的含義是互不相干的。我們?cè)陂_發(fā)項(xiàng)目時(shí),會(huì)經(jīng)常使用name屬性反解出URL,當(dāng)不小心在不同的app的urls中定義相同的name時(shí),可能會(huì)導(dǎo)致URL反解錯(cuò)誤,為了避免這種事情發(fā)生,引入了命名空間。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 # 在urls.py中: from django.urls import path, re_path, include, url urlpatterns = [ ????path('admin/', admin.site.urls), ????# 分發(fā) ????re_path(r"^app01/", include("app01.urls")), ????re_path(r"^", include("app01.urls")), ????# 兩個(gè)應(yīng)用中,URL 模式名字一樣時(shí): ????re_path(r"^app01/", include(("app01.urls", "app01"))), ????re_path(r"^app02/", include(("app02.urls", "app02"))), ] # 模板中 { % url 'app01:index' %} { % url 'app02:index' pk=item.id %}? 帶參數(shù)的 # app01中的urls.py from django.urls import path, re_path from app01 import views urlpatterns = [ ????re_path("index/", views.index, name="index") ] # app02中的urls.py from django.urls import path, re_path from app02 import views urlpatterns = [ ????re_path("index/", views.index, name="index") ] # app01中的views.py from django.shortcuts import render, HttpResponse,redirect from django.urls import reverse def index(reqeust): ????return redirect(reverse("app01:index")) # app02中的views.py from django.shortcuts import render, HttpResponse from django.urls import reverse def index(reqeust): ????return redirect(reverse("app02:index"))

1、注意

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # 'Specifying a namespace in include() without providing an app_name ' """ 方法1:在proj/urls.py中修改 """ urlpatterns = [ ????# url(r'^rbac/', include('rbac.urls', namespace='rbac')), ????url(r'^rbac/', include(('rbac.urls','rbac'), namespace='rbac')), ] """ 方法2:在rbac/urls.py中 添加 app_name='rbac' """ app_name='rbac' urlpatterns = [ ????url(r'^role/list/$', role.role_list, name='role_list'),? # rbac:role_list ????... ] """ 'ForeignKey' object has no attribute 'rel' """ self.remote_field = rel # return SearchGroupRow(title, field_object.rel.model.objects.filter(**db_condition), self, request.GET) return SearchGroupRow(title, field_object.remote_field.model.objects.filter(**db_condition), self, request.GET)

五、django2.0版的path

1、基本實(shí)例

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 在urls.py中: from django.urls import path, re_path from app01 import views urlpatterns = [ ????re_path('articles/(?P<year>[0-9]{4})/', views.year_archive), ????re_path('article/(?P<article_id>[a-zA-Z0-9]+)/detail/', views.detail_view), ????re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/edit/', views.edit_view), ????re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/delete/', views.delete_view), ] """ 1.函數(shù) year_archive 中year參數(shù)是字符串類型的 2.三個(gè)路由中article_id都是同樣的正則表達(dá)式,但是你需要寫三遍,當(dāng)之后article_id規(guī)則改變后,需要同時(shí)修改三處代碼, 在Django2.0中,可以使用 path 解決以上的兩個(gè)問題。 """ urlpatterns = [ ????path('articles/2003/', views.special_case_2003), ????path('articles/<int:year>/', views.year_archive), ????path('articles/<int:year>/<int:month>/', views.month_archive), ????path('articles/<int:year>/<int:month>/<slug>/', views.article_detail), ]

2、基本規(guī)則

  • 使用尖括號(hào)(<>)從url中捕獲值。
  • 捕獲值中可以包含一個(gè)轉(zhuǎn)化器類型(converter type),比如使用 捕獲一個(gè)整數(shù)變量。若果沒有轉(zhuǎn)化器,將匹配任何字符串,當(dāng)然也包括了 / 字符。
  • 無需添加前導(dǎo)斜杠。

3、path轉(zhuǎn)化器

Django默認(rèn)支持以下5個(gè)轉(zhuǎn)化器:

  • str,匹配除了路徑分隔符(/)之外的非空字符串,這是默認(rèn)的形式
  • int,匹配正整數(shù),包含0。
  • slug,匹配字母、數(shù)字以及橫杠、下劃線組成的字符串。
  • uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  • path,匹配任何非空字符串,包含了路徑分隔符

4、注冊(cè)自定義轉(zhuǎn)化器

對(duì)于一些復(fù)雜或者復(fù)用的需要,可以定義自己的轉(zhuǎn)化器。轉(zhuǎn)化器是一個(gè)類或接口,它的要求有三點(diǎn):

  • regex 類屬性,字符串類型
  • to_python(self, value) 方法,value是由類屬性 regex 所匹配到的字符串,返回具體的Python變量值,以供Django傳遞到對(duì)應(yīng)的視圖函數(shù)中。
  • to_url(self, value) 方法,和 to_python 相反,value是一個(gè)具體的Python變量值,返回其字符串,通常用于url反向引用。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # urls.py: from django.urls import register_converter, path from app01 import yearconvert,views #使用register_converter 將其注冊(cè)到URL配置中: register_converter(yearconvert.FourDigitYearConverter, 'yyyy') urlpatterns = [ ????path('articles/<yyyy:year>/', views.year_archive), ] #app01.yearconvert.py: class FourDigitYearConverter: ????regex = '[0-9]{4}'? #規(guī)則 ????def to_python(self, value): ????????return int(value) # 在這轉(zhuǎn)換了類型 ????def to_url(self, value): ????????return '%04d' % value #app01.views.py: from django.shortcuts import render,HttpResponse,redirect def year_archive(request,year): ????print(year,type(year)) ????return HttpResponse('ok')

MVC與MTV模型

一、MVC

Web服務(wù)器開發(fā)領(lǐng)域里著名的MVC模式,所謂MVC就是把Web應(yīng)用分為模型(M),控制器(C)和視圖(V)三層,他們之間以一種插件式的、松耦合的方式連接在一起,模型負(fù)責(zé)業(yè)務(wù)對(duì)象與數(shù)據(jù)庫的映射(ORM),視圖負(fù)責(zé)與用戶的交互(頁面),控制器接受用戶的輸入調(diào)用模型和視圖完成用戶的請(qǐng)求,其示意圖如下所示:

二、MTV

Django的MTV模式本質(zhì)上和MVC是一樣的,也是為了各組件間保持松耦合關(guān)系,只是定義上有些許不同,Django的MTV分別是:

  • M 代表模型(Model): 負(fù)責(zé)業(yè)務(wù)對(duì)象和數(shù)據(jù)庫的關(guān)系映射(ORM)。
  • T 代表模板 (Template):負(fù)責(zé)如何把頁面展示給用戶(html)。
  • V 代表視圖(View): 負(fù)責(zé)業(yè)務(wù)邏輯,并在適當(dāng)時(shí)候調(diào)用Model和Template。
  • 除了以上三層之外,還需要一個(gè)URL分發(fā)器,它的作用是將一個(gè)個(gè)URL的頁面請(qǐng)求分發(fā)給不同的View處理,View再調(diào)用相應(yīng)的Model和Template,MTV的響應(yīng)模式如下所示:

轉(zhuǎn)載于:https://www.cnblogs.com/bubu99/p/10258417.html

總結(jié)

以上是生活随笔為你收集整理的Django 路由层的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。