DAY74-Django框架(五)
一、虛擬環(huán)境
對于一些需要跑在不同版本的模塊下的項目,可以跑在虛擬環(huán)境中運行
創(chuàng)建虛擬環(huán)境的兩種方法
pychanrm**創(chuàng)建
1.創(chuàng)建項目時選擇使用虛擬環(huán)境
?
2.在已創(chuàng)建的項目中設(shè)置setting
?
注:純凈環(huán)境就是沒有任何模塊
命令行創(chuàng)建
1.下載virtualenv軟件
pip3 install virtualenv ? 2.創(chuàng)建虛擬環(huán)境
#創(chuàng)建純凈環(huán)境
virtualenv env_django
#創(chuàng)建環(huán)境,繼承了原安裝的模塊
virtualenv --system-site-packages env_django ? 3.激活虛擬環(huán)境
#通過命令行,進(jìn)入虛擬環(huán)境的文件夾下的Script文件,輸入
active ? 4.退出虛擬環(huán)境
deactivate 二、Django2.0與Django1.0的路由區(qū)別
唯一的區(qū)別就是1.0版本路由使用的是URL(),而2.0的是re_path和path
re_path
與url的用法一模一樣,并且分組出來的數(shù)據(jù)也是字符串類型
re_path('正則表達(dá)式',視圖函數(shù),參數(shù),別名) path
這是2.0新增的,傳過來的路徑是準(zhǔn)確路徑,而不是正則表達(dá)式
path('準(zhǔn)確路徑 | 轉(zhuǎn)化器', 視圖函數(shù),參數(shù),別名),
#轉(zhuǎn)化器由<>包裹,包含<轉(zhuǎn)化器類型:變量>,若沒有轉(zhuǎn)化器,將匹配任何字符串
path('test/<path:year>', views.re_test),#轉(zhuǎn)化器類型
#str,匹配除了路徑分隔符(/)之外的非空字符串,這是默認(rèn)的形式
#int,匹配正整數(shù),包含0。
#slug,匹配字母、數(shù)字以及橫杠、下劃線組成的字符串。
#uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
#path,匹配任何非空字符串,包含了路徑分隔符(/) 自定義轉(zhuǎn)換器
對于一些復(fù)雜或者復(fù)用的需要,可以定義自己的轉(zhuǎn)化器。轉(zhuǎn)化器是一個類或接口,它的要求有三點:
regex類屬性,字符串類型to_python(self, value)方法,value是由類屬性regex所匹配到的字符串,返回具體的Python變量值,以供Django傳遞到對應(yīng)的視圖函數(shù)中。to_url(self, value)方法,和to_python相反,value是一個具體的Python變量值,返回其字符串,通常用于url反向引用。
#編寫自定義轉(zhuǎn)化器
class MyCon:# 寫一個正則表達(dá)式regex = '[0-9]{4}'# 匹配出來的數(shù)據(jù),會傳到這里,retrun回去的,會被視圖函數(shù)接收def to_python(self, value):return int(value)# 反向解析用的def to_url(self, value):return '%04d' % value#注冊自定義轉(zhuǎn)化器
from django.urls import register_converter
register_converter(MyCon,'yyy')#使用自定義轉(zhuǎn)化器
path('test/<yyy:year>', views.re_test,name='test'), 三、視圖層
HttpRequest對象
django將請求報文中的請求行、首部信息、內(nèi)容主體封裝成 HttpRequest 類中的屬性。
#常用屬性
# 前臺Post傳過來的數(shù)據(jù),包裝到POST字典中
request.POST# 前臺瀏覽器窗口里攜帶的數(shù)據(jù),包裝到GET字典中
request.GET# 前臺請求的方式
request.method# post提交的數(shù)據(jù),body體的內(nèi)容,前臺會封裝成:name=lqz&age=18&sex=1。適合處理非表單數(shù)據(jù)
request.body# 取出請求的路徑,取不到數(shù)據(jù)部分
request.path# 取出請求的路徑,能取到數(shù)據(jù)部分
request.get_full_path()#取出表單請求方法為POST,并編寫方式是enctype="multipart/form-data"的所有上傳文件信息
request.FILES#包含所有的HTTP 首部信息,以字典的形式
request.META
#注意:request.META['HTTP_REFERER'] 表示上一個跳轉(zhuǎn)頁面 HttpResponse對象
響應(yīng)對象主要有三種形式:
- HttpResponse():括號內(nèi)直接跟一個具體的字符串作為響應(yīng)體返回
- render():將一個模板頁面中的模板語法進(jìn)行渲染,最終渲染成一個html頁面作為響應(yīng)體。
- redirect():重定向
render()
#render(請求對象,模板名,模板需要的參數(shù)(字典形式))
render(request, template_name[, context])#要知道render和redircet都是HttpResponse的對象
#render的內(nèi)部原理
from django.template import Template,Context
#調(diào)用Template,傳入html標(biāo)簽
temp=Template('<h1>{{ user }}</h1>')
#調(diào)用Context,傳入數(shù)據(jù)標(biāo)簽
con=Context({'user':'lqz'})
#二者合一
ret=temp.render(con)
#最后用HttpResponse傳出去
return HttpResponse(ret) JsonResponse對象
向前端返回一個json格式字符串
from django.http import JsonResponse
def test(request):dic={'name':'lqz','age':18}return JsonResponse(dic)ll = ['name', 'age']# 報錯,默認(rèn)不支持列表形式return JsonResponse(ll)# 支持列表形式return JsonResponse(ll,safe=False)#JsonResponse方法內(nèi)部其實是調(diào)用了json模塊,在內(nèi)部進(jìn)行了轉(zhuǎn)換
import json
dic={'name':'lqz','age':18}
# 把字典轉(zhuǎn)換成json格式,返回到前臺
return HttpResponse(json.dumps(dic)) 五、CBV與FBV
CBV:基于類的視圖(Class base view)
#路由層:
url(r'^test/', views.Test.as_view()),
#視圖層
from django.views import View
class Test(View):def get(self, request):#一定要傳request對象return HttpResponse('get-test')def post(self, request):return HttpResponse('post-test') FBV:基于函數(shù)的視圖(Function base view)
七、簡單文件上傳
前端:#enctype屬性#application/x-www-form-urlencoded:默認(rèn),POST會拿到控件傳過來的值,除了文件,只會獲得文件的名字;FILES也沒獲得文件#multipart/form-data:POST拿不到文件信息,會將文件信息與數(shù)據(jù)存放到FILES中;如果沒上傳文件就提交,POST會得到文件的字典形式,value為空#text/plain:不會拿到表單信息<form action="" method="post" enctype="multipart/form-data"><input type="file" name="myfile"><input type="text" name="password"><input type="submit" value="提交"></form>
后臺:def fileupload(request):if request.method=='GET':return render(request,'fileupload.html')if request.method=='POST':# 從字典里根據(jù)名字,把文件取出來myfile=request.FILES.get('myfile')# 文件名字name=myfile.name# 打開文件,把上傳過來的文件存到本地with open(name,'wb') as f:# for line in myfile.chunks():for line in myfile:f.write(line)return HttpResponse('ok')
轉(zhuǎn)載于:https://www.cnblogs.com/xvchengqi/p/9931204.html
總結(jié)
以上是生活随笔為你收集整理的DAY74-Django框架(五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个看不到朋友圈个性签名
- 下一篇: “饥不啄腐鼠”下一句是什么