62-django-無名有名分組反向解析、路由分發、名稱空間、僞靜態、pycharm虛擬環境、django版本區別、視圖層之三板斧、JsonResponse、form表單上傳文件、FBV與CBV

今日內容概要

  • 無名有名分組反向解析
  • 路由分發
  • 名稱空間(瞭解)
  • 僞靜態(瞭解)
  • 虛擬環境(瞭解)
  • django1.X和django2.X的區別(瞭解)
  • 視圖層
    • 三板斧
    • JsonResponse
    • form表單上傳文件
    • FBV(function based view)與CBV(class based view)(視圖函數既能夠是函數也能夠是類)

今日內容詳細

無名有名分組反向解析

 1 # 無名分組反向解析
 2     url(r'^index/(\d+)/',views.index,name='xxx')
 3 
 4 # 前端
 5     {% url 'xxx' 123 %}
 6 # 後端
 7     reverse('xxx', args=(1,))
 8 
 9 """
10 這個數字寫代碼的時候應該放什麼
11     數字通常狀況下放的是數據的主鍵值  數據的編輯和刪除
12     url(r'^edit/(\d+)/',views.edit,name='xxx')
13     
14     def edit(request,edit_id):
15         reverse('xxx',args=(edit_id,))
16         
17     {%for user_obj in user_queryset%}
18         <a href="{% url 'xxx' user_obj.id %}">編輯</a>
19     {%endfor%}
20 
21 今天每一個人都必須完成的做業(*******)
22     利用無名有名 反向解析 完成數據的增刪改查
23 """
24 
25 
26 
27 # 有名分組反向解析
28    url(r'^func/(?P<year>\d+)/',views.func,name='ooo')
29 # 前端
30     <a href="{% url 'ooo' year=123 %}">111</a>  瞭解
31     <a href="{% url 'ooo' 123 %}">222</a>              記憶
32 
33 # 後端    
34      # 有名分組反向解析 寫法1  瞭解
35    print(reverse('ooo',kwargs={'year':123}))
36    # 簡便的寫法  減小你的腦容量消耗 記跟無名同樣的操做便可
37    print(reverse('ooo',args=(111,)))

路由分發

 1 """
 2 django的每個應用均可以有本身的templates文件夾 urls.py static文件夾
 3 正是基於上述的特色 django可以很是好的作到分組開發(每一個人只寫本身的app)
 4 做爲組長 只須要將手下書寫的app所有拷貝到一個新的django項目中 而後在配置文件裏面註冊全部的app再利用路由分發的特色將全部的app整合起來
 5 
 6 當一個django項目中的url特別多的時候 總路由urls.py代碼很是冗餘很差維護
 7 這個時候也能夠利用路由分發來減輕總路由的壓力
 8 
 9 利用路由分發以後 總路由再也不幹路由與視圖函數的直接對應關係
10 而是作一個分發處理
11     識別當前url是屬於哪一個應用下的 直接分發給對應的應用去處理
12     
13 """
14 
15 
16 # 總路由
17 from app01 import urls as app01_urls
18 from app02 import urls as app02_urls
19 urlpatterns = [
20     url(r'^admin/', admin.site.urls),
21     # 1.路由分發
22     url(r'^app01/',include(app01_urls)),  # 只要url前綴是app01開頭 所有交給app01處理
23     url(r'^app02/',include(app02_urls))   # 只要url前綴是app02開頭 所有交給app02處理
24   
25     # 2.終極寫法  推薦使用
26     url(r'^app01/',include('app01.urls')),
27     url(r'^app02/',include('app02.urls'))
28     # 注意事項:總路由裏面的url千萬不能加$結尾
29 ]
30 
31 # 子路由
32     # app01 urls.py
33   from django.conf.urls import url
34   from app01 import views
35 
36   urlpatterns = [
37       url(r'^reg/',views.reg)
38   ]
39   # app02 urls.py
40   from django.conf.urls import url
41   from app02 import views
42 
43   urlpatterns = [
44       url(r'^reg/',views.reg)
45   ]

