第一個參數是正則表達式,匹配規則按照從上往下一次匹配,匹配到一個以後當即匹配,直接執行對應的視圖函數html
注意:無名分組和有名分組不能混着用!!!前端
(根據名字動態獲取到對應路徑)python
# 能夠給每個路由與視圖函數對應關係起一個名字 # 這個名字可以惟一標識出對應的路徑 # 注意這個名字不能重複是惟一的
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起了相同的別名 這個時候用反向解析 並不會自動識別應用前綴
若是想避免這種問題的發生
總路由
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' %}
ps: 起別名的時候不要衝突便可 通常狀況下在起別名的時候一般建議以應用名做爲前綴
name = 'app01_index' name = 'app02_index'
url(r'^index.html',views.index,name='app01_index')
假裝的像一個正常網頁提升被百度等大爬蟲搜索到收藏記錄
咱們會給每個項目 配備該項目所須要的模塊 不須要的一律不裝
虛擬環境 就相似於爲每一個項目量身定作的解釋器環境
路由層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), ... ]
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裝飾器用於將函數裝飾器轉換爲方法裝飾器。
# res = {'name':'nash大帥比','password':18} # return HttpResponse(json.dumps(res)) return JsonResponse({'name':'nash大帥比','password':'1888888'},json_dumps_params={'ensure_ascii':False})
print('full_path:',request.get_full_path()) path: /upload_file/ full_path: /upload_file/?name=jason
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文件數據
print(file_obj.name) with open(file_obj.name,'wb') as f: for line in file_obj.chunks(): f.write(line)