zoukankan      html  css  js  c++  java
  • python 之 Django框架(Django框架简介、视图装饰器、request对象、Response对象)

    12.33 Django框架简介:

    MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点

    Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。

    Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。

       Model(模型):负责业务对象与数据库的对象(ORM)
       Template(模版):负责如何把页面展示给用户
       View(视图):负责业务逻辑,并在适当的时候调用Model和Template

    此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

    12.34 View(视图)

    一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。

    响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。

    12.341 CBV(class base view)

    urls.py:

    url(r'^add_class/$', views.AddClass.as_view()),

    CBV版添加班级:

    from django.shortcuts import HttpResponse, render, redirect
    from django.views import View
    from app01 import models
    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/")
    12.342 视图装饰器

    装饰器装饰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
    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
    ​
    #@method_decorator(wrapper, name='post')        给post加方法装饰器
    #@method_decorator(wrapper, name='dispatch')    给dispatch方法加装饰器,相当于给类下所有方法加装饰器
    class AddClass(View):
        
        #http_method_names = ['get', ]                  #自定义可用的请求方法
    ​
        @method_decorator(wrapper)                      #给get方法加装饰器
        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时要注意:请求过来后会先执行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')
    12.342 request对象

    当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象,Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象

    path_info返回用户访问url的路径,不包括域名和参数:/music/bands/the_beatles/ 
    method 请求中使用的HTTP方法的字符串表示,全大写表示:"GET"、"POST"  
    GET 包含所有HTTP GET参数的类字典对象  
    POST 包含所有HTTP POST参数的类字典对象  
    body 请求体,byte类型 request.POST的数据就是从body里面提取到的  
    get_full_path() 返回URL中的路径和参数:/music/bands/the_beatles/?print=true  
    12.343 上传文件示例

    如果有上传文件,html文件中的form表单一定要加 enctype="multipart/form-data"

    upload_demo.html:

    <body>
    <h1>Django 上传文件示例</h1>
    <form action="/upload/" method="post" enctype="multipart/form-data">
        <input type="text" name="username">
        <input type="file" name="touxiang">
        <input type="submit" value="提交">
    </form>
    </body>

    如果有上传文件,views.py中应该从request.FILES中取上传的文件对象

    服务端接收文件:views.py

    from django.shortcuts import render, HttpResponse
    from django.http import JsonResponse
    def upload(request):
        if request.method == "POST":
            #print(request.POST)                    #只能拿到字典里的文件名
            #print(request.FILES)                   #拿到含有文件对象的字典
            file_obj = request.FILES.get("touxiang")  #得到文件对象
            #print(file_obj, type(file_obj))
            file_name = file_obj.name                # 拿到文件名
            with open(file_name, "wb") as f:
                for line in file_obj.chunks():       # 从上传的文件对象中一点一点读取数据
                    f.write(line)                   # 写到新建的文件中
            return HttpResponse("OK")
        return render(request, "upload_demo.html")
    12.344 Response对象

    每个视图都需要实例化,填充和返回一个HttpResponse,本质上render,redirect也是返回了HttpResponse对象

    HttpResponse.content:响应内容 HttpResponse.charset:响应内容的编码 HttpResponse.status_code:响应的状态码

    JsonResponse对象:JsonResponse是HttpResponse的子类,Django封装的一个专门用来返回JSON格式数据的方法

    from django.http.response import JsonResponse
    def get_json_data(request):
        data = {"name": "Egon", "hobby": "喊麦"}
        # import json
        # return HttpResponse(json.dumps(data),content_type='application/json') 
        #设置content_type,浏览器会自动反序列化json
        <-等同于->
        # ret = HttpResponse(json.dumps(data))
        # ret['Content-type'] = 'application/json'
        # return ret
        return JsonResponse(data)
    ​
        #return JsonResponse([1, 2, 3, 4], safe=False)
        #JsonResponse默认只能传递字典类型,如果要传递非字典类型需要设置safe参数
  • 相关阅读:
    jqGrid api 中文说明
    jsp + js + 前端弹出框
    js中关于带数字类型参数传参丢失首位数字0问题
    java中WGS84坐标(ios)转换BD-09坐标(百度坐标)
    Java中的“浅复制”与“深复制”
    Git错误:error:failed to push some refs to 'git@gitee.com:name/project.git'
    git操作教程
    线程调度及进程调度
    同步锁Lock
    多线程案例
  • 原文地址:https://www.cnblogs.com/mylu/p/11437344.html
Copyright © 2011-2022 走看看