CBV和FBV
基于函数的 def add_class(request): if request.method == "POST": #判断请求方式 class_name = request.POST.get("class_name") #拿到数据 models.Classes.objects.create(name=class_name) #数据库中创建 return redirect("/class_list/") #重定向 return render(request, "add_class.html") #如果是get请求,返回页面
基于类的 from django.views import View class AddClass(View): def get(self, request): #get请求 return render(request, "add_class.html")
def post(self, request): #post请求 class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/")
注意:使用CBV时候.urls.py中也要相应的做出修改
url(r'^add_class/$', views.AddClass.as_view()), #urls.py
给视图函数加装饰器
FBV本身就是一个函数,所以和给普通函数加装饰器无差别
def wrapper(func): def inner(*args,**kwargs): start_time = time.time() ret = func(*args, **kwargs) end_time = time.time() print("used:", end_time-start_time) return ret return inner # FBV版添加班级 @wrapper def add_class(request): if request.method == "POST": class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/") return render(request, "add_class.html")
装饰器装饰CBV
类中的方法和独立函数不完全相同,因此不能直接应用于类中的方法,要先将其转换为方法装饰器 django 提供了 method_decorator装饰器用于将函数装饰器转换为方法装饰器 # CBV版添加班级 from django.views import View from django.utils.decorators import method_decorator class AddClass(View): @method_decorator(wrapper) def get(self, request): return render(request, "add_class.html") def post(self, request): class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/")
扩展 装饰器 CBV 使用CBV时要注意,请求过来后会先执行dispatch()这个方法,
如果需要批量对具体的请求处理方法,如get,post等做一些操作的时候,
这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。 class Login(View): def dispatch(self, request, *args, **kwargs): print('before') obj = super(Login,self).dispatch(request, *args, **kwargs) print('after') return obj def get(self,request): return render(request,'login.html') def post(self,request): print(request.POST.get('user')) return HttpResponse('Login.post')
request 对象 和 response 对象
request对象,当一个页面被请求时,django就会创建一个包含本次请求原信息的HttpRequest对象
django会将这个对象自动传递给响应的视图函数,一般views函数使用request参数接收这个对象
常用的相关值:
path_info 返回url,不含域名
method HTTP方法的字符串表示,全大写
GET 包含所有HTTP GET参数的类字典对象
POST 包含所有HTTP POST参数的类字典对象
body 请求体,byte类型request.POST的数据就是从body里面提取到的
HttpRequest.COOKIES 一个标准的Python 字典,包含所有的cookie。键和值都为字符串。
HttpRequest.FILES 一个类似于字典的对象,包含所有的上传文件信息。 FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。 注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会 包含数据。否则,FILES 将为一个空的类似于字典的对象
上传文件 def upload(request): """ 保存上传文件前,数据需要存放在某个位置。默认当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。从内存读取一次,写磁盘一次。 但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。 """ if request.method == "POST": # 从请求的FILES中获取上传文件的文件名,file为页面上type=files类型input的name属性值 filename = request.FILES["file"].name with open(filename, "wb") as f: #项目目录下新建文件 for chunk in request.FILES["file"].chunks() #一点点读 f.write(chunk) #写入本地文件 return HttpResponse("上传OK")
HttpRequest.META 一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器
HttpRequest.session 一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用
方法
1.HttpRequest.get_host() "127.0.0.1:8000" 2.HttpRequest.get_full_path() "/music/bands/the_beatles/?print=true" 3.HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 返回签名过的Cookie 对应的值,如果签名不再合法则返回django.core.signing.BadSignature。 如果提供 default 参数,将不会引发异常并返回 default 的值。 可选参数salt 可以用来对安全密钥强力攻击提供额外的保护。max_age 参数用于检查Cookie 对应的时间戳以确保Cookie 的时间不会超过max_age 秒。 4.HttpRequest.is_secure() 如果请求时是安全的,则返回True;即请求通是过 HTTPS 发起的 5.HttpRequest.is_ajax() 如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串'XMLHttpRequest' 注意: 键值对的值是多个的话,比如CheckBox类型的input,select标签,需要用: request.Post.getlist('hobby')'
response 对象
HttpResponse.content:响应内容
HttpResponse.charset:响应内容的编码
HttpResponse.status_code:响应的状态码
JsonResponse 对象
JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应
from django.http import JsonResponse response = JsonResponse({'foo':'bar'}) print(response.content) b'{"foo":"bar"} 默认只能传字典,若要传递别的类型小设置一下safe关键字参数 response = JsonResponse([1,2,3],safe=False)
Django shortcut functions
from django.shortcuts import render,reverse,redirect,HttpResponse def add_day(request): xxx return render(request,'xx.html',{键:值}) return redirect('/xxx/') return redirect('http://www.baidu.com/') 默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向 响应状态码 302 -临时重定向 301 -永久重定向