urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$',views.home), url(r'^test/$',views.test), url(r'^testadd/$',views.testadd), url(r'',views.error) ]
注意:第一個參數是正則表達式,匹配規則按照從上往下一次匹配,匹配到一個以後當即匹配,直接執行對應的視圖函數html
url(r'^$',views.home)
url(r'',views.error)
(將加括號的正則表達式匹配到的內容當作位置參數自動傳遞給對應的視圖函數)前端
# 路由 url(r'^test/(\d+)/',views.test), # 匹配一個或多個數字 # 視圖 def test(request,xxx): print(xxx) return HttpResponse('test')
(將加括號的正則表達式匹配到的內容當作關鍵字參數自動傳遞給對應的視圖函數)python
# 路由 url(r'^test/(?P<year>\d+)/',views.test), # 匹配一個或多個數字 # 視圖 def test(request,year): print(year) return HttpResponse('test')
注意: 無名分組和有名分組不能混着用!!!git
url(r'^test/(\d+)/(?P<year>\d+)/',views.test) # 不能混着用
可是 支持用一類型多個形式匹配。正則表達式
無名分組多個 url(r'^test/(\d+)/(\d+)/',views.test), 有名分組多個 url(r'^test/(?P<year>\d+)/(?P<xxx>\d+)/',views.test),
(根據名字動態獲取到對應路徑)django
# 路由 from django.shortcuts import reverse url(r'^index6668888/$',views.index,name='index') # 能夠給每個路由與視圖函數對應關係起一個名字 # 這個名字可以惟一標識出對應的路徑 # 注意這個名字不能重複是惟一的 # 前端使用 {% url 'index' %} {% url '你給路由與視圖函數對應關係起的別名' %} # 後端使用 reverse('index') reverse('你給路由與視圖函數對應關係起的別名')
# 路由 url(r'^test/(\d+)/',views.test,name='list') # 後端使用 print(reverse('list',args=(10,))) # 前端使用 {% url 'list' 10 %} (10 不是固定的,能夠是後端渲染的變量)
示例:json
# 後端傳給前端 user_list = models.User.objects.all() # 前端模板語法 {%for user_obj in user_list%} <a href='edit/{{ user_obj.pk }}/'></a> {% endfor %} # —————————————————————————————————————————— # # Django路由 url(r'^edit/(\d+)/',views.edit,name='edit') # 後端視圖函數 from django.shortcuts import reverse def edit(request,edit_id): url = reverse('edit',args=(edit_id,)) # 使用模板爲 {% url 'edit' edit_id %}
後端使用 # 後端有名分組和無名分組均可以用這種形式 print(reverse('list',args=(10,))) # 下面這個瞭解便可 print(reverse('list',kwargs={'year':10})) 前端使用 # 前端有名分組和無名分組均可以用這種形式 {% url 'list' 10 %} # 下面這個瞭解便可 {% url 'list' year=10 %}
後端 reverse('list',args=(10,)) # 這裏的數字一般都是數據的主鍵值 前端 {% url 'list' 10 %}
django每個app下面均可以有本身的urls.py路由層,templates文件夾,static文件夾後端
項目名下urls.py(總路由)再也不作路由與視圖函數的匹配關係而是作路由的分發app
from django.conf.urls import include # 路由分發 注意路由分發總路由千萬不要$結尾 url(r'^app01/',include(app01_urls)), url(r'^app02/',include(app02_urls)) # 在應用下新建urls.py文件,在該文件內寫路由與視圖函數的對應關係便可 from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/',views.index) ]
url(r'^app01/',include(app01_urls,namespace='app01')), url(r'^app02/',include(app02_urls,namespace='app02')) app01.urls.py from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/',views.index,name='index') ] app02.urls.py from django.conf.urls import url from app02 import views urlpatterns = [ url(r'^index/',views.index,name='index') ] app01.views.py reverse('app01:index') app02.views.py reverse('app02:index')
搜索優化seo函數
url(r'^index.html',views.index,name='app01_index')
不一樣的項目配置不一樣的python解釋器 django1.0與django2.0之間的區別 django2.0裏面的path第一個參數不支持正則,你寫什麼就匹配,100%精準匹配 django2.0裏面的re_path對應着django1.0裏面的url 雖然django2.0裏面的path不支持正則表達式,可是它提供五個默認的轉換器 str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式 int,匹配正整數,包含0。 slug,匹配字母、數字以及橫槓、下劃線組成的字符串。 uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)
1.正則表達式 2.類 3.註冊 # 自定義轉換器 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') PS:路由匹配到的數據默認都是字符串形式
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') 不管是FBV仍是CBV路由層都是路由對應視圖函數內存地址 urlpatterns = [ # url(r'^mycls/',views.view) 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')
from django.http import JsonResponse def index(request): # res = {'name':'Jason大帥比','password':18} # return HttpResponse(json.dumps(res)) return JsonResponse({'name':'Jason大帥比','password':'1888888'},json_dumps_params={'ensure_ascii':False})
前端須要注意的點: 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)