django 第四彈

今日內容概要html

無名有名分組反向解析
路由分發
名稱空間(瞭解)
僞靜態(瞭解)
虛擬環境(瞭解)
django1.x和django2.x的區別(瞭解)
視圖層
三板斧
JsonResponse
form表單上傳文件
FBV與CBV前端

進入內容詳解python

一:無名有明分組反向解析django

無名分組反向解析
url(r'^index/(\d+)',views.index,name='xxx')

前端
{% URL'xxx' 123%}

後端
reverse('xxx',args=(1,))

"""
這個數字寫代碼的時候應該放什麼
	數字通常狀況下放的是數據的主鍵值 數據的編輯和刪除
	
	url(r'^edit/(\d+)/',views.edit,name='xxx')
	def edit(request,edit_id):
		reverse('xxx',args=(edit_id,))
	
	
	{% for user_obj in user_queryset%}		編輯
		"""

#有名分組反向解析

url(r'^func/(?p\d+)/',views.func,name='000')

前端111222後端

#有名分組反向解析
print(reverse('ooo',args=(111,)))

二:路由分發json

"""
django的每個應用均可以有本身的templates文件夾 urls.py static文件夾
正是基於上述的特色 django可以很是好的作到分組開發(每一個人只寫本身的app)
做爲組長 只須要將手下書寫的app所有拷貝到一個新的django項目中 而後在配置文件裏面註冊全部的app再利用路由分發的特色將全部的app整合起來
當一個django項目中的url特別多的時候 總路由urls.py代碼很是冗餘很差維護
這個時候也能夠利用路由分發來減輕總路由的壓力
利用路由分發以後 總路由再也不幹路由與視圖函數的直接對應關係
而是作一個分發處理
	識別當前url是屬於哪一個應用下的 直接分發給對應的應用去處理

"""

# 總路由
有兩個應用 app01 和 app02
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
	url(r'^admin/', admin.site.urls),
	url(r'^app01/',include('app01.urls')),
	 url(r'^app02/',include('app02.urls'))
	# 注意事項:總路由裏面的url千萬不能加$結尾

# 子路由
# app01 urls.py
from django.conf.urls import url
from app01 import views
 urlpatterns = [
 	url(r'^reg/',views.reg)
  ]

 # app02 urls.py
from django.conf.urls import url
from app02 import views
urlpatterns = [
	url(r'^reg/',views.reg)
]

三:名稱空間(瞭解)後端

# 當多個應用出現了相同的別名 咱們研究反向解析會不會自動識別應用前綴

正常狀況下的反向解析是沒有辦法自動識別前綴的

# 名稱空間
	# 總路由
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))

  # 解析的時候
	# app01
	urlpatterns = [
		url(r'^reg/',views.reg,name='reg')
	]
	# app02
	urlpatterns = [
		url(r'^reg/',views.reg,name='reg')
	]
	
	
	reverse('app01:reg')
	reverse('app02:reg')
	
	
	{% url 'app01:reg' %}
	{% url 'app02:reg' %}
	# 其實只要保證名字不衝突 就沒有必要使用名稱空間
	
	
通常狀況下 有多個app的時候咱們在起別名的時候會加上app的前綴
這樣的話就可以確保多個app之間名字不衝突的問題
urlpatterns = [
url(r'^reg/',views.reg,name='app01_reg')
]
urlpatterns = [
url(r'^reg/',views.reg,name='app02_reg')
]

四:僞靜態(瞭解)瀏覽器

將一個動態網頁假裝成靜態網頁
假裝的目的在於增大本網站的seo查詢力度
urlpatterns = [
url(r'^reg.html',views.reg,name='app02_reg')
]

五:虛擬環境app

在正常開發中 咱們會給每個項目配備一個該項目獨有的解釋器環境
該環境內只有該項目用到的模塊 用不到一律不裝

開發當中咱們會給每個項目配備一個requirements.txt文件
裏面書寫了該項目全部的模塊即版本
你只須要直接輸入一條命令便可一鍵安裝全部模塊即版本

六:django版本區別ide

1.django1.X路由層使用的是url方法
而在django2.Xhe3.X版本中路由層使用的是path方法
url()第一個參數支持正則
path()第一個參數是不支持正則的 寫什麼就匹配什麼

若是你習慣使用path那麼也給你提供了另一個方法
from django.urls import path, re_path
from django.conf.urls import url

