django_day03

Django的view(视图)

  1. CBV和FBV

    1. FBV:function based view 基于函数的视图

    2. CBV:class based view 基于类的视图

      1. from django.views import View
      2. class Xxx():
      3. def get(self,request):
      4. #专门处理get请求
      5. return response
      6. def post(self,request):
      7. #专门处理post请求
      8. return response
      1. url(r'xx/',Xxx.as_view())
      1. class PublisherAdd(View):
      2. def get(self,request):
      3. print("get请求被执行")
      4. #处理get请求
      5. return render(request, 'publisher_add.html')
      6. def post(self,request):
      7. print("post请求被执行")
      8. #处理post请求
      9. pub_name = request.POST.get('pub_name')
      10. #print(pub_name)
      11. if not pub_name:
      12. # 输入为空
      13. return render(request, 'publisher_add.html', {'error': '不能为空!!'})
      14. if models.Publisher.objects.filter(name=pub_name):
      15. return render(request, 'publisher_add.html', {'error': '已存在!'})
      16. ret = models.Publisher.objects.create(name=pub_name)
      17. #print(ret, type(ret))
      18. return redirect('/publisher_list/')
      1. urlpatterns = [
      2. url(r'^publisher_add/', views.PublisherAdd.as_view()),
      3. ]

      as_view流程

      1. 项目运行时加载urls.py的文件 执行类as_view方法

      2. as_view()执行后 内部定义了一个view函数 并且返回

      3. 请求到来的时候,执行view函数:

        1. 实例化类--》self

        2. self.request = request

        3. 执行self.dispatch(request, *args, **kwargs)的方法

          1. 判断请求方式是否被允许

            1. 允许:

              通过反射获取请求方式对应的请求方法 ——》 handler

              获取不到 self.http_method_not_allowed ——》 handler

            2. 不允许:

              self.http_method_not_allowed ——》 handler

          2. 执行handler,返回结果

      1. from functools import wraps
      2. def timer(func):
      3. @wraps(func)#不加的话获取的方法一直时inner wraps原理
      4. def inner(request, *args, **kwargs):
      5. start = time.time()
      6. ret = func(request, *args, **kwargs)
      7. print('执行的时间是:{}'.format(time.time() - start))
      8. return ret
      9. return inner

      FBV

      直接加在函数上就行

      CBV加装饰器:

      需要使用一个装饰器

      1. from django.utils.decorators import method_decorator
      1. 加在方法上

        1. @method_decorator(timer)
        2. def get(self, request):
      2. 加在dispatch方法上

        1. @method_decorator(timer)
        2. def dispatch(self, request, *args, **kwargs):
        3. # 之前的操作
        4. ret = super().dispatch(request, *args, **kwargs) # 执行View中的dispatch方法
        5. # 之后的操作
        6. return ret3
        7. @method_decorator(timer,name='dispatch')
        8. class PublisherAdd(View):
      3. 加在类上

        1. @method_decorator(timer,name='post')
        2. @method_decorator(timer,name='get')
        3. class PublisherAdd(View):

      request

      1. request.method 请求方法 GET POST
      2. request.GET URL上携带的参数 ?k1=v1&k2=v2 { }
      3. request.POST post请求提交的数据 {} 编码方式是URLencode
      4. request.path_info 路径信息 不包含IP和端口 也不包含参数
      5. request.body 请求体 bytes类型 #post请求才有 数据
      6. request.COOKIES cookie
      7. request.session session
      8. request.FILES 长传的文件
      9. request.META 头的信息 小写——》大写 HTTP_ 开头 - ——》 _
      10. request.get_full_path() 完整的路径信息 不包含IP和端口 包含参数
      11. request.is_ajax() 请求是否是ajax请求

      response

      1. from django.shortcuts import render, HttpResponse, redirect
      2. HttpResponse('字符串') # 返回字符串
      3. render(request,'模板的文件名',{'k1':v1}) # 返回一个HTML页面
      4. redirect('地址') # 重定向 Location:‘地址’ 301 302
      1. from django.http.response import JsonResponse
      2. JsonResponse({'k1':'v1'})
      3. JsonResponse(data,safe=False)

      上传文件

      urls.py

      1. url(r'^upload/', views.Upload.as_view()),

      视图:

      1. class Upload(View):
      2. def get(self, request):
      3. return render(request, 'upload.html')
      4. def post(self, request):
      5. file = request.FILES.get('f1')
      6. with open(file.name, 'wb') as f:
      7. for i in file:
      8. f.write(i)
      9. return HttpResponse('ok')

      upload.html

      1. <form action="" method="post" enctype="multipart/form-data">
      2. {% csrf_token %}
      3. <input type="file" name="f1">
      4. <button>上传</button>
      5. </form>

django_day03的更多相关文章

随机推荐

  1. 关于Vue的几个实用知识点(持续更新中……)

    前言 排名不分先后,按自己习惯来的. 一.provide.inject 高级组件 总述: provide在父组件中定义,inject 在子孙组件中定义. provide:选项应该是一个对象或返回一个对 ...

  2. python小题目练习(13)

    题目:封装用户的上网行为 实现代码: """Author:mllContent:封装用户的上网行为Date:2020-01-19"""def ...

  3. Java方法读取文件内容

    一.针对文件内容的读取,在平时的工作中想必是避免不了的操作,现在我将自己如何用java方法读取文件中内容总结如下:废话不多说,直接上代码: 1 public static void main(Stri ...

  4. 【Python】和【Jupyter notebook】的正确安装方式?

    学了那么久Python,你的Python安装方式正确吗?今天给你看看什么才是Python正确的安装方式,教程放在下面了,喜欢的记得点赞. Python安装 Python解答Q群:660193417## ...

  5. python写个前端,这不是轻轻松松~

    前端除了用js++css+html,还有没有其它办法?其实python也可以 1. 安装与基本流程 Python学习交流Q群:660193417### 安装 PyWebIO 和其他的第三方库一样使用p ...

  6. Lua5.4源码剖析:二. 详解String数据结构及操作算法

    概述 lua字符串通过操作算法和内存管理,有以下优点: 节省内存. 字符串比较效率高.(比较哈希值) 问题: 相同的字符串共享同一份内存么? 相同的长字符串一定不共享同一份内存么? lua字符串如何管 ...

  7. React key究竟有什么作用?深入源码不背概念,五个问题刷新你对于key的认知

    壹 ❀ 引 我在[react]什么是fiber?fiber解决了什么问题?从源码角度深入了解fiber运行机制与diff执行一文中介绍了react对于fiber处理的协调与提交两个阶段,而在介绍协调时 ...

  8. ajax03_跨域访问问题

    ajax跨域访问问题 什么是跨域访问 从一个域名去访问另一个域名的资源 或者从一个站点去访问另一个站点的资源 哪些请求方式可以发送跨域请求 超链接 form表单 传统js代码 javascript标签 ...

  9. 图文并茂演示小程序movable-view的可移动范围

    前言 开发过小程序的同学可能对这两个内置组件并不陌生,他们配合用来实现在页面中可以拖拽滑动,其中: movable-area表示元素可移动的区域,它决定元素移动的区域范围 movable-view表示 ...

  10. WPF 实现用户头像选择器

    制作一个用户头像选择器仿 WeGame 制作一个用户头像选择Canvas为父控件所实现,展示图片使用Image,Path当作上方的蒙版; Canvas:主要用途方便移动Image,设置ClipToBo ...