1. 程式人生 > >Django筆記 通過URL傳遞引數的4種方法 + 補充

Django筆記 通過URL傳遞引數的4種方法 + 補充

【轉自ian的個人部落格】 和 補充
感謝ian的總結!

1. 無引數情況

配置URL及其檢視如下:
(r’^hello/$’, hello)

 def hello(request):
    return HttpResponse("Hello World")

2 、傳遞一個引數

配置URL及其檢視如下,URL中通過正則指定一個引數:
(r’^plist/(.+)/$’, helloParam)

 def helloParam(request,param1):
    return HttpResponse("The param is : " + param1)

3 傳遞多個引數

參照第二種情況,以傳遞兩個引數為例,配置URL及其檢視如下,URL中通過正則指定兩個引數:
(r’^plist/p1(\w+)p2(.+)/$’, helloParams)

 def helloParams(request,param1,param2):
    return HttpResponse("p1 = " + param1 + "; p2 = " + param2)

從這裡可以看出,檢視的引數是根據URL的正則式,按順序匹配並自動賦值的。雖然這樣可以實現任意多個引數的傳遞,但是卻不夠靈活,URL看起來很混亂,而且由於是正則匹配,有些情況下容易出錯。

4 通過傳統的”?”傳遞引數

例如,http://127.0.0.1:8000/plist/?p1=china&p2=2012,url中‘?’之後表示傳遞的引數,這裡傳遞了p1和p2兩個引數。
通過這樣的方式傳遞引數,就不會出現因為正則匹配錯誤而導致的問題了。在Django中,此類引數的解析是通過request.GET.get方法獲取的。
配置URL及其檢視如下:
(r’^plist/$’, helloParams1)

 def helloParams(request):
    p1 = request.GET.get('p1')
    p2 = request.GET.get('p2'
) return HttpResponse("p1 = " + p1 + "; p2 = " + p2)

輸出結果為”p1 = china; p2 = 2012″

5、使用關鍵字引數而非位置引數

在 Python 正則表示式中,命名的正則表示式組的語法是 (?Ppattern) ,這裡 name 是組的名字,而
pattern 是匹配的某個模式。
下面是一個使用無名組的 URLconf 的例子:

from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^articles/(\d{4})/$', views.year_archive),
(r'^articles/(\d{4})/(\d{2})/$', views.month_archive),
)

下面是相同的 URLconf,使用命名組進行了重寫:

from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^articles/(?P<year>\d{4})/$', views.year_archive),
(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', views.month_archive),
)

這段程式碼和前面的功能完全一樣,只有一個細微的差別: 取的值是以關鍵字引數的方式而不是以位置引數的方
式傳遞給檢視函式的。
例如,如果不帶命名組,請求 /articles/2006/03/ 將會等同於這樣的函式呼叫:

month_archive(request, '2006', '03')

而帶命名組,同樣的請求就會變成這樣的函式呼叫:

month_archive(request, year='2006', month='03')

使用命名組可以讓你的URLconfs更加清晰,減少搞混引數次序的潛在BUG,還可以讓你在函式定義中對引數重新排序。 接著上面這個例子,如果我們想修改URL把月份放到 年份的 前面 ,而不使用命名組的話,我們就不得不去修改檢視 month_archive 的引數次序。 如果我們使用命名組的話,修改URL裡提取引數的次序對檢視沒有影響。
當然,命名組的代價就是失去了簡潔性: 一些開發者覺得命名組的語法醜陋和顯得冗餘。 命名組的另一個好處就是可讀性強。

需要注意的是如果在URLconf中使用命名組,那麼命名組和非命名組是不能同時存在於同一個URLconf的模式中的。 如果你這樣做,Django不會丟擲任何錯誤,但你可能會發現你的URL並沒有像你預想的那樣匹配正確。
具體地,以下是URLconf直譯器有關正則表示式中命名組和 非命名組所遵循的演算法:

  • × 如果有任何命名的組,Django會忽略非命名組而直接使用命名組。
  • × 否則,Django會把所有非命名組以位置引數的形式傳遞。
  • × 在以上的兩種情況,Django同時會以關鍵字引數的方式傳遞一些額外引數。

    更具體的資訊可參考下一節。

相關推薦

Django筆記 通過URL傳遞引數4方法 + 補充

