Django框架之視圖函數(day74)
一 做業相關
urlpatterns = [
url(r'^$',views.book), #根路徑,響應到指定視圖函數:
.....
url(r'',views.errors), #沒有配置的路徑,響應到錯誤的視圖函數:
]
二 虛擬環境建立方法
1 用pychanrm建立--->files-->newproject--->選擇虛擬環境
2 settings-->project建立
3 用命令行建立,詳見https://www.cnblogs.com/liuqingzheng/p/9508851.html
三 django 2.0和django 1.0 路由層區別
1 url,re_path分組分出來的數據,是字符串*****
2 re_path:跟1.0的url用法相同
3 path:傳的路徑,是準確路徑
4 5個轉換器-->path('test/<path:year>', views.re_test),
str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式
int,匹配正整數,包含0。
slug,匹配字母、數字以及橫槓、下劃線組成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路徑分隔符(/)(不能用?)
5 自定義轉換器
1 定義一個類:
class MyCon:
regex = '[0-9]{4}' # 寫一個正則表達式
def to_python(self, value): # 匹配出來的數據,會傳到這裏,retrun回去的,會被視圖函數接收
return int(value)
def to_url(self, value): # 反向解析用的
return '%04d' % value
2 from django.urls import register_converter
register_converter(MyCon,'yyy') #重命名
3 path('test/<yyy:year>', views.re_test,name='test'),
6 補充: 在settings中若是設置: APPEND_SLASH=False 爲假,不會加反斜槓
四 視圖層之HttpRequest對象
1 前臺Post傳過來的數據,包裝到POST字典中
# request.POST
2 前臺瀏覽器窗口裏攜帶的數據,包裝到GET字典中
# request.GET
3 前臺請求的方式
# request.method
4 post提交的數據,body體的內容,前臺會封裝成:name=lqz&age=18&sex=1
# request.body
5 取出請求的路徑,取不到數據部分
# print(request.path)
6 取出請求的路徑,能取到數據部分
# print(request.get_full_path())
# print(request.META)
五 視圖層之HttpResponse對象
三件套:render,HttpResponse,redirect
render函數:
temp=Template('<h1>{{ user }}</h1>')
con=Context({'user':'lqz'})
ret=temp.render(con)
return HttpResponse(ret)
#等效於上面四步:return render(request,'index.html')
六 視圖層之JsonResponse對象
1 導入:from django.http import JsonResponse
2 視圖函數中:
def test(request):
import json
# dic={'name':'lqz','age':18}
ll = ['name', 'age']
# 把字典轉換成json格式,返回到前臺
# return HttpResponse(json.dumps(dic))
# 把列表轉換成json格式,返回到前臺
# return HttpResponse(json.dumps(ll))
# 把字典轉換成json格式,返回到前臺
# return JsonResponse(dic)
# 報錯,默認不支持列表形式
# return JsonResponse(ll)
# 支持列表形式
return JsonResponse(ll,safe=False)
七 CBV和FBV
1 CBV基於類的視圖
1 路由層:url(r'^test/', views.Test.as_view()),
2 視圖層
導入: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')
2 FBV基於函數的視圖
八 簡單文件上傳
1 前端部分:
<form action="" method="post" enctype="multipart/form-data">
{#<form action="" method="post" enctype="application/x-www-form-urlencoded">#}
<input type="file" name="myfile">
<input type="text" name="password">
<input type="submit" value="提交"></form>
2 後臺部分:
def fileupload(request):
if request.method=='GET':
return render(request,'fileupload.html')
if request.method=='POST':
print(request.FILES)
print(type(request.FILES.get('myfile')))
myfile=request.FILES.get('myfile') # 從字典里根據名字,把文件取出來
from django.core.files.uploadedfile import InMemoryUploadedFile
name=myfile.name # 文件名字
with open(name,'wb') as f:
# for line in myfile.chunks():
for line in myfile:
f.write(line)
return HttpResponse('ok')
3 補充:編碼方式multipart/form-data或者:application/x-www-form-urlencoded傳的數據,均可以從POST中取出來
九 做業:
1 手動建立虛擬環境--用命令
2 往前臺返回user字典:[{name:lqz,age:18},{name:lqz2,age:18}]
3 寫一個文件上傳:若是文件名字重複,不要覆蓋,而且放到項目根路徑的media文件夾下 html