url函數:url('^index/$',views.index,{'msg':'默認參數'},name='路由別名")html
有名無名分組:/page/10/1前端
路由層:'^page/(\d+)/(\d+)/$' 視圖層def page (request,n1,n2) n1=10,n2=1python
路由層:'^page/(?P<num>\d+)/(?P<id>\d+)/$'django
視圖層:def page(request,id,num) num =10,id=1app
注:有名無名不能混用函數
路由分發:post
有多個app 1.建立app:startapp app_name 優化
2.配置,在settings中配置app信息 在應用子級目錄下建立urls.py網站
主路由:url('^app01/',include('app01.urls',namespace='app01'))ui
子路由:url('^login/$',views.login,name='login')
訪問:/app01:login/
4.反向解析:{% url 'app01:login' [參數們] %}
reverse('app01:login'[,args=() |kwargs={}])
5.2.x新特性:url,include,re_path,path
re_path同url
path採用的是絕對字符串匹配path('index/',views.index,name='indedx'')
path:str|int|slug|uuid|path 語法:
path('page/<int:id>/',...)
自定義轉換器:1.按格式自定義轉化器類
2.註冊自定義轉化器類並起轉化器名
3.在路由中用轉化器名進行匹配
6.多app共存問題
路由問題:import app01.views as app01_view |路由分發
模板問題:在templates文件夾下創建與應用名相同的文件夾,將該應用的模板文件放置本身應用名文件夾下,render(request,'app01/login.html')
在各自app應用下創建與應用同名文件夾
放置本身的模板頁面
解決版本共存
1.用pycharm選擇virtualenv建立一個純淨環境
2.將環境copy到須要指定長期使用的文件夾下
3.再次建立項目時,將該環境添加到pycharm環境選擇中
4.爲該環境添加須要處理的版本共存包
路由層:
from django.urls import path,re_path
urlpatterns = [ re_path('^$',root,name='root')
# 其餘路由...
# 404配在最下方
re_path('/$', error)]
## 5、2.x路由分發
```python
'''
1.無名稱空間
主路由:
path('app01/', include('app01.urls'))
子路由:
path('test/', views.test)
2.有名稱空間
主路由:
path('app01/', include(('app01.urls', 'app01'))),
子路由:
path('test/', views.test, name='test')
模板層:
{% url 'app01:test' %}
## 6、僞靜態
```python
'''
動態頁面:數據內容會發生變化的頁面
靜態頁面:數據內容不會發生變化的頁面
針對SEO(搜索引擎優化),靜態頁面更容易被搜索引擎網站收錄
僞靜態就是講動態頁面假裝成靜態頁面,
容易被搜索引擎網站收錄,從而增長搜索機率,提升流量
'''
'''
路由層:
url('^index/$', views.index),
url('^article/(?P<id>(\d+)).html/$',
views.article, name='article')
視圖函數層:
def index(request):
return render(request, 'index.html')
def article(request, id):
return render(request, 'article.html', {'id': id})
模板層:
index.html
<a href="{% url 'article' 1 %}">第一篇文章</a>
<a href="{% url 'article' 2 %}">第二篇文章</a>
<a href="{% url 'article' 3 %}">第三篇文章</a>
article.html
<h1>第{{ id }}篇文章</h1>
'''
```
## 7、request對象
```python
'''
1. method: 請求方式
2. GET: get請求的參數
3. POST: post請求的參數(本質是從bdoy中取出來)
4. body: post提交的數據(不能直接查看)
5. path: 請求的路徑,不帶參數
6. request.get_full_path(): 請求路徑,帶參數
7. FILES: 文件數據
8. encoding: 編碼格式
9. META: 數據大彙總的字典
'''
```
## 8、FBV與CBV
```python
'''
FBV:function base views 函數方式完成視圖響應
CBV:class base views 類方式完成視圖響應
'''
'''
視圖層:
from django.shortcuts import HttpResponse
from django.views import View
class CBVView(View):
def get(self, request):
return HttpResponse("響應get請求")
def post(self, request):
return HttpResponse("響應post請求")
路由層:
url('^path/$', views.CBVView.as_views())
'''
```
## 9、文件上傳
```python
'''
前端:upload.html頁面
1.往自身路徑發送post請求,要將第四個中間件註釋
2.multipart/form-data格式容許發送文件
3.multiple屬性表示能夠多文件操做
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="files" multiple="multiple">
<input type="submit" value="上傳">
</form>
後臺:re_path('^upload/$', upload)def upload(request): if request.method == "GET": return render(request, 'upload.html') if request.method == "POST": # 若是一個key對應提交了多條數據,get取最後一個數據 ,getlist取所有數據 last_file = request.FILES.get('files', None) files = request.FILES.getlist('files', None) # import django.core.files.uploadedfile.TemporaryUploadedFile # file是TemporaryUploadedFile類型, 本質是對系統file類封裝, 就是存放提交的文件數據的文件流對象 for file in files: with open(file.name, 'wb') as f: for line in file: # 從file中去數據寫到指定文件夾下的指定文件中 f.write(line) return HttpResponse('上傳成功')'''