re_path(r'^index/',index),
url(r'^login/',login)
2.X和3.X裏面的re_path就等價於1.X裏面的url

2.雖然path不支持正則 可是它的內部支持五種轉換器

path('index//',index)
# 將第二個路由裏面的內容先轉成整型而後以關鍵字的形式傳遞給後面的視圖函數

	def index(request,id):
	print(id,type(id))
	return HttpResponse('index')



  str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式
int,匹配正整數,包含0。
slug,匹配字母、數字以及橫槓、下劃線組成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)

3.除了有默認的五個轉換器以外 還支持自定義轉換器(瞭解)

class MonthConverter:
regex='\d{2}' # 屬性名必須爲regex

def to_python(self, value):
    return int(value)

def to_url(self, value):
    return value # 匹配的regex是兩個數字,返回的結果也必須是兩個數字


from django.urls import path,register_converter
from app01.path_converts import MonthConverter

# 先註冊轉換器
register_converter(MonthConverter,'mon')

from app01 import views


urlpatterns = [
path('articles////', 	views.article_detail, name='aaa'),

]

4.模型層裏面1.X外鍵默認都是級聯更新刪除的
可是到了2.X和3.X中須要你本身手動配置參數
models.ForeignKey(to='Publish')

models.ForeignKey(to='Publish',on_delete=models.CASCADE...)

七:視圖層函數

1.三板斧

HttpResponse
返回字符串類型
render
返回html頁面 而且在返回給瀏覽器以前還能夠給html文件傳值
redirect
重定向


# 視圖函數必需要返回一個HttpResponse對象  正確   研究三者的源碼便可得處結論
The view app01.views.index didn't return an HttpResponse object. It returned None instead.


# render簡單內部原理
	from django.template import Template,Context
res = Template('{{ user }}')
con = Context({'user':{'username':'jason','password':123}})
ret = res.render(con)
print(ret)
return HttpResponse(ret)

2.JsonResponse對象

"""

json格式的數據有什麼用?
先後端數據交互須要使用到json做爲過渡 實現跨語言傳輸數據

前端序列化
JSON.stringify() json.dumps()
JSON.parse() json.loads()
"""
import json
from django.http import JsonResponse
def ab_json(request):
user_dict = {'username':'jason好帥哦,我好喜歡!','password':'123','hobby':'girl'}

l = [111,222,333,444,555]
# 先轉成json格式字符串
# json_str = json.dumps(user_dict,ensure_ascii=False)
# 將該字符串返回
# return HttpResponse(json_str)
# 讀源碼掌握用法
# return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
# In order to allow non-dict objects to be serialized set the safe parameter to False.
# return JsonResponse(l,safe=False)  
# 默認只能序列化字典 序列化其餘須要加safe參數	

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

"""
form表單上傳文件類型的數據
1.method必須指定成post
2.enctype必須換成formdata

"""
def ab_file(request):
if request.method == 'POST':
    # print(request.POST)  # 只能獲取普通的簡直對數據 文件不行
    print(request.FILES)  # 獲取文件數據
    #<MultiValueDict: {'file': []}>
    file_obj = request.FILES.get('file')  # 文件對象
    print(file_obj.name)
    with open(file_obj.name,'wb') as f:
        for line in file_obj.chunks():  # 推薦加上chunks方法 其實跟不加是同樣的都是一行行的讀取
            f.write(line)
 return render(request,'form.html')

4.equest對象方法

"""
request.method
request.POST
request.GET
request.FILES
request.body  # 原生的瀏覽器發過來的二進制數據  後面詳細的講
request.path 
request.path_info
request.get_full_path()  能過獲取完整的url及問號後面的參數 
"""
print(request.path)  # /app01/ab_file/
print(request.path_info)  # /app01/ab_file/
print(request.get_full_path())  # /app01/ab_file/?username=jason

5.FBV與CBV

# 視圖函數既能夠是函數也能夠是類
def index(request):
 return HttpResponse('index')

# CBV
# CBV路由
url(r'^login/',views.MyLogin.as_view())


	from django.views import View


	class MyLogin(View):
	def get(self,request):
    return render(request,'form.html')

	def post(self,request):
    return HttpResponse('post方法')
  
"""
FBV和CBV各有千秋
CBV特色
可以直接根據請求方式的不一樣直接匹配到對應的方法執行

內部究竟是怎麼實現的?
	CBV內部源碼(******)
"""
相關文章
相關標籤/搜索