名稱空間(瞭解)

 1 # 當多個應用出現了相同的別名 咱們研究反向解析會不會自動識別應用前綴
 2 """
 3 正常狀況下的反向解析是沒有辦法自動識別前綴的
 4 """
 5 
 6 # 名稱空間
 7     # 總路由
 8     url(r'^app01/',include('app01.urls',namespace='app01')),
 9     url(r'^app02/',include('app02.urls',namespace='app02'))
10   # 解析的時候
11       # app01
12       urlpatterns = [
13     url(r'^reg/',views.reg,name='reg')
14         ]
15     # app02
16     urlpatterns = [
17     url(r'^reg/',views.reg,name='reg')
18         ]
19     
20       reverse('app01:reg')
21     reverse('app02:reg')
22     
23     {% url 'app01:reg' %}
24     {% url 'app02:reg' %}
25 # 其實只要保證名字不衝突 就沒有必要使用名稱空間
26 """
27 通常狀況下 有多個app的時候咱們在起別名的時候會加上app的前綴
28 這樣的話就可以確保多個app之間名字不衝突的問題
29 """
30 urlpatterns = [
31     url(r'^reg/',views.reg,name='app01_reg')
32 ]
33 urlpatterns = [
34     url(r'^reg/',views.reg,name='app02_reg')
35 ]

僞靜態(瞭解)

 1 """
 2 靜態網頁
 3     數據是寫死的 萬年不變
 4     
 5 僞靜態
 6     將一個動態網頁假裝成靜態網頁
 7     
 8     爲何要假裝呢?
 9         https://www.cnblogs.com/Dominic-Ji/p/9234099.html
10         假裝的目的在於增大本網站的seo查詢力度
11         而且增長搜索引擎收藏本網上的機率
12     
13     搜索引擎本質上就是一個巨大的爬蟲程序
14     
15     總結:
16         不管你怎麼優化 怎麼處理
17         始終仍是幹不過RMB玩家
18 """
19 urlpatterns = [
20     url(r'^reg.html',views.reg,name='app02_reg')
21 ]

虛擬環境(瞭解)

 1 """
 2 在正常開發中 咱們會給每個項目配備一個該項目獨有的解釋器環境
 3 該環境內只有該項目用到的模塊 用不到一律不裝
 4 
 5 linux:缺什麼才裝什麼
 6 
 7 虛擬環境
 8     你每建立一個虛擬環境就相似於從新下載了一個純淨的python解釋器
 9     可是虛擬環境不要建立太多,是須要消耗硬盤空間的
10 
11 擴展:
12     每個項目都須要用到不少模塊 而且每一個模塊版本可能還不同
13     那我該如何安裝呢? 一個個看一個個裝???
14     
15     開發當中咱們會給每個項目配備一個requirements.txt文件
16     裏面書寫了該項目全部的模塊即版本
17     你只須要直接輸入一條命令便可一鍵安裝全部模塊即版本
18 """

