3、Django的urls

Django的urls相關html

1、url配置正則表達式

無名分組django

urls.py:app

url(r'^books/(\d{4})/', views.books),

views.py:函數

def books(request,year): # 必須給一個參數
    print(year)
    return HttpResponse(year)

好比用戶輸入網址:127.0.0.1:8000/books/2000,則返回頁面打印的就是2000;url

輸入127.0.0.1:8000/books/2018,則返回頁面打印的就是2018;code

效果:htm

位置參數(按順序傳參)blog

urls:接口

url(r'^books/(\d{4})/', views.year_books), #匹配年份的
    http://127.0.0.1:8000/books/2001/
url(r'^books/(\d{4})/(\d{1,2})/', views.year_month_books), #匹配年份和月份的
    http://127.0.0.1:8000/books/2001/12/

視圖 views文件:

def year_month_books(request,year,month): #位置參數,第一個參數接收的就是無名分組路徑中匹配到的第一個分組的數據,第二個參數接收的就是無名分組路徑中匹配到的第二個分組的數據
    print(year,month)
    # return render(request,'books.html')
    return HttpResponse(year+month)

假若有這樣一個需求:用戶輸入127.0.0.1:8000/books/2001,則只匹配年份2001;輸入127.0.0.1:8000/books/2001/12,則匹配年份和月份

urls.py:

urlpatterns = [
    url(r'^books/(\d{4})/$', views.year_books), # 在末尾加$,嚴格匹配,不然不管用戶只輸入了年份,仍是輸年份和月份,都只匹配這個,顯示年份
    url(r'^books/(\d{4})/(\d{1,2})/', views.year_month_books)

views.py:

def year_books(request,year):
    print(year)
    return HttpResponse(year)

def year_month_books(request,year,month):
    print(year)
    print(month)
    return HttpResponse(year+month)

注意事項:

  1. urlpatterns中的元素按照書寫順序從上往下逐一匹配正則表達式,一旦匹配成功則再也不繼續。
  2. 若要從URL中捕獲一個值,只須要在它周圍放置一對圓括號(分組匹配)。
  3. 不須要添加一個前導的反斜槓(也就是寫在正則最前面的那個/),由於每一個URL 都有。例如,應該是^articles 而不是 ^/articles。
  4. 每一個正則表達式前面的'r' 是可選的,表示轉義,可是建議加上。
  5. ^articles$ 以什麼結尾,以什麼開頭,嚴格限制路徑

補充:

# 是否開啓URL訪問地址後面不爲/跳轉至帶有/的路徑的配置項
# 寫在settings文件裏
APPEND_SLASH=True  
# 默認是True,好比輸入127.0.0.1:8000/books/2001,2001後面沒有加/,會返回一個3xx的狀態碼,而後給2001後面拼一個/,而後再去請求;

APPEND_SLASH=False 
# 設置了False,此時再輸入127.0.0.1:8000/books/2001就訪問不到了,必須在2001後面加/才能夠訪問

有名分組

urls:

url(r'^books/(?P<year>\d{4})/(?P<month>\d{1,2})/', views.year_month_books),

views:

def year_month_books(request,month,year): #形參名稱要和url中的分組名對應好,參數位置就沒有要求了
    print(year,month)
    return HttpResponse(year+month)

默認值

# urls.py中
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^blog/$', views.page),
    url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]


# views.py中,能夠爲num指定默認值
def page(request, num="1"):
    pass

好比:

urls:

urlpatterns = [
    url(r'^books/$', views.books),
    url(r'^books/(?P<num>\d{4})/',views.books),
]

views:

def books(request,num='10'):
    print(num)
    return HttpResponse(num)

效果:

當輸入網址127.0.0.1:8000/books/,走默認值,頁面顯示默認值10:

當輸入網址127.0.0.1:8000/books/2002/,被下面的正則匹配到,顯示後面的數,好比2002:

2、url路由分發——include

views和models文件都放在了app的應用裏面,而urls.py這個文件放在了項目的文件裏,說明全部的app都在使用這個urls.py文件,當項目的應用有不少個,那urls文件裏面要寫不少的對應關係,全部的app的url都寫在這一個文件中,耦合度過高,多以Django提供了一個分發接口——include

也就是在每一個app應用文件裏都寫一個屬於本身的urls.py文件,而後在項目文件的urls.py文件用include分發藉口

例子:

