视图层
mvc和mtv
视图层:request对象
jsonresponse
CBV和FBV
简单文件上传
MVC和MTV
M T V
models template views
M V C(路由+views)
models 模板 控制器
今天重点
视图层:request对象:
# form表单,不写method ,默认是get请求
# 1 什么情况下用get:请求数据,请求页面,
# 2 用post请求:向服务器提交数据
# request.GET 字典 可以用get取值
# request.POST 字典
# request.method 请求的类型 (get,post)
# request.body post提交的数据都会放到body里
# http://127.0.0.1:8000/index/ppp/dddd/?name=lqz
# 协议:ip地址和端口/路径?参数(数据)
# print(request.path) 路径不包括参数部分
# print(request.get_full_path()) 包括参数部分
jsonresponse
原生的可以返回任意数据格式
# dic={'name':'lqz','age':18}
# li=[1,2,3,4]
# # return HttpResponse(json.dumps(li))
JsonResponse(向前端页面发json格式字符串)
# from django.http import JsonResponse
# return JsonResponse(li,safe=False) 默认可以传字典,如果要传非字典形式的数据要设置safe=False
CBV(class base view)和FBV(function base view)
视图里可以用函数也可以用类,处理匹配url的逻辑,返回值
cbv: 视图和路由的写法模板
1 from django.views import View #views导入类
2 class Test(View):
def dispatch(self, request, *args, **kwargs): #可以理解为装饰器,派生
# 加点东西
print('111')
#原来的东西不动,加新功能
obj=super().dispatch(request, *args, **kwargs) #调用方法,接收返回值
# 加点东西
print('2222')
return obj #方法的返回值返回到页面
def get(self,request):
obj= render(request,'index.html')
print(type(obj))
return obj
def post(self,request):
return HttpResponse('ok')
3 re_path(r'index/', views.Test.as_view()), #返回的是一个函数,get请求就是get函数,否则就是post函数
简单文件上传
1 <form action="" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="name">
密码:<input type="text" name="password">
文件:<input type="file" name="myfile">
<input type="submit">
</form>
#enctype="multipart/form-data"******************* 必须加这个 不然文件提交不上去
#<input type="file" name="myfile">
2 # ff是一个文件对象,django封装的
def post(self,request):
#print(request.POST)
# ff是一个文件对象,django封装的 取文件对象的方法
ff=request.FILES.get('myfile')
# 文件对象的名字
file_name=ff.name
#from django.core.files.uploadedfile import InMemoryUploadedFile
#print(type(ff)) #重写了InMemoryUploadedFile类的str方法
with open(file_name,'wb') as f:
for line in ff.chunks(): #chunks() 是一个生成器
f.write(line)
return HttpResponse('ok')