【轉自ian的個人部落格】 和 補充 感謝ian的總結! 1. 無引數情況 配置URL及其檢視如下: (r’^hello/$’, hello) def hello(request): return HttpResponse("Hell

微信小程式 頁面跳轉如何通過url傳遞引數

var fb_id = 132在跳轉地址後wx.naviga在跳轉地址後teTo({ url: `../free/sellers/sellers?fb_id=${fb_id}`, })然後在新頁面通過js獲取資料 onLoad: function (optio

Vue 路由傳遞引數 3方法

一、用name傳遞引數  用name傳值並顯示在模板裡:在路由檔案src/router/index.js裡配置name屬性。1234567routes: [    {      path: '/Message',      name: 'Message',      comp

JSP頁面通過URL傳遞中文引數出現中文亂碼問題

做專案時遇到這個問題 問題描述:通過點選這個引數名並進行跳轉control層,進行引數接受並處理。${cs.name}裡面包含中文 <a href="${pageContext.request.contextPath}/recommend_navCategory?name=${cs.n

JSP頁面通過URL傳遞中文引數出現中文亂碼的解決方法

JSP頁面: var url ="AddPatrolAjax?domain="+domain.value;//domain.value含有中文 伺服器端: String domain = new Str

JS通過Url傳遞中文引數,c#獲取引數

最近遇到一個JS通過Url傳遞中文引數,c#獲取中文引數亂碼的問題。解決方法如下: 正確的方法是: JS var reqUrl = document.location + "?key=" + encodeURI(keyword); C# string keyword =

Django:URL-patterns的高階使用方式與URL傳遞引數

# urls.py from django.conf.urls.defaults import * from mysite import views urlpatterns = patterns('', (r'^blog/$', views.page), #URLconf中把特殊情況放在首位的

js獲取iframe通過url傳遞的參數

ear 路徑 del bst func tel earch -i return 獲取iframe的url路徑:window.parent.document.getElementById("Ateon-SetParent-iframe").contentWindow.loca

jsp頁面如何通過url傳遞漢字

第一個 簡單 parameter 通過 開發 如何 漢字 param 方法 初學java web開發,第一個問題就是jsp頁面如何通過url傳遞漢字?第一個index.jsp頁面<a href="helloword.jsp?name=<%=URLEnc

django 筆記8 url模板 自定義函數 simple_tag

增刪改查 AI gis code core coo oct print sim 感謝alex老師~知識點: URL - 兩個沒見 url>路由系統> 函數或類 > 返回字符串 Form表單提交:

tms web core 通過URL 傳遞參數

lib 一個 ont 漢字 bar send alt forms 驗證 一般我們都會通過URL 給服務器傳遞很多參數,通過參數來決定對應的處理,今天就大概講一下 如果通過URL 參數實現一些功能。 1、通過參數跳入不同的界面 首先我們先建立一個tms web core

SpringMVC通過ajax傳遞引數list物件或傳遞陣列物件到後臺

環境 前臺傳遞引數到後臺 前臺使用ajax 後臺使用springMVC 傳遞的引數是N多個物件 JSON物件和JSON字串 在SpringMVC環境中,@RequestBody接收的是一個Json物件的字串,而不是一個Json物件。然而在aja

Vue中通過路由傳遞引數

Vue中可以通過路由傳遞引數,具體實現也比較方便 以 '/aaa/bbb?引數名='+引數值格式傳遞引數 let self = this; let toPath = '/aaa/bbb?recordedSpeed='+self.recordedSpeed; self.$router.

url 傳遞引數(特殊字元) 解決方法

在做網頁的時候,偶爾會遇到url被截斷的情況,一般是出現在有引數的url中,比如www.baidu.com?a=1&b=2,有時候就會出現url只傳遞了www.baidu.com?a=1後邊的url被截斷了,出現這種情況一般最有效的解決方案是把&符號用%26替換,這樣ww

JS獲取URL中引數值的4方法

  方法一:正則法 function getQueryString(name) {var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');var r = window.location.se

彙編實驗————實驗四:串處理與通過傳遞引數的使用

實驗名稱 串處理與通過棧傳遞引數的使用 實驗目的 掌握串處理指令在陣列中的運用。 實驗要求 從鍵盤接收一個字串,然後將字串中的大寫字母轉為小寫字母,最後將轉換以後的結果輸出。 實驗內容 1、將字串中的大寫字母轉為小寫字母實現為一個過程(procedure),且通過棧來

javaScript通過URL獲取引數

  // 函式方法 function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)","i"); var r = window.location.

C/C++|Qt工作筆記-4方法判斷當前物件(類)名或標識(繼承發,typeid法,元物件className()法,Q_CLASSINFO法)

回想起3個月前,剛剛參加工作也做過類似的筆記,但只有2種方法,估計剛畢業沒有什麼墨水,經過3個月時間又多了2種方法: 這些方法都可用於RTTI 第一個方法是繼承發(C++中很推薦用這個,感覺用這個結構會很清晰): 執行截圖如下: 原始碼如下: #

python argparse模組通過後臺傳遞引數

cmd.py # -*- coding: utf-8 -*- from PySide import QtGui, QtCore import os,sys import tory import argp

vue前端通過url獲取引數,進行取值報錯,undified

業務程式碼: if (ddl == "ddl") { var result = JSON.parse(result); this.flightList=result.flightTicket return }