• Django之视图层


    一:前后端数据交互

    (1)json交互数据:

     url(r'^login',views.login),
    def data(request):
    user_info = {'name':"SR",'age':18}
    res = json.dumps(user_info,ensure_ascii=False)
    return HttpResponse(res)

    PS:发送json格式的字符串

    (2)JsonResponse

    def index(request):
        
        l = [1,2,3,4]
        data = {'name': 'jason好帅哦 我好喜欢', 'password': 123}
      
    
        return JsonResponse(data,json_dumps_params={'ensure_ascii':False})
        # return JsonResponse(l, safe=False)  # 如果返回的不是字典 只需要修改safe参数为false即可

    二:文件上传

    (1)form表单上传文件需要注意的事项
      1.enctype需要由默认的urlencoded变成formdata
      2.method需要由默认的get变成post

    例如:

    def upload(request):
        """
        保存上传文件前,数据需要存放在某个位置。默认当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。从内存读取一次,写磁盘一次。
        但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。
        :param request: 
        :return: 
        """
        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")
    
    上传文件示例代码
    文件上传示例

     (2)如果form表单上传文件 后端需要在request.FILES获取文件数据 而不再是POST里面

    '''
    
    request.method
    request.GET
    request.POST
    request.FILES
    request.path  # 只回去url后缀 不获取?后面的参数
    request.get_full_path()  # 后缀和参数全部获取
    '''

     三:CBV与FBV

    【1】CBV

    (1)定义:基于类的视图函数,属于面向对象式编程

    例如:

    # CBV版添加班级
    from django.views import View
    
    
    class AddClass(View):
    
        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
    # 视图层
    url(r'^add_class/$', views.AddClass.as_view()),

    (2)装饰器装饰CBV:

    # 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/")
    装饰器

    【2】FBV:

    (1)定义:基于函数的视图函数 属于面向函数式编程

    # 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")
    FBV

    (2)装饰器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")
    装饰器FBV

    三:Response对象

    与由Django自动创建的HttpRequest对象相比,HttpResponse对象是我们的职责范围了。我们写的每个视图都需要实例化,填充和返回一个HttpResponse。

    HttpResponse类位于django.http模块中。

    使用

    传递字符串

    from django.http import HttpResponse
    response = HttpResponse("Here's the text of the Web page.")
    response = HttpResponse("Text only, please.", content_type="text/plain")

    设置或删除响应头信息

    response = HttpResponse()
    response['Content-Type'] = 'text/html; charset=UTF-8'
    del response['Content-Type']

    属性

    HttpResponse.content:响应内容

    HttpResponse.charset:响应内容的编码

    HttpResponse.status_code:响应的状态码

    四:redirect()

    参数可以是:

    • 一个模型:将调用模型的get_absolute_url() 函数
    • 一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
    • 一个绝对的或相对的URL,将原封不动的作为重定向的位置。

    默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。

    示例:

    你可以用多种方式使用redirect() 函数。

    传递一个具体的ORM对象(了解即可)

    将调用具体ORM对象的get_absolute_url() 方法来获取重定向的URL:

    from django.shortcuts import redirect
     
    def my_view(request):
        ...
        object = MyModel.objects.get(...)
        return redirect(object)

    传递一个视图的名称

    def my_view(request):
        ...
        return redirect('some-view-name', foo='bar')

    传递要重定向到的一个具体的网址

    def my_view(request):
        ...
        return redirect('/some/url/')

    当然也可以是一个完整的网址

    def my_view(request):
        ...
        return redirect('http://example.com/')

    默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:

    def my_view(request):
        ...
        object = MyModel.objects.get(...)
        return redirect(object, permanent=True)  
  • 相关阅读:
    2017上半年技术文章集合【Android】—184篇文章分类汇总
    一个高仿闲鱼键自定义数字键盘特效
    Android智能下拉刷新加载框架—看这些就够了
    深入了解Android蓝牙Bluetooth——《进阶篇》
    with和爬虫基础
    数据类型
    变量及注释
    计算机基础知识
    Markdown使用
    3732: Network
  • 原文地址:https://www.cnblogs.com/SR-Program/p/11537629.html
Copyright © 2020-2023  润新知