1. 程式人生 > >Django中url以及請求響應

Django中url以及請求響應

1、url傳遞引數

1、非關鍵字引數

url地址訪問格式:/路徑/路徑/引數
urls正則的定義:/路徑/路徑/(引數匹配的正則)
注意:
    1、如果要獲取傳遞進來的引數,必須給對應的引數的正則加上()才可以提取
    2、如果url中有引數,就必須在檢視函式的形式引數上定義一個引數,用來接收,否則報錯
如果需要傳遞多個引數:
urls正則的定義:/路徑/路徑/(引數匹配的正則)/(引數匹配的正則)
注意:
    1、接收的時候,也要定義多個形式引數用來接收url傳遞的引數
    2、接收的引數,必需與傳遞的引數一一對應

2、關鍵字引數

urls正則的定義:/路徑/路徑/(?P<別名>引數匹配的正則)/(?P<別名n>引數匹配的正則n)
 url(r'urlTest3/(?P<year>\d+)/(?P<mon>\d+)/(?P<day>\d+)',views.urlTest3),
檢視函式中接收(request,別名n,別名)   注意:形式名必需與別名對應
def urlTest3(request,day,mon,year):

    return HttpResponse(str(year) + '年'+ str(mon) +'月' + str(day)+'日')
好處:會自動的用關鍵字傳遞引數,檢視函式的形參不需要一一對應

2、模板中訪問地址及傳遞引數

1、模板中使用連線

1、直接完整的url地址
    <a href = "https://www.baidu.com/">百搭</a>
2、使用相對路徑
    <a href="../relation">相對路徑</a>
3、相對於主機的路徑    ip:埠/路徑
    <a href="/day05/relation">相對路徑</a>

2、問題:開發:開發、測試、beta、正式..

開發的時候,url地址的路徑可能會修改,修改後,在對應模板中的url地址都要進行修改,而實際開發中,一個url可能會被多處使用,修改起來工作量大,容易出錯。

3、解決:url反向解析法

使用:
    1、在專案下的url中新增namespace屬性值作為標識
    如:url(r"^axfxxxx/",include("day05.urls",namespace="day05")),
    格式:url(r'^任意的路徑名/',include('應用的urls位置’,namespace='父標識名')),
    2、在應用的url中新增name屬性作為標識
    如:url(r'relationxxx/', views.relation,name="relation"),
    格式:url(r'任意的路徑名/',views.函式名,name='子標識名'),
    3、在模板使用:
    如:<a href="{%  url 'day05:relation' %}">相對路徑</a>
    格式: <a href="{%  url '父標識名:子標識名' %}">相對路徑</a>

4、反向解析–非關鍵字引數

如:<a href="{% url 'day05:urlParam' 2018 9 30 %}">反向解析攜帶引數測試</a>
url:url(r'urlParm/(\d+)/(\d+)/(\d)',views.urlParm.name = 'urlParm')
格式: <a href="{% url '父標識名:子標識名' 引數1 引數2 引數n %}">  每個引數之間用空格隔開即可

5、反向解析—關鍵字引數

如:<a href="{% url 'day05:urlParam2' month=9 day=30 year=2019%}">反向解析攜帶引數測試-關鍵字</a>
url:   url(r'urlParam2/(?P<year>\d+)/(?P<month>d+)/(?P<day>d+)', views.urlParam2,name="urlParam2"),
格式:  <a href="{% url 'day05:urlParam2' key1=value key2=value keyN=value %}">反向解析攜帶引數測試-關鍵字</a>
關鍵引數是 key=value的形式,key要與url中的別名對應,每組引數用空格隔開。

3、重定向—給使用者的請求換一個地址

HttpResponseRedirect的簡寫形式是redirect

1、普通用法

如:return HttpResponseRedirect('/day01/redirectRes')
格式:return HttpResponseRedirect('重定向的路徑')

2、反向解析法

1、不攜帶引數

如: return HttpResponseRedirect(reverse("day05:redirectRes"))
          return HttpResponseRedirect(reverse("父標識:子標識"))

2、攜帶非關鍵字引數

如: #     return HttpResponseRedirect(reverse("day05:redirectRes2",args=(2019,10,30)))
       格式:  return HttpResponseRedirect(reverse("day05:redirectRes2",args=value1,value2,valueN)))

3、攜帶關鍵字引數

return HttpResponseRedirect(reverse("day05:redirectRes3",kwargs={"year":2020,"month":10,"day":10})) 格式:  return HttpResponseRedirect(reverse("day05:redirectRes3",kwargs="key1":value1,"keyN":valueN))

4、response 響應體–響應該客戶端的資料

1、HttpResponse('字串形式的資料')  直接返回資料給客戶端
2、render(request,'模板檔案路徑',context=引數) 將引數對映到模板中,轉換成html形式的字串返回給客戶端
3、HttpResponseRedirect('url地址'或者reverse(反向解析))  重定向,將該請求轉為其他的處理方式
4、JsonResponse(data) 將data轉換成json格式的資料響應給客戶端
    1、通常是將字典形式的資料轉換成json
    strJson = {'name':'張三','age':23}   需要字典形式的資料
    return JsonResponse(strJson)
    2、將model資料轉換成Json資料
    persons = Person.objects.all().values()

        # 將queryset轉換成列表
        persons = list(persons[:])
        #將列表轉成JsonArray資料
        strData = json.dumps(persons)

        print(strData)
        print(type(strData))
        return  HttpResponse(strData)

5、request 請求體

瀏覽器會自動的將請求引數封裝成一個請求體,傳遞給伺服器。一般只會檢視引數,不能修改引數。

1、伺服器會自動的將request傳遞給檢視函式

2、request 重要的屬性

request.path  獲取請求的路徑
request.method  獲得請求的方式   GET 和 POST
request.FILES  獲取檔案資料
request.cookie
request.session
request.GET 攜帶客戶端get請求的引數
request.POST 攜帶客戶post請求的引數

3、get請求

1、request。GET中就包含了get請求的引數,request.GET是雷士字典形式的資料
2、獲取資料
    1、request.GET['引數名']  可以獲取引數名對應的資料,如果引數名不存在,會報錯。
    2、request.GET.get('引數名',預設值)  可以獲取引數名對應的資料,如果引數名不存在,不會報錯,會使用預設值, 如果不設定預設值,預設值為None。
    3、request.GET.getList("引數名")  可以獲取引數名對應的資料,如果是一個引數名對應多個數據,就可以使用getlist來獲取,結果是list形式

4、post請求

1.request.POST中就包含了post請求的引數,   request.POST是類似字典形式的資料 
2.獲取引數的用法與GET一致
3.注意: 在django的post請求中自帶csrf驗證,所有普通方式不能直接訪問,伺服器會拒絕訪問

解決: 1.直接在表單中的首行 加上  {% csrf_token %} 即可, 表示加上csrf認證
       2.去掉django的csrf認證在setting的MIDDLEWARE中將 # 'django.middleware.csrf.CsrfViewMiddleware', 登出即可