1. 程式人生 > >Django之url使用小技巧、專案類檢視

Django之url使用小技巧、專案類檢視

我先說一下url中踩過的坑
1.url中的’r’是什麼意思?例如:url(r'^index/', views.index),
正則表示式字串的開頭字母“r”。 它告訴Python這是個原始字串,不需要處理裡面的’/‘反斜槓(轉義字元)。 在普通Python字串中,反斜槓用於特殊字元的轉義。比如n轉義成一個換行符。 當你用r把它標示為一個原始字串後,Python不再視其中的反斜槓為轉義字元。也就是說,“n”是兩個字串:"/“和"n”。由於反斜槓在Python程式碼和正則表示式中有衝突,因此建議你在Python定義正則表示式時都使用原始字串。
2.url中的’$'是什麼意思?

url(r'^index/', views.index),
url(r'^myArticle/', views.myArticle),

如上的兩個url,當想訪問myArticle頁面時,就會一直跳轉到index頁面,這是因為沒有在index後新增上以’$'符結尾,當以index開頭所有的URL都會跳轉到這裡,從而無法訪問到myArticle頁面。

那麼正確的做法應該是在’/‘後面加上我們的’$’:

url(r'^index/$', views.index),
url(r'^myArticle/', views.myArticle),

我們在做一個專案的時候,往往不知道怎樣去設定url路由,今天我給大家介紹幾種常見的配置。

  1. 流線型配置
    \OurBlog\Article\urls.py
#coding:utf-8
from django.conf.urls import url
#流線型url配置方法1
from Article import views

urlpatterns = [
    url(r'^$', views.index),
    url(r'^index/', views.index),
    url(r'^myArticle/', views.myArticle),
    url(r'^myPicture/', views.myPicture),
    url(r'^aboutMe/', views.aboutMe),
    url(r'^connectMe/', views.connectMe),
]

\OurBlog\Article\urls.py

from django.conf.urls import url
#流線型url配置方法2

urlpatterns = [
    url(r'^$', "Article.views.index"),
    url(r'^index/', "Article.views.index"),
    url(r'^myArticle/', "Article.views.myArticle"),
    url(r'^myPicture/', "Article.views.myPicture"),
    url(r'^aboutMe/', "Article.views.aboutMe"),
    url(r'^connectMe/', "Article.views.connectMe"),
]

\OurBlog\Article\urls.py

from django.conf.urls import url,patterns
#流線型url配置方法3

urlpatterns = patterns('Article.views',
    url(r'^$', "index"),
    url(r'^index/', "index"),
    url(r'^myArticle/', "myArticle"),
    url(r'^myPicture/', "myPicture"),
    url(r'^aboutMe/', "aboutMe"),
    url(r'^connectMe/', "connectMe"),
)

url傳參:
我們在最初學習的時候,就接觸了利用匹配組進行url傳參
我們在url上用組匹配匹配到的內容會傳遞給檢視
\OurBlog\Article\urls.py

#coding:utf-8
from django.conf.urls import url,patterns

urlpatterns = patterns('Article.views',
    #........
    url(r'^connectMe/(\d{4})', "connectMe"), #組匹配
)

所以,我們在視圖裡需要引數接收
\OurBlog\Article\views.py

def connectMe(request,number):
    	return render(request, "article/aboutMe.html")

但是,我們現在要考慮兩個點

  1. 我們是否可以加入命名組
    \OurBlog\Article\urls.py
#coding:utf-8
from django.conf.urls import url,patterns

#流線型url配置方法3
urlpatterns = patterns('Article.views',
    #........
    url(r'^connectMe/(?P<year>\d{4})', "connectMe"), #組匹配
)

url當中命名組是year,views的形成必須是year
\OurBlog\Article\views.py

def connectMe(request,year):
     return render(request, "article/aboutMe.html")
  1. 當前有兩個urls
    如果在主url當中,我們發生了命名組匹配,我們的子url檢視函式都需要有這個引數
    \OurBlog\OurBlog\urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^ckeditor/', include('ckeditor_uploader.urls')),
    url(r'^Article(?P<name>\d)/', include('Article.urls')), #指出我們app的url
]

\OurBlog\Article\views.py

def index(request,name):
    	return render(request, "article/index.html")

那麼除了上述幾種方法外,我們還可以對url傳入指定值進行傳參

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    #......
  	url(r'^Article(?P<name>\d)/', include('Article.urls')), #指出我們app的url
	url(r'^Article/', include('Article.urls'),{"name": "while"}),  # 傳入指定值
    url(r'^Article(?P<name>\d)/', include('Article.urls'),{"name": "while"}),  # 傳入指定值
]

1、 傳入指定值的字典的鍵要和檢視函式的形參對應
2、 傳入指定引數的優先順序大於url匹配引數
3、 所有從url上獲取下來的引數都是字串,如果傳入數字,記得轉變型別

url反向代理
隨著APP的增多,路由的複雜,普通的寫法容易出錯

  1. 在url當中,對路由進行命名
#coding:utf-8
from django.conf.urls import url,patterns
#路由反向代理
from Article.views import *

urlpatterns = [
    url(r'^$', index),
    url(r'^index/', index, name = "ArticleIndex"),
    #......
]
  1. 前端部分使用url標籤載入,點選相應的 位置即可實現頁面跳轉
<li><a href="{% url 'ArticleIndex' %}">網站首頁</a></li>
  <ul>
    <li><a href="/aboutMe/">個人簡介</a></li>
    <li><a href="/myPicture/">個人相簿</a></li>
  </ul>
</li>
  1. 檢視函式當中使用比較繁複
from django.shortcuts import redirect #跳轉
from django.core.urlresolvers import reverse #解析路由反向代理

def connectMe(request):
    return redirect(reverse("ArticleIndex")) #重定向的時候也可以用反向路由

專案類檢視
以函式的方式定義的檢視稱為函式檢視,函式檢視便於理解。但是遇到一個檢視對應的路徑提供了多種不同HTTP請求方式支援的時候,便需要在一個函式中編寫不同的業務邏輯,程式碼可讀性與複用性都不佳。
1、 介面開發
介面的特點,對於同一個url可以有不同的操作,類檢視滿足這一點
2、 我們請求的方式不止有get和post,還有:
Put
Delete
Head
這些方法,Django預設在我們的requests請求當中已經封裝好get和post方法
Request.GET
Request.POST
沒有對其他方法的封裝,這個在我們使用的時候,就需要通過檢視類來定義

from django.http import JsonResponse  #返回json資料
from django.views.generic import View #檢視類的父類

class Api(View):
    def get(self,request):
        """
        這個方法處理get請求
        :param request:
        :return:
        """
        return JsonResponse({"method": request.method})

    def post(self, request):
        """
        這個方法處理get請求
        :param request:
        :return:
        """
        return JsonResponse({"method": request.method})

那麼我們在urls呼叫要注意,需要使用as_view()方法。as_view()是一個類方法,呼叫它返回一個view方法,view轉到dispatch(),dispatch()會自動判斷當前的請求方式,根據這個請求方式找到對應的真正view函式

from Article.views import *

urlpatterns = [
#......
    url(r'^api/', Api.as_view()),
]

效果如下:
在這裡插入圖片描述