django_day03

Django的view(视图)

  1. CBV和FBV

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

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

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

      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,返回结果

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

      FBV

      直接加在函数上就行

      CBV加装饰器:

      需要使用一个装饰器

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

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

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

        @method_decorator(timer,name='post')
        @method_decorator(timer,name='get')
        class PublisherAdd(View):

      request

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

      response

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

      上传文件

      urls.py

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

      视图:

      class Upload(View):
      
          def get(self, request):
      return render(request, 'upload.html')
      def post(self, request):
      file = request.FILES.get('f1')
      with open(file.name, 'wb') as f:
      for i in file:
      f.write(i)
      return HttpResponse('ok')

      upload.html

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

django_day03的更多相关文章

随机推荐

  1. 领导:谁再用redis过期监听实现关闭订单,立马滚蛋!

    日前拜读阿牛老师的大作 领导:谁再用定时任务实现关闭订单,立马滚蛋! 发现其方案有若干瑕疵,特此抛砖引玉讨论一二. 在电商.支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时 ...

  2. zabbix实时监控mysql业务数据

    1. 安装zabbix agent 下载zabbix:过往的软件包都有:https://sourceforge.mirrorservice.org/z/za/zabbix/ZABBIX%20Lates ...

  3. svn提交报错Unexpected HTTP status 413 'Request Entity Too Large' on

    问题原因:nginx的client_max_body_size设置过小,默认 1M,如果请求的正文数据大于client_max_body_size,HTTP协议会报错 413 Request Enti ...

  4. Integer.MAX_VALUE 和 Integer.MIN_VALUE

    在源码中可以看出其对应的值 Integer.MAX_VALUE是2^31 -1 = 2147483647 Integer.MIN_VALUE是-2^31 =  -2147483648

  5. 52 条 SQL 语句性能优化策略,建议收藏

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...

  6. CesiumJS 2022^ 源码解读[0] - 文章目录与源码工程结构

    很高兴你能在浮躁的年代里还有兴趣阅读源代码,CesiumJS 至今已有十年以上,代码量也积累了三十多万行(未压缩状态). 我也很荣幸自己的文章能被读者看到,如果对你有帮助.有启发,点个赞就是对我最大的 ...

  7. 蒸腾量与蒸散量(ET)数据、潜在蒸散量、实际蒸散量数据、气温数据、降雨量数据

    ​   数据下载链接:数据下载链接 引言 多种卫星遥感数据反演地表蒸腾与蒸散率(ET)产品是地理遥感生态网推出的生态环境类数据产品之一,产品包括2000-2009年三个波段RGB数据,值域0-252之 ...

  8. DBPack 读写分离功能发布公告

    在 v0.1.0 版本我们发布了分布式事务功能,并提供了读写分离功能预览.在 v0.2.0 这个版本,我们加入了通过 UseDB hint 自定义查询请求路由的功能,并修复了一些 bug.另外,在这个 ...

  9. 5-21 拦截器 Interceptor

    Spring MVC拦截器 什么是拦截器 拦截器是SpringMvc框架提供的功能 它可以在控制器方法运行之前或运行之后(还有其它特殊时机)对请求进行处理或加工的特定接口 常见面试题:过滤器和拦截器的 ...

  10. day01 Java_基础

    1.类型 int:整数 long:长整数 double:浮点数 char:字符型--单引号只能有一个 boolean:布尔型--真假 string : 字符串--双引号,可以0-多个 2.算数运算符: ...