django版本區別

 1 """
 2 1.django1.X路由層使用的是url方法
 3     而在django2.Xhe3.X版本中路由層使用的是path方法
 4     url()第一個參數支持正則
 5     path()第一個參數是不支持正則的 寫什麼就匹配什麼
 6     
 7     
 8     若是你習慣使用path那麼也給你提供了另一個方法
 9         from django.urls import path, re_path
10         from django.conf.urls import url
11         
12         re_path(r'^index/',index),
13     url(r'^login/',login)
14   2.X和3.X裏面的re_path就等價於1.X裏面的url
15  
16  
17 2.雖然path不支持正則 可是它的內部支持五種轉換器
18     path('index/<int:id>/',index)
19     # 將第二個路由裏面的內容先轉成整型而後以關鍵字的形式傳遞給後面的視圖函數
20 
21     def index(request,id):
22     print(id,type(id))
23     return HttpResponse('index')
24     
25   
26   
27   str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式
28     int,匹配正整數,包含0。
29     slug,匹配字母、數字以及橫槓、下劃線組成的字符串。
30     uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
31     path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)
32     
33 3.除了有默認的五個轉換器以外 還支持自定義轉換器(瞭解)
34     class MonthConverter:
35     regex='\d{2}' # 屬性名必須爲regex
36 
37     def to_python(self, value):
38         return int(value)
39 
40     def to_url(self, value):
41         return value # 匹配的regex是兩個數字,返回的結果也必須是兩個數字
42     
43     
44     from django.urls import path,register_converter
45     from app01.path_converts import MonthConverter
46 
47     # 先註冊轉換器
48     register_converter(MonthConverter,'mon')
49 
50     from app01 import views
51 
52 
53     urlpatterns = [
54     path('articles/<int:year>/<mon:month>/<slug:other>/',     views.article_detail, name='aaa'),
55 
56 ]
57 
58 
59 4.模型層裏面1.X外鍵默認都是級聯更新刪除的
60 可是到了2.X和3.X中須要你本身手動配置參數
61     models.ForeignKey(to='Publish')
62     
63     models.ForeignKey(to='Publish',on_delete=models.CASCADE...)
64 """

視圖層

三板斧

 1 """
 2 HttpResponse
 3     返回字符串類型
 4 render
 5     返回html頁面 而且在返回給瀏覽器以前還能夠給html文件傳值
 6 redirect
 7     重定向
 8 """
 9 # 視圖函數必需要返回一個HttpResponse對象  正確   研究三者的源碼便可得處結論
10 The view app01.views.index didn't return an HttpResponse object. It returned None instead.
11 
12 # render簡單內部原理
13         from django.template import Template,Context
14     res = Template('<h1>{{ user }}</h1>')
15     con = Context({'user':{'username':'jason','password':123}})
16     ret = res.render(con)
17     print(ret)
18     return HttpResponse(ret)

JsonResponse對象

 1 """
 2 json格式的數據有什麼用?
 3     先後端數據交互須要使用到json做爲過渡 實現跨語言傳輸數據
 4 
 5 前端序列化
 6     JSON.stringify()                    json.dumps()
 7     JSON.parse()                            json.loads()
 8 """
 9 import json
10 from django.http import JsonResponse
11 def ab_json(request):
12     user_dict = {'username':'jason好帥哦,我好喜歡!','password':'123','hobby':'girl'}
13 
14     l = [111,222,333,444,555]
15     # 先轉成json格式字符串
16     # json_str = json.dumps(user_dict,ensure_ascii=False)
17     # 將該字符串返回
18     # return HttpResponse(json_str)
19     # 讀源碼掌握用法
20     # return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
21     # In order to allow non-dict objects to be serialized set the safe parameter to False.
22     # return JsonResponse(l,safe=False)  
23     # 默認只能序列化字典 序列化其餘須要加safe參數

form表單上傳文件及後端如何操做

 1 """
 2 form表單上傳文件類型的數據
 3     1.method必須指定成post
 4     2.enctype必須換成formdata
 5 
 6 """
 7 def ab_file(request):
 8     if request.method == 'POST':
 9         # print(request.POST)  # 只能獲取普通的簡直對數據 文件不行
10         print(request.FILES)  # 獲取文件數據
11         # <MultiValueDict: {'file': [<InMemoryUploadedFile: u=1288812541,1979816195&fm=26&gp=0.jpg (image/jpeg)>]}>
12         file_obj = request.FILES.get('file')  # 文件對象
13         print(file_obj.name)
14         with open(file_obj.name,'wb') as f:
15             for line in file_obj.chunks():  # 推薦加上chunks方法 其實跟不加是同樣的都是一行行的讀取
16                 f.write(line)
17 
18     return render(request,'form.html')

