第四篇.视图层
一.HttpRequest对象
views文件
视图层之HttpRequest对象 前台Post传过来的数据,包装到POST字典中 request.POST 前台浏览器窗口里携带的数据,包装到GET字典中 request.GET 前台请求的方式 request.method post提交的数据,body体的内容,前台会封装成:name=lqz&age=18&sex=1 request.body 取出请求的路径,取不到数据部分 print(request.path) 取出请求的路径,能取到数据部分 print(request.get_full_path()) print(request.META)
二.HttpResponse对象
响应对象有三种形式
def test(request): print(type(request)) from django.core.handlers.wsgi import WSGIRequest 前台Post传过来的数据,包装到POST字典中 request.POST 前台浏览器窗口里携带的数据,包装到GET字典中 request.GET 前台请求的方式 request.method post提交的数据,body体的内容 request.body 取出请求的路径,取不到数据部分 print(request.path) 取出请求的路径,能取到数据部分 print(request.get_full_path()) print(request.META) post提交数据格式,放到body体中 name=lqz&age=18&sex=1 return HttpResponse('ok') def test(request): if request.method=='GET': return render(request,'index.html') if request.method=='POST': print(request.body) return HttpResponse('post') render执行原理 def test(request): if request.method=='GET': temp=Template('<h1>{{ user }}</h1>') con=Context({'user':'lqz'}) ret=temp.render(con) print(ret) # return render(request,'index.html') return HttpResponse(ret)
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> <input type="text" name="name"> <input type="text" name="age"> <input type="submit" value="submit"> </form> </body> </html>
三.JsonResponse
jsonresponse测试 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
4.1什么是CBV,什么是FBV?
CBV基于类的视图(Class base view)和FBV基于函数的视图(Function base view)
-基于类的视图 -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')
4.2CBV的应用
urls文件夹下
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^test/', views.Test.as_view()), #基于类的视图要加as_view(),继承自View
views文件夹下
from django.shortcuts import render, HttpResponse, redirect # ************CBV***********写法 from django.views import View class Test(View): def get(self, request): return HttpResponse('get-test') def post(self, request): return HttpResponse('post-test')
五.简单文件上传
html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/files/" method="post" enctype="multipart/form-data"> <input type="file" name="myfile"> <input type="submit" value="提交"> </form> </body> </html>
urls文件
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^files/$', views.add_file), ]
views文件
from django.shortcuts import render,HttpResponse # Create your views here. def add_file(request): if request.method=="GET": return render(request,'form.html') #这是个字典 dic_files=request.FILES myfile=dic_files.get("myfile") with open(myfile.name,'wb') as f: #循环上传过来的文件 for line in myfile: #往空文件中写 f.write(line) return HttpResponse('ok')