Django框架-03路由層相關爲主

路由分配

第一個參數是正則表達式,匹配規則按照從上往下一次匹配,匹配到一個以後當即匹配,直接執行對應的視圖函數html

分組

無名分組

  • 無名分組(將加括號的正則表達式匹配到的內容當作位置參數自動傳遞給對應的視圖函數)

有名分組

  • 將加括號的正則表達式匹配到的內容當作關鍵字參數自動傳遞給對應的視圖函數

注意:無名分組和有名分組不能混着用!!!前端

反向解析

(根據名字動態獲取到對應路徑)python

url(r'^index6668888/$',views.index,name='index')

# 能夠給每個路由與視圖函數對應關係起一個名字
# 這個名字可以惟一標識出對應的路徑
# 注意這個名字不能重複是惟一的

無名分組反向解析

url(r'^index/(\d+)/$',views.index,name='kkk')git

前端使用

{% url 'kkk' 1%}   # 後面的數字一般都是數據的id值

後端使用

reverse('kkk',args=(1,))  # 後面的數字一般都是數據的id值

有名分組反向解析

url(r'^index/(?P<year>\d+)/$',views.index,name='kkk')正則表達式

前端反向解析django

<a href="{% url 'kkk' 1 %}">1</a>  # 推薦你使用上面這種  減小你的腦容量消耗
<a href="{% url 'kkk' year=1 %}">1</a>

後端方向解析json

print(reverse('kkk',args=(1,)))  # 推薦你使用上面這種  減小你的腦容量消耗
print(reverse('kkk',kwargs={'year':1}))
  • 反向解析的本質:就是獲取到一個可以訪問名字所對應的視圖函數

路由分發

當你的django項目特別龐大的時候 路由與視圖函數對應關係特別特別多
那麼你的總路由urls.py代碼太過冗長 不易維護後端

每個應用均可以有本身的urls.py,static文件夾,templates文件夾(******)app

建一個views文件夾 裏面根據功能的細分再建不一樣的py文件(******)函數

from django.conf.urls import url,include


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app01/',include('app01.urls')),
    url(r'^app02/',include('app02.urls')),

]

名稱空間

多個app起了相同的別名 這個時候用反向解析 並不會自動識別應用前綴
若是想避免這種問題的發生

方式1:

總路由

url(r'^app01/',include('app01.urls',namespace='app01'))
url(r'^app02/',include('app02.urls',namespace='app02'))

後端解析的時候

reverse('app01:index')
reverse('app02:index')

前端解析的時候

{% url 'app01:index' %}
{% url 'app02:index' %}

方式2:

​ ps: 起別名的時候不要衝突便可 通常狀況下在起別名的時候一般建議以應用名做爲前綴

name = 'app01_index'
name = 'app02_index'

僞靜態網頁

搜索優化seo(默認結尾.html)

url(r'^index.html',views.index,name='app01_index')

假裝的像一個正常網頁提升被百度等大爬蟲搜索到收藏記錄

虛擬環境

咱們會給每個項目 配備該項目所須要的模塊 不須要的一律不裝
虛擬環境 就相似於爲每一個項目量身定作的解釋器環境

Django2和1的區別

路由層1.X用的是url
而2.X用的是path

2.X中的path第一個參數再也不是正則表達式,而是寫什麼就匹配什麼 是精準匹配

當你使用2.X不習慣的時候  2.X還有一個叫re_path
2.x中的re_path就是你1.X的url

django2的轉換器

雖然2.X中path不支持正則表達式  可是它提供了五種默認的轉換器
        
        1.0版本的url和2.0版本的re_path分組出來的數據都是字符串類型
        默認有五個轉換器,感興趣的本身能夠課下去試一下
        str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式
        int,匹配正整數,包含0。
        slug,匹配字母、數字以及橫槓、下劃線組成的字符串。
        uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
        path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)
        
        path('index/<int:id>/',index)  # 會將id匹配到的內容自動轉換成整型

還支持自定義轉換器
        class FourDigitYearConverter:  
            regex = '[0-9]{4}'  
            def to_python(self, value):  
                return int(value)  
            def to_url(self, value):  
                return '%04d' % value  佔四位,不夠用0填滿,超了則就按超了的位數來!
            register_converter(FourDigitYearConverter, 'yyyy')  
            
            urlpatterns = [  
                    path('articles/2003/', views.special_case_2003),  
                    path('articles/<yyyy:year>/', views.year_archive),  
                    ...  
                ]

FBV與CBV

FBV: 基於函數的視圖

CBV: 基於類的視圖

  • CBV
    url(r'^mycls/',views.MyCls.as_view())

    class MyCls(View):
        def get(self,request):
            return render(request,'index.html')
        def post(self,request):
            return HttpResponse('post')
  • Django中提供了method_decorator裝飾器用於將函數裝飾器轉換爲方法裝飾器。

JsonResponse

def index(request):

# res = {'name':'nash大帥比','password':18}
    # return HttpResponse(json.dumps(res))
    return JsonResponse({'name':'nash大帥比','password':'1888888'},json_dumps_params={'ensure_ascii':False})

path()和get_full_path()

print('path:',request.path)

print('full_path:',request.get_full_path())

path: /upload_file/
full_path: /upload_file/?name=jason

request對象

當一個頁面被請求時,Django就會建立一個包含本次請求原信息的HttpRequest對象。

Django會將這個對象自動傳遞給響應的視圖函數,通常視圖函數約定俗成地使用 request 參數承接這個對象。

請求相關的經常使用值

path_info 返回用戶訪問url,不包括域名
method 請求中使用的HTTP方法的字符串表示,全大寫表示。
GET 包含全部HTTP GET參數的類字典對象
POST 包含全部HTTP POST參數的類字典對象
body 請求體,byte類型 request.POST的數據就是從body裏面提取到的

簡單的文件上傳

前端須要注意的點:

1.method須要指定成post
2.enctype須要改成formdata格式

後端暫時須要注意的是

1.配置文件中註釋掉csrfmiddleware中間件
2.經過request.FILES獲取用戶上傳的post文件數據

file_obj = request.FILES.get('my_file')

print(file_obj.name)
    with open(file_obj.name,'wb') as f:
        for line in file_obj.chunks():
            f.write(line)
相關文章
相關標籤/搜索