request對象方法

 1 """
 2 request.method
 3 request.POST
 4 request.GET
 5 request.FILES
 6 request.body  # 原生的瀏覽器發過來的二進制數據  後面詳細的講
 7 request.path            獲取的路徑不包含參數
 8 request.path_info     獲取的路徑不包含參數
 9 request.get_full_path()  獲取的路徑包含參數
10 """
11     print(request.path)  # /app01/ab_file/
12     print(request.path_info)  # /app01/ab_file/
13     print(request.get_full_path())  # /app01/ab_file/?username=jason
14             

FBV與CBV

 1 # 視圖函數既能夠是函數也能夠是類
 2 def index(request):
 3   return HttpResponse('index')
 4 
 5 # CBV
 6     # CBV路由
 7     url(r'^login/',views.MyLogin.as_view())
 8 
 9 
10         from django.views import View
11 
12 
13         class MyLogin(View):
14         def get(self,request):
15         return render(request,'form.html')
16 
17         def post(self,request):
18         return HttpResponse('post方法')
19       
20 """
21 FBV和CBV各有千秋
22 CBV特色
23     可以直接根據請求方式的不一樣直接匹配到對應的方法執行
24     
25     內部究竟是怎麼實現的?
26         CBV內部源碼(******)
27 """

今日測驗

1 """
2 今日考題
3 1.反向解析的本質是什麼,無名和有名反向解析如何操做?
4 2..路由分發可以實現的前提是什麼,須要注意什麼,名稱空間何時使用
5 3..什麼是虛擬環境,django1.X與django2.X/3.X的區別有哪些
6 4.詮釋爲什麼跨語言傳輸數據以json格式爲主,django返回json格式數據方式有哪些,又有哪些注意事項和配置參數
7 """

今日內容回顧

無名有名分組反向解析

 1 # 反向解析的本質:經過一些方法,獲得一個結果,該結果能夠訪問到對應的url並觸發視圖函數的運行
 2 
 3 # 無名分組反向解析
 4 url(r'^index/(\d+)/',views.index,name='xxx')
 5 # 前端
 6 {% url 'xxx' 1 %}
 7 # 後端
 8 reverse('xxx',args=(1,))  # index/1/
 9 
10 # 有名分組反向解析
11 url(r'^index/(?P<year>\d+)/',views.index,name='ooo')
12 # 前端
13 {% url 'ooo' year=1 %}
14 {% url 'ooo' 1 %}  # 記一個 節省腦容量消耗
15 # 後端 
16 reverse('ooo',kwargs={'year':1})
17 reverse('ooo',args=(1,))  # 記一個 節省腦容量消耗
無名有名分組反向解析

路由分發

 1 """
 2 在django中 每個應用均可以有本身獨立的templates模版文件夾、static靜態文件、urls.py
 3 也就意味基於django實現多人分組開發是很是方便的 每一個人只須要專一於開發本身的app便可
 4 
 5 當django路由匹配特別多的時候 那麼總路由能夠再也不直接幹匹配和觸發函數運行而僅僅只是作一步分發操做
 6 """
 7 # 總路由
 8     url(r'^app01/',include('app01.urls'))  # 只要url是app01開頭就會自動將url中app01後面的路徑交給app01下的urls.py去作匹配
 9   """總理由url後面千萬不能加$符號"""
10 
11 # 子路由
12     url(r'^index/$',views.index)
路由分發

名稱空間

 1 # 當多個應用出現相同的別名的時候 反向解析的時候會出現衝突
 2 
 3 # 方式1:利用名稱空間的概念
 4 url(r'^app01/',include('app01.urls',namespaces='app01'))
 5 url(r'^index/$',views.index,name='xxx')
 6 reverse('app01:xxx')
 7 {% url 'app01:xxx' %}
 8 # 方式2:起別名的時候加上應用前綴
 9 url(r'^index/$',views.index,name='app01_xxx')
10 reverse('app01_xxx')
11 {% url 'app01_xxx' %}
12 """
13 在同一個django項目中 別名不能衝突
14 即只要別名不衝突 那麼反向解析就不會出錯!!!
15 """
名稱空間

