• Django之视图层


    目录

    一、三板斧的使用

    二、JsonReponse序列化类的使用

    三、 form表单上传文件

    数据准备

    数据处理

    (1)post请求数据

    (2)文件数据获取

    四、 FBV与CBV

    五、CBV的源码分析

    as_view 方法


    一、三板斧的使用

    • HttpResponse
      • 返回字符串类型
    • render
      • 渲染html页面,并且在返回给浏览器之前还可以给html页面传值
    • redirect
      • 重定向页面

    在视图文件中写视图函数的时候不能没有返回值了,默认返回的是None,页面上就会报错

    1. def render(request, template_name, context=None, content_type=None, status=None, using=None):
    2. content = loader.render_to_string(template_name, context, request, using=using)
    3. return HttpResponse(content, content_type, status)

    二、JsonReponse序列化类的使用

    json格式的数据:{"a":1}
    json有什么用:跨语言传输

    序列化:json.dumps
    反序列化:json.loads

    1. from django.http import JsonResponse
    2. def index(request):
    3. # user_dict = {'username':'kevin你好'}
    4. user_dict = [1, 2, 3, 4]
    5. # res = json.dumps(user_dict,ensure_ascii=False)
    6. # return HttpResponse(res)
    7. # return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
    8. return JsonResponse(user_dict,safe=False)
    9. # return render(request,'index.html')

    三、 form表单上传文件

    "" method="post" enctype="multipart/form-data">

    form表单上传数据需要满足的条件:

    1. 请求方式必须是post
    2. enctype参数必须指定成 form-data 类型

    数据准备

    • 路由
    1. # form 表单上传 下载文件
    2. url('^ab_file/',views.ab_file),
    • 前端 
    1. "" method="post" enctype="multipart/form-data" class="form form-control">
    2. username:<input type="text" name="username" class="form-control">

    3. file:<input type="file" name="file" class="form-control">

    4. <input type="submit">

    数据处理

    (1)post请求数据
    1. def ab_file(request):
    2. if request.method == 'POST':
    3. # 只能获取到普通的文本数据,无法获取到文件数据
    4. print(request.POST)
    5. return render(request, 'file.html')
    'username': ['dream']}>
    • 通过这种方式,我们只能获取到我们输入的文本数据,而拿不到我们想要的文件数据
    (2)文件数据获取
    1. def ab_file(request):
    2. if request.method == 'POST':
    3. # 获取文件数据
    4. print(request.FILES) # ]}>
    5. # 提取文件数据 - 文件对象
    6. file_obj = request.FILES.get('file')
    7. # 提取文件名字 file_obj.name
    8. with open(file_obj.name, 'wb') as f:
    9. # 逐行读取文件数据
    10. # 官方推荐 加上 chunks 方法 等价于 一行行获取
    11. for line in file_obj.chunks():
    12. f.write(line)
    13. return render(request, 'file.html')
    'file': []}>

    四、 FBV与CBV

    FBV:function based view -----》写的都是函数

    CBV:class based view    -----》写的都是类

    CBV视图

    1. from django.views import View
    2. class MyLogin(View):
    3. def get(self, request):
    4. print('get...')
    5. return HttpResponse("get")
    6. def post(self, request):
    7. return HttpResponse("hello postman!!!")
    8. url(r'^login/', views.MyLogin.as_view()),

    MBV和CBV各有各的特点,都有应用

    • CBV特点
      • 能够直接根据请求方式的不同直接匹配到对应的方法执行

    五、CBV的源码分析

    as_view 方法

    路由对应函数内存地址:

    url(r'^login/', views.MyLogin.as_view()),

    方法/函数名 加 括号 执行优先级最高

    • View类中得as_view方法的返回值是view函数名
    • 当请求来的时候,会触发view函数的执行
    1. def view(request, *args, **kwargs):
    2. # cls:Mylogin()------>self对象
    3. self = cls(**initkwargs)
    4. return self.dispatch(request, *args, **kwargs) # View类里的dispatch
    5. def dispatch(self, request, *args, **kwargs):
    6. if request.method.lower() in self.http_method_names:
    7. handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    8. else:
    9. handler = self.http_method_not_allowed
    10. return handler(request, *args, **kwargs)
    11. from django.views import View
    12. class MyLogin(View):
    13. http_method_names = ['get', 'post']
    14. def get(self, request):
    15. print('get...')
    16. self.index()
    17. return HttpResponse("get")
    18. def post(self, request):
    19. return HttpResponse("hello postman!!!")
    20. def index(self):
    21. pass

    小结

    url(r'^login/', views.MyLogin.as_view()),
    • 当我们启动Django项目时
    • 会自动触发路由中的方法,调用 as_view 方法并自执行
    • 在执行后我们查看 as_view 方法的源码 发现
      • 在依次给我们的对象赋值后,最终返回了一个自执行的 dispatch 方法
    • 于是我们又去查看了 dispatch 方法
      • 在 dispatch 内部 ,先是将请求方式转换并进行校验
      • 然后开始校验需要调用的方法的调用位置,校验成功并拿到需要执行的方法执行
    • 在自己写的类中如果有相关的方法,会首先调用我们重写的类方法,并返回执行结果
      • 如果自己的类里面没有该方法 会去自己的父类中调用 父类的方法
        • 如果父类 以及 基类 都找不到则报错,抛出异常
  • 相关阅读:
    简单中继实验
    冷知识:unity使用的是左手坐标系
    第2章-数据处理-2.3-数据清洗
    Google Authenticator 和gitlab使用的方法配置Google AuthenticatorGoogle
    java毕业设计房屋租赁平台(附源码、数据库)
    海外代购系统/代购网站怎么搭建——源码解析
    零基础自学javase黑马课程第三天
    36 | SRE的工作职责
    14.0、C语言——数据存储(2)
    干洗店收银系统、上门洗鞋小程序,干洗店会员管理系统
  • 原文地址:https://blog.csdn.net/qq_53842456/article/details/134398977