视图

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 -永久重定向
posted @ 2019-02-27 17:48  追风zz  阅读(170)  评论(0编辑  收藏  举报