僞靜態

1 """
2 xxx.html
3 網站的優化
4     增大搜索引擎收錄本網站的機率
5     即seo查詢優先展現度
6 可是仍是RMB玩家牛逼
7 """
僞靜態

虛擬環境

 1 """
 2 一般狀況下咱們會給每個項目單獨配備該項目所需的模塊,不須要的一律不裝節省資源
 3 
 4 建立一個虛擬環境就相似於從新下載了一個純淨的python解釋器
 5 
 6 擴展:
 7     工做中,咱們會給每個項目配備一個requirements.txt文件,裏面記錄了該項目所須要的全部的模塊和版本,你直接一條安裝便可
 8     
 9 如何建立虛擬環境
10     利用pycharm快捷建立
11     
12     虛擬環境的標誌
13         venv文件夾
14 
15 我的建議
16     你的機器上最好不要有太多的虛擬環境
17     最好直接使用本機環境
18 """
虛擬環境

django版本區別

 1 # urls.py
 2 1.X用的是url 第一個參數支持正則
 3 2.X和3.X默認用的是path 第一個參數不支持正則 寫什麼就匹配 精準匹配
 4 
 5 若是你確實不想用path那麼2.X和3.X還提供了一個re_path(等價於1.X裏面的url)
 6 
 7 path提供了五種默認的轉換器(瞭解)
 8     作筆記便可
 9 path還支持自定義轉換器(瞭解)
10     作筆記便可
11     
12 # models.py
13 1.X默認外鍵都是級聯更新級聯刪除
14 2.X和3.X須要你本身手動指定相關參數
django版本區別

三板斧

1 """
2 HttpResponse
3 render
4 redirect
5 
6 視圖函數必須返回一個HttpResponse對象
7 """
三板斧

JsonResponse對象

 1 """
 2 django後端給前端返回json格式的數據 
 3     1.手動利用json模塊
 4     2.利用JsonResponse
 5     ...
 6 """
 7 json.dumps(data,ensure_ascii=False)  # 序列化的時候內部不會自動轉換編碼
 8 
 9 from django.http import JsonResponse
10 # 稍微看一下JsonResponse源碼
11 JsonResponse(data,json_dumps_params={'ensure':False})
12 # JsonResponse默認只序列化字典 序列化其餘能夠被序列化的數據的時候須要額外加一個safe參數
13 JsonResponse([],safe=False)
JsonResponse對象

form表單上傳文件及ruquest對象方法

 1 """
 2 action三個參數
 3 
 4 上傳文件須要指定的兩個參數
 5     method=‘post’
 6     enctype=formdata
 7 """
 8 
 9 # request對象方法
10 .POST
11 .GET
12 .method
13 .body
14 .FILES        # 獲取文件數據
15 .path
16 .path_info
17 .get_full_path()  # url?xxx=ppp
form表單上傳文件及ruquest對象方法

FBV與CBV

 1 """
 2 視圖函數便可以是函數也能夠是類
 3 """
 4 # FBV
 5 def index(request):
 6   return HttpResponse('OK')
 7 
 8 # CBV
 9 from django.views import View
10 
11 """只要是處理業務邏輯的視圖函數 形參裏面確定要有request"""
12 class MyClass(View):
13   def get(self,request):
14     return HttpResponse('get請求')
15      
16   def post(self,request):
17     return HttpResponse('post請求')
18   
19 # 注意 CBV路由匹配寫法跟FBV有點不同(可是其實本質是同樣的)
20 url(r'^login/$',views.MyClass.as_view())
21 
22 # 疑問:CBV可以作到根據不一樣的請求方式自動匹配對應的方法並執行???(******)
FBV與CBV

做業

1 '''
2 1.整理今日內容到博客
3 2.利用無名有名 反向解析 完成數據的增刪改查
4 選作:    
5   研究FBV內部原理
6 '''
相關文章
相關標籤/搜索