由於pycharm新建時,只能創建一個應用app01,再創建一個應用app02方法:

  1. 先在settings配置文件配置下app02(app01在創建項目時候自動配置了)
    INSTALLED_APPS = [
    ......
    'app01.apps.App01Config',
    'app02.apps.App02Config',
    ]
  2. 應用 app01 下創建urls.py文件,寫本應用對應的路徑關係
    from django.conf.urls import url
    from app01 import views

    urlpatterns = [
        url(r'^index/', views.index),
    ]

    應用 app01 下的視圖 views.py
    from django.shortcuts import render,HttpResponse
    # Create your views here.

    def index(request):
        return HttpResponse('應用界面01')
  3. 應用 app02 下創建urls.py文件
    from django.conf.urls import url
    from app02 import views

    urlpatterns = [
        url(r'^home/',views.home ),
    ]

    應用 app02 下的視圖 views.py
    from django.shortcuts import render,HttpResponse
    # Create your views here.

    def home(request):
        return HttpResponse('應用界面02')
  4. 主項目中的urls,要用 include 分發接口
    from django.conf.urls import url,include # 記得要導入include
    from django.contrib import admin

    urlpatterns = [
    
        url(r'^app01/', include('app01.urls')),
        # 至關於:http://127.0.0.1:8000/app01/asdsfdfeas....
    
        url(r'^app02/', include('app02.urls')),
        # 至關於:http://127.0.0.1:8000/app02/.....
    ]
    
    # 注意點:想用include分發路徑,千萬不要用到 $ ,不然沒法匹配.好比:url(r'^app01/$', include('app01.urls'))
  5. 此時在網址輸入 127.0.0.1:8000/app01/index/,先走主項目的urls,匹配到127.0.0.1:8000/app01/,把剩餘的路徑 index/ 經過include的功能傳給app01裏面的urls,匹配index/,獲得結果

    同理,輸入 127.0.0.1:8000/app02/home/,也能拿到對應的結果

    在此基礎上,有這樣一個需求:給整個項目作一個首頁,每一個應用也都作一個首頁

  6. 再創建一個應用app03,專門作整個項目的首頁
    主項目的urls:
    from django.conf.urls import url,include
    from app03 import views

    urlpatterns = [
    
        url(r'^$', views.base), # 匹配空內容,就是輸入ip和端口後什麼也沒輸入
        # 注意:別忘記寫^$
    
        url(r'^app01/', include('app01.urls')),
        # http://127.0.0.1:8000/app01/asdsfdfeas....
        url(r'^app02/', include('app02.urls')),
        # http://127.0.0.1:8000/app02/.....
    ]

    app03 下的 views:
    from django.shortcuts import render

    def base(request):
        return render(request,'base.html')
    base.html 放在 模板 templates 文件夾中

    歡迎來到首頁

  7. 製做app01的首頁:
    app01 下的urls:
    from django.conf.urls import url
    from app01 import views

    urlpatterns = [
        url(r'^$',views.firstbase ),
        url(r'^index/', views.index),
    ]

    app01 下的views:
    from django.shortcuts import render,HttpResponse

    def index(request):
        return HttpResponse('應用界面01')
    
    def firstbase(request):
        return render(request,'app01base.html')
    app01base.html 放在 模板 templates 文件夾中

    應用1的首頁

  8. 製做app02的首頁:
    app02 下的urls:
    from django.conf.urls import url
    from app02 import views

    urlpatterns = [
        url(r'^$',views.secondbase ),
        url(r'^home/',views.home ),
    ]

    app02 下的views:
    from django.shortcuts import render,HttpResponse

    def home(request):
        return HttpResponse('應用界面02')
    
    def secondbase(request):
        return render(request,'app02base.html')
    app02base.html 放在 模板 templates 文件夾中

    應用2的首頁

    1. 效果:
      輸入127.0.0.1:8000,就是項目的首頁;
      127.0.0.1:8000/app01/ ,就是應用1的首頁;
      127.0.0.1:8000/app02/ ,就是應用2的首頁;
      127.0.0.1:8000/app01/index 或者127.0.0.1:8000/app02/home還照樣能拿到對應的內容

3、簡單

  1. url配置

    urls.py文件中寫在urlpatterns = []中
    簡單的路由
    from app01 import views
    url(r'^index/',views.index),
    無名分組
    url(r'^index/(\d+)/(\d+)/',views.index), --- def index(request,n,m) 位置參數
    有名分組
    url(r'^index/(?P \d+)/(?P \d+)/',views.index), -- def index(request,year,month) 關鍵字參數,參數順序不要求

    url(r'^index/$',views.index),
    url(r'^index/(?P \d+)/,views.index),
    視圖函數參數默認值,
    def index(request,num='1'):
    print(num)

  2. 路由分發

    from django.conf.urls import url,include url(r'app01/',include('app01.urls')),

相關文章
相關